Game Programming Patterns / Паттерны программирования в играх: 1.3. Observer
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Усвойте урок: необходимо очень ответственно подходить к разрыву связей между объектами. RSlafka 03.06.14 в 07:02 |
|
|
Как доказательство важности этой проблемы: о ней есть статья в Википедии (http://en.wikipedia.org/wiki/Lapsed_listener_problem) RSlafka 03.06.14 в 07:09 |
||
|
Что происходит? RSlafka 03.06.14 в 07:09 |
||
|
Другая, более глубокая проблема паттерна Наблюдатель вытекает из его прямого назначения. RSlafka 03.06.14 в 07:12 |
||
|
Мы используем его, потому что он помогает ослабить связь между двумя частями кода. RSlafka 03.06.14 в 07:17 |
||
|
Он позволяет субъекту неявно взаимодействовать с каким-нибудь наблюдателем, без статической привязки к нему. RSlafka 03.06.14 в 07:22 |
||
|
Если задуматься о поведение субъекта - это окажется реальным достижением, что все эти раздражающие нахлебники будут отделены. GromHoll 13.06.14 в 22:14 |
||
|
Когда вы ковыряетесь в физическом движке, вы действительно не хотите, что бы ваш редактор (и разум) был загромождён кучей вещей связанных с достижениями. GromHoll 13.06.14 в 22:11 |
||
|
С другой стороны, если ваша программа не работает и баг закрался в цепочку наблюдателей, размышлять о последовательности связей будет куда сложнее. GromHoll 13.06.14 в 22:19 |
||
|
Используя явную связь, куда проще найти вызываемый метод. GromHoll 13.06.14 в 22:21 |
||
|
Детская забава для вашей IDE, если связи статические. GromHoll 13.06.14 в 22:23 |
||
|
Но если связывание происходит через список наблюдателей, единственный способ понять, кто будет получать уведомление - проверить список наблюдателей во время работы программы. GromHoll 13.06.14 в 22:26 |
||
|
Вместо того, чтобы в статическом случае рассуждать о структуре взаимодействия, вам придётся думать о её динамическом поведение. GromHoll 13.06.14 в 22:32 |
||
|
Моё руководство как поступить с этим очень просто. GromHoll 13.06.14 в 22:34 |
||
|
Если вам приходиться часто думать о взаимодействии обеих сторон, что бы разобраться в участке программы - не используйте шаблон "Наблюдатель" для описания подобной связи. GromHoll 13.06.14 в 22:38 |
||
|
Предпочитаю что-то более конкретное. GONGOTA 07.06.14 в 15:02 Предпочтите что-то более явное. GromHoll 13.06.14 в 22:39 |
||
|
При разработке большой программой, Вы, скорее всего, разделяете её на отдельные куски, которые работают вместе. GromHoll 13.06.14 в 22:53 |
||
|
Мы имеем множество терминов для этого: "распределение обязанностей", "связность и связанность", "модульность". Но всё сводится к одному - "эти штуки работают вместе, и не касаются вот этих штук". GromHoll 13.06.14 в 22:49 |
||
|
Шаблон "Наблюдатель" отличный способ, чтобы несвязанные части общались между собой, без превращения всего в один огромный комок. GromHoll 13.06.14 в 23:00 |
||
|
Он не так полезен в одной части кода, отвечающей за единый функциональный аспект. GromHoll 13.06.14 в 23:01 |
||
|
Вот почему он уместен в нашем примере: достижения и физика почти полностью независимые области, скорее всего, разрабатываемые разными людьми. GromHoll 13.06.14 в 23:04 |
||
|
Мы хотим минимизировать взаимодействие между ними таким образом, что бы работа каждой из них не требовала много знаний о другой. GromHoll 13.06.14 в 23:06 |
||
|
"Наблюдатели" сегодня GromHoll 13.06.14 в 23:06 |
||
|
Шаблоны проектирования берут свое начало в 90х. GONGOTA 07.06.14 в 14:52 |
||
|
Тогда объектно-ориентированное программирование было устойчивой парадигмой. GONGOTA 07.06.14 в 14:54 Тогда объектно-ориентированное программирование было в тренде. GromHoll 13.06.14 в 23:10 |
||
|
Каждый программист на замле хотел "Выучить ООП за 30 дней" и мидл-менеджеры платили им в зависимости от того, сколько классов они создадут. GONGOTA 07.06.14 в 14:55 Каждый программист на Земле мечтал "Выучить ООП за 30 дней", а менеджеры платили им исходя их количества написанных классов. GromHoll 13.06.14 в 23:13 |
||
|
Инженеры оценивали свое мастерство по глубине их наследственных иерархий. GONGOTA 07.06.14 в 14:59 |
||
|
В этом же году, у Ace of Base был не один сингл,а целых 3 хита, думаю это что-то скажет вам о наших вкусах и взглядах на тот момент. GONGOTA 07.06.14 в 15:01 В тот же год у Ace of Base вышло аж целых 3 хита. Думаю, это что-то да говорит о наших вкусах и взглядах на тот момент. GromHoll 13.06.14 в 23:16 |
||
|
Шаблон "Наблюдатель" получил популярность в духе того времени, так что не удивительно, что он достаточно сложен. GromHoll 13.06.14 в 23:22 |
||
|
Но современные программисты чувствуют себя более комфортно, используя функциональное программирование. GromHoll 13.06.14 в 23:23 |
||
|
Реализовывать весь интерфейс только ради получения уведомлений не соответствует нынешней эстетике. GromHoll 13.06.14 в 23:26 |
||
|
Это выглядит тяжеловесно и косно. GromHoll 13.06.14 в 23:27 |
||
|
Это действительно тяжеловесно и косно! GromHoll 13.06.14 в 23:28 |
||
|
Например, вы не можете иметь один класс, использующий разные методы обработки уведомлений для разных субъектов. GromHoll 13.06.14 в 23:30 |
||
|
Поэтому субъект передаёт себя наблюдателю. GromHoll 13.06.14 в 23:31 |
||
|
Так как наблюдатель имеет только один метод для обработки уведомлений, если он наблюдает за несколькими субъектами, он должен быть в состоянии определить какой из них вызвал его. GromHoll 13.06.14 в 23:33 |
||
|
Более современный подход к "Наблюдателю" это просто ссылка на метод или функцию. GromHoll 13.06.14 в 23:33 |
||
|
В языках с функциями первого класса, и в особенности с замыканиями, это более распространённый вариант реализации наблюдателя. GromHoll 13.06.14 в 23:36 |
||
|
В наши дни практически в каждом языке есть функция замыкания. GONGOTA 07.06.14 в 14:49 В наши дни практически в каждом языке есть замыкания. GromHoll 13.06.14 в 23:36 |
||
|
C++ преодолел проблему замыканий в языках без сборщика мусора, и даже Java наконец-то урегулировала всё и ввела их в JDK8. GromHoll 13.06.14 в 23:38 |
||
|
К примеру, в C# есть "события" вшитые в язык. GONGOTA 07.06.14 в 14:45 |
||
|
При этом, наблюдатель регистрируется как "делегат", что в терминах языка означает ссылку на метод. GromHoll 13.06.14 в 23:40 |
||
|
В системе сообщений JavaScript, наблюдателем могут быть объекты, поддерживающие специальный протокол EventListener, или же просто функции. GromHoll 13.06.14 в 23:42 |
||
|
Люди почти всегда используют последний вариант. GromHoll 13.06.14 в 23:43 |
||
|
Если бы я проектировал "Наблюдателя" сегодня, я бы сделал его основанным на функциях, а не на классах. GromHoll 13.06.14 в 23:44 |
||
|
Даже в C++, я бы стремился к системе, которая позволяет регистрировать указатели на функции как наблюдателя вместо экземпляра некого интерфейса Наблюдателя. GromHoll 13.06.14 в 23:48 |
||
|
Вот интересный пост о способе реализовать это в C++. GromHoll 13.06.14 в 23:49 |
+1 | |
|
"Наблюдатели" завтра GromHoll 13.06.14 в 23:50 |
||
|
Системы событий и другие шаблоны, подобные "Наблюдателю", невероятно распространены в наши дни. GromHoll 13.06.14 в 23:51 |
||
|
Это избитый путь. GromHoll 13.06.14 в 23:53 |
