LINUX.ORG.RU

И вновь организация кода на js..

 , , , размышлений тред


1

2

Реализую вот следующую схемку, ищу слабые места.
Существуют обертки вокруг дом элеметов (я называю их виджеты (и где-то мы уже это проходили)) и существую обсерверы с глобальной видимостью (я называю их менеджеры).
В виджетах находится элементарный функционал визуализации (как добавление css классов). В менеджерах находится весь функционал касающийся инициализации виджетов, их добавления/удаления, доступа к виджетам (при необходимости). Как правило менеджер является коллекцией виджетов. Виджет не содержит конкретной реакции на события элементов, вместо этого виджет генерирует событие в менеджере, и помещая в него все что требуется (себя, дом элемент, дочерний виджет). Т.о. вся бизнес логика находится в менеджере. Одновременно с этим (ведь менеджер это обсервер), на эти события могут подписываться другие объекты (в первую очередь другие менеджеры).

Т.о. менеджеры взаимодействуют между собой (им это удобно, ведь они глобальны (причем, как правило, с помощью событий)), а виджеты взаимодействуют только со своим менеджером. Менеджеры могут не иметь виджетов, а, например, только получать данные от сервера и генерировать связанные с этим события.

В общем, я пробую эту схемку и мне нравится, то самое чувство как будто это то, что должно быть.

пс
я понимаю, что каждое первое сообщение будет отправкой к либе типа бигбон, но мало ли.

★★★★
Ответ на: комментарий от swwwfactory

На самом деле.. на самом деле у меня есть система инициализации менеджеров внутри менеджера (ибо после geoExt я НЕНАВИЖУ события типа applicationLoaded, applicationAlmostLoaded, applicationStarted, applicationPrestarted мля..) и я использую все изнутри (т.е. вообще без глобальных объектов), но это уже другая история..

special-k ★★★★
() автор топика
Ответ на: комментарий от special-k

Глобализма мало и дозировано на самом деле, лишь нцать объектов при такой схеме.

несколько режет слух обзЁрверы с глобальной видимостью. По сути наблюдатель это реализация концепции слабой связности и глобальность тут как-бы выпирает как пятое колесо. Главное в этом паттерне: есть субъект и его подписчики, выделять там глобально извращает рассылки смысл уведомлений. Можно напрямую тогда отправить. Понятно откуда это растет: тебе, мне кажется нужно добавить паттерн посредник, выступающий в роли наблюдателя,а уже к нему могут цепляться тем или иным способом его подписчики: либо это тоже наблюдатели, либо упрощенная схема в посреднике: все участники данной схемы знают о посреднике, который в свою очередь знает обо всех. Хотя в этом случае появляется лишнее звено.

Паттерн наблюдатель отличная вещь, но там есть некоторые неудобства, которые к сожалению просто так не обойти. Лучше паттерн наблюдатель чем отсутствие какого-либо порядка. Но так-как там есть цикл оповещения, а циклы трудоемкая вещь, иногда лучше сделать статический код, вместо цикла. Если конечно это уместно и/или возможно.

swwwfactory ★★
()
Ответ на: комментарий от swwwfactory

Т.е. ты предлагаешь вызывать методы у объекта, который будет сам выбирать кому их переадресовывать.. ну не знаю, это же надо каким-то образом прописывать.. помоему только лишний гемор и потеря производительности, в чем профиты?

К тому же, по сути менеджер это и есть такой объект, у которого нативные объекты (в конечном счете) вызывают единственный метод (fire), т.е. это и есть объект, который переадресует действия и делает это по средством паттерна обсервер.

На самом деле, везде, где есть обсервер, возникает проблема инициализации, т.е. ты хочешь подписаться на событие, а обсервер еще не готов, но эту проблему я решил создав систему инициализации. В общем-то единственная проблема, которая пока что возникала.

Хотя вру, еще не до конца решил, т.к. иногда требуются синхронные события даже на стадии инициализации..

special-k ★★★★
() автор топика
Последнее исправление: special-k (всего исправлений: 3)
Ответ на: комментарий от special-k

На самом деле, везде, где есть обсервер, возникает проблема инициализации, т.е. ты хочешь подписаться на событие, а обсервер еще не готов, но эту проблему я решил создав систему инициализации. В общем-то единственная проблема, которая пока что возникала.

это как раз не проблема: глобальность вот проблема.

Вообще известное полезное высказывание Линуса: примерно так: нужно думать не о коде, а о данных и структурах данных. Собственно не имеет значения готов наблюдатель или нет. Это опять-же смысл данного паттерна. Субъект сообщил, а дальше не его забота. Наблюдателя можно иницировать по событию... В событие можно передать всю необходимую информацию для инициализации.

Т.е. ты предлагаешь вызывать методы у объекта, который будет сам выбирать кому их переадресовывать.. ну не знаю, это же надо каким-то образом прописывать.. помоему только лишний гемор и потеря производительности, в чем профиты?

в общем-то да. Это еще требует проработки, но тогда глобальности нет.

Представь себе у тебя список прокрутки например и не один а 2+ пагинаторов. Как ты будешь при возникновении события на одном пагинаторе обновлять остальные без посредника?

swwwfactory ★★
()
Ответ на: комментарий от swwwfactory

В каком смысле глобальность проблема? А если поместить их в один глобальный объект это лучше?

Наблюдателя можно иницировать по событию...

Ну вот это и есть система инициализации. Нет, в реальность проблема есть, потому что хочется быть уверенным, что объекты подписаны, это часто рождает ступенчатую инициализацию (например init в linux).

Как ты будешь при возникновении события на одном пагинаторе обновлять остальные без посредника?

Но эти менеджеры и есть посредники, просто их не один, а, например, 10, но считанное небольшое число.

special-k ★★★★
() автор топика
Ответ на: комментарий от special-k

В каком смысле глобальность проблема? А если поместить их в один глобальный объект это лучше?

ну это вообще проблема - жесткая конструкция например, тема отдельной дискуссии. Так сразу и не ответишь. Глобальность это образ жизни такой :) Например cvs, svn глобальные системы, точнее централизованные, а гит распределенная система, более локальная - успешная очень система и простая и весьма гибкая. Хороший пример слабой связности. Нода и все тут...

в один когда ты помещаешь, то ты снижаешь уровень глобальности, как-бы на шаг приближаешь к локализации...

swwwfactory ★★
()
Ответ на: комментарий от special-k

по мне так инициализация лучше ступенчатая, хуками, типа с одного айдишника можно постепенно вытащить все дерево, если это конечно нужно.

В чем плохое ступенчатой инициализации? Есть разве альтернативы? Чем плох init linux - по моему он замечателен. Впрочем systemd это наверное и есть попытки избавиться от ступенчатой инициализации. Условно можно аналогию привести с механикой и авто- коробками передач. Хотя утрировал очень.

Модель «увещеваний» на фазе инициализации то-же неплоха, в некоторых фреймворках такое наблюдается. Но это родственно с более лучшим подходом FSM

swwwfactory ★★
()
Ответ на: комментарий от swwwfactory

В чем плохое ступенчатой инициализации?

В том что ты должен знать на какой ступени инициализирован обсервер на который ты хочешь подписаться. В том, что ты не уверен готов ли этот обсервер. Из-за этой неуверенности часто приходится делать проверки, готово то или это, подписано то или это. Т.е. приходится вызывать подписывание одних и тех же объектов в нескольких местах (в коде) с проверкой, а не было ли это уже произведено. Всегда возникнет необходимость сделать что-то между одним и вторым действием и придется делать костыли. Словом - все плохо.

разве альтернативы?

Я сделал такую альтернативу, когда каждый менеджер указывает какие менеджеры ему нужны (я прописываю ему это сначала конечно), и как только они подгружаются регистрирует события. Полностью асинхронная модель.

special-k ★★★★
() автор топика
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от swwwfactory

жесткая конструкция например

Они глобальны, но заменимы.. даже на лету..

Остается лишь событейное АПИ, а реализация не важна.

special-k ★★★★
() автор топика
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

как только они подгружаются регистрирует события

Как только каждый из них подгружается, регистрирует связанные с ним события. А теперь я хочу сделать чтобы после подгрузки конкретных 2-х, 3-х ... так же выполнялись события, и как раз сейчас я понял как я это сделаю ^_^

Это будет универсальная технология, т.е. например, можно будет регистрировать последовательное нажатие клавиш и т.п.

Кстати, что-то не вижу подобного рода решений.. они есть?

special-k ★★★★
() автор топика
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: комментарий от special-k

В том что ты должен знать на какой ступени инициализирован обсервер на который ты хочешь подписаться. В том, что ты не уверен готов ли этот обсервер.

это вообще не является проблемой - lvl, fsm, interface

Вообще мне кажется неправильная постановка вопроса: знать какая ступень чтобы подписаться. Это тоже последствия глобального образа мышления. Помню во времена СССР хотел подписаться на журнал «Зарубежное Военное Обозрение» - мне на почте сказали: мальчик, только для военных и только для офицеров... Вот это примерно так похоже - какое им дело? Если есть дело, то это уже более упоротая архитектура. Веб он весь stateless. Протоколы, REST и т.д. Там где очень хочется состояние, там идут другие извраты, но если принимать как модель stateless, то с этим гораздо проще, при соответствующей сноровке. Эрланг выпилен со своими легковесными процессами и асинхронностью за счет модели акторов, грубо говоря это те-же наблюдатели+передача сообщений, почтовые ящики процессов, receive, send. Без этих вещей что-либо сложно толковое реализовать. И заметьте нигде в этих делах не встречается ожидание состояние другого объекта в явном и концептуальном виде. Есть только грубо говоря receive|send

Рекомендую прочитать материалы по конкурентному программированию и ассинхронному в вообще и эрланге в частности и про модель акторов.

Подписчик подписывается и все, ибо он знает на что подписался, а готов кто-то или нет это уже третье дело. Рекомендую разобраться как устроена реализация DOMReady и в частности в jquery. Вообщем полезно держать под рукой гит-проект jquery, как образец не совсем плохого дизайна.

swwwfactory ★★
()
Последнее исправление: swwwfactory (всего исправлений: 1)
Ответ на: комментарий от special-k

Кстати, что-то не вижу подобного рода решений.. они есть?

по крайней мере были: любые событийные системы могут записывать собятия и проигрывать их как макросы, только проблема интервалы времени, но это решаемо.

tvision была такая либа - там легко все ивенты записать, потом проиграть...

swwwfactory ★★
()
Ответ на: комментарий от swwwfactory

Если есть дело, то это уже более упоротая архитектура.

Ну блин.. это реальность. Если были причины делать ступенчатую инициализацию, то всегда будет ситуация когда нужна будет еще ступенька между какими-то двумя.

Веб он весь stateless.

На самом деле это давно не так, и с м.т.з. несет здоровенный оверхед и не менее здоровенные костыли. Он по инерции stateless, но уже всюду рантайм.

нигде в этих делах не встречается ожидание состояние другого объекта

Да ладно состояние.. мне хотя бы существование.

конкурентному программированию и ассинхронному

Так или иначе, варианта ровно 2: предварительная инициализация и ленивая иницализация. И всевозможные сочетания этих двух.

special-k ★★★★
() автор топика
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: комментарий от special-k

На самом деле это давно не так, и с м.т.з. несет здоровенный оверхед. Он по инерции stateless, но уже всюдe рантайм.

основные протоколы веба, сетей, сокеты, все это stateless. Для работы в этой среде есть сеансы-сессии и FSM.

утомилсо - до связи

swwwfactory ★★
()
Ответ на: комментарий от special-k

Ну блин.. это реальность. Если были причины делать ступенчатую инициализацию, то всегда будет ситуация когда нужна будет еще ступенька между какими-то двумя.

Дык надо приоритеты делать цифрами, а когда закончатся целые - перейти на float :)

Vit ★★★★★
()
Ответ на: комментарий от special-k

Это будет универсальная технология, т.е. например, можно будет регистрировать последовательное нажатие клавиш и т.п.

Кстати, что-то не вижу подобного рода решений.. они есть?

FSM штоле?

Vit ★★★★★
()
Ответ на: комментарий от swwwfactory

основные протоколы веба, сетей, сокеты, все это stateless

Да как сказать.. по мне оно все statefull, и лишь условно stateless. И тот же erlang даже относительно системных процессов параллелен лишь понарошку, а относительно процессора вообще все вычисления идут друг за другом. Так что с м.т.з. все последовательно. Соответственно, если что-то кажется беспорядочным, значит оно, либо было упорядочено до, либо будет потом, либо с этим возникнут проблемы.

Говорят даже время течет дискретно..

special-k ★★★★
() автор топика
Ответ на: комментарий от Vit

Ну блин.. это не лучший вариант по-моему)
Да и все-таки это тред про js, сколько обсерверов с циферками есть?

special-k ★★★★
() автор топика
Последнее исправление: special-k (всего исправлений: 3)
Ответ на: комментарий от Vit

Видимо да, но я себе это представляю несколько иначе..(чем в jquery и https://github.com/kriskowal/q) не столь callback'hellьно.. более декларативно что ли - некое цельное решение. В базовой версии оно делает лишь малую часть того, что я хочу..

special-k ★★★★
() автор топика
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

более декларативно что ли - некое цельное решение

AngularJS is built around the belief that declarative programming should be used for building UIs and wiring software components, while imperative programming is excellent for expressing business logic. аминь.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от special-k

У меня медиатор с приоритетами, немного для другого, там нет строгой изоляции.

http://pastebin.com/tBYEVg8K

По жизни для большинства вещей хватает 2 приоритетов: before/after (+10/-10).

Vit ★★★★★
()
Ответ на: комментарий от special-k

ангуляр декларативен в описании ui и императивен в бизнес-логике, это его философия.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от special-k

AngularJS

Ничерта серьезного этой игрушкой не напишешь.

Ты что больной? Игрушки очень часто это то, что было до AngularJS. Наконец-то сделали нормальные компоненты, сервисы, модульность, IoC и тестирование. И твоим костылям до этого далеко. Иди читай доки

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 3)
Ответ на: комментарий от special-k

Просто ты переизобретаешь сейчас то, что достаточно просто сделать поверх ангуляра. Твои менеджеры - сервисы, ивенты между ними через скоупы есть, директивы для виджетов есть.

zz ★★★★
()
Ответ на: комментарий от Vit

fsm (конечный автомат) — абстрактный автомат без выходного потока, число возможных состояний которого конечно.

Promise-объект имеет ровно три состояния: pending (в ожидании), resolved (задача выполнена) или rejected (если задача завершилась ошибкой).

Ну только если мы говорим не о Flying Spaghetti Monster..)

special-k ★★★★
() автор топика
Ответ на: комментарий от vertexua

Что серьезного написано на ангуляре, можно узнать? гуглокарты, яндекс почта.. может вим для браузера, или офис, нет? Я так и думал :Р

special-k ★★★★
() автор топика
Ответ на: комментарий от zz

Я не могу серьезно относится к тому, что использует текстовые шаблоны на клиенте, меня это выводит из равновесия и скатывает под стол.. Только имея дело с dom объектами можно добиться чего-то путного.

special-k ★★★★
() автор топика

http://twitter.github.io/flight/ вот такая концепция мне понравилась. Крупные приложения на JS не пишу, а для мелких вполне годится.

outtaspace ★★★
()
Ответ на: комментарий от special-k

Только имея дело с dom объектами можно добиться чего-то путного.

html не предназначен для создания динамических интерфейсов и ручная возня в dom - это кровь и пот вокруг фатального недостатка.

ангуляр расширяет синтаксис и парадигму html, устраняя этот недостаток

VladimirMalyk ★★★★★
()
Ответ на: комментарий от special-k

Дом тормозит, к сожалению, олсо опять же директивами можно разрулить и свои дом шаблоны :)

zz ★★★★
()
Ответ на: комментарий от special-k

Вот они побежали все легаси переписывать. А сейчас на нем как раз single page пишутся очень часто. Ну еще Backbone/Knockout/Ember.

Но я тебе посоветовал как нужно делать, а ты можешь дальше костыли сам писать, я не против ни разу

vertexua ★★★★★
()
Ответ на: комментарий от special-k

Ангулар если что работает не с текстовыми шаблонами, а с DOM моделью

vertexua ★★★★★
()

Кстати, не смешите мои тапки, господа, тормозит не dom, тормозит ваша кривая реализация.

special-k ★★★★
() автор топика
Ответ на: комментарий от special-k

Ну если вдруг нет, то могу сказать что я видел очень большой проект на ангуляре, несколько десятков тысяч SLOC.

zz ★★★★
()
Ответ на: комментарий от special-k

Ну он объективно тормозит, если заморочиться он абсолютно почти не тормозит, но относительно создания ноды сразу из текста - он мегатормоз, особенно не в хромом а в более маргинальных браузерах.

zz ★★★★
()

смотри шире, и смотри в будущее: Directives are one of many features AngularJS provides and they anticipate the future W3C Web Components specification. (https://codebits.eu/intra/s/session/284)

http://www.w3.org/TR/2013/WD-components-intro-20130606/ - W3C Working Draft 6 June 2013

ребята только планируют это, в ангуляре это уже есть, а ты все ставишь DOM манипуляции во главу угла.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от zz

Мы обсуждаем современные приложения работающие в современных браузерах естественно.
Ноды можно создавать непосредственно. Я, честно говоря, с трудом вспоминаю узкие места. Js очень шустрый язык, и генерация элементов.. ну сколько тебе нужно элементов?

special-k ★★★★
() автор топика
Ответ на: комментарий от special-k

Я честно говоря не помню уже сколько всего было когда я почувствовал боль, думаю в раене рендера порядка 5-10k нод уже легко на глаз видеть тормоза. Firefox - современный браузер, но раза в два медленне рулит домом чем хром.

zz ★★★★
()
Ответ на: комментарий от special-k

Я знаю, что это такое. Я не понимаю, как это скрещивается в предлагаемой вундервафле.

Vit ★★★★★
()
Ответ на: комментарий от special-k

Могу дать, скажем, 2 килобакса за прямую реализацию, которая уберет на фонтелле тормоза при выбирании/развыделении нескольких тысяч глифов. Остальным предлагаю билеты на шоу.

Vit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.