Game Programming Patterns / Паттерны программирования в играх: 1.3. Observer

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Усвойте урок: необходимо очень ответственно подходить к разрыву связей между объектами.

RSlafka 03.06.14 в 07:02

0

Как доказательство важности этой проблемы: о ней есть статья в Википедии (http://en.wikipedia.org/wiki/Lapsed_listener_problem)

RSlafka 03.06.14 в 07:09

0

Что происходит?

RSlafka 03.06.14 в 07:09

0

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

RSlafka 03.06.14 в 07:12

0

Мы используем его, потому что он помогает ослабить связь между двумя частями кода.

RSlafka 03.06.14 в 07:17

0

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

RSlafka 03.06.14 в 07:22

0

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

GromHoll 13.06.14 в 22:14

0

Когда вы ковыряетесь в физическом движке, вы действительно не хотите, что бы ваш редактор (и разум) был загромождён кучей вещей связанных с достижениями.

GromHoll 13.06.14 в 22:11

0

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

GromHoll 13.06.14 в 22:19

0

Используя явную связь, куда проще найти вызываемый метод.

GromHoll 13.06.14 в 22:21

0

Детская забава для вашей IDE, если связи статические.

GromHoll 13.06.14 в 22:23

0

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

GromHoll 13.06.14 в 22:26

0

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

GromHoll 13.06.14 в 22:32

0

Моё руководство как поступить с этим очень просто.

GromHoll 13.06.14 в 22:34

0

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

GromHoll 13.06.14 в 22:38

0

Предпочитаю что-то более конкретное.

GONGOTA 07.06.14 в 15:02

0

Предпочтите что-то более явное.

GromHoll 13.06.14 в 22:39

0

При разработке большой программой, Вы, скорее всего, разделяете её на отдельные куски, которые работают вместе.

GromHoll 13.06.14 в 22:53

0

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

GromHoll 13.06.14 в 22:49

0

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

GromHoll 13.06.14 в 23:00

0

Он не так полезен в одной части кода, отвечающей за единый функциональный аспект.

GromHoll 13.06.14 в 23:01

0

Вот почему он уместен в нашем примере: достижения и физика почти полностью независимые области, скорее всего, разрабатываемые разными людьми.

GromHoll 13.06.14 в 23:04

0

Мы хотим минимизировать взаимодействие между ними таким образом, что бы работа каждой из них не требовала много знаний о другой.

GromHoll 13.06.14 в 23:06

0

"Наблюдатели" сегодня

GromHoll 13.06.14 в 23:06

0

Шаблоны проектирования берут свое начало в 90х.

GONGOTA 07.06.14 в 14:52

0

Тогда объектно-ориентированное программирование было устойчивой парадигмой.

GONGOTA 07.06.14 в 14:54

0

Тогда объектно-ориентированное программирование было в тренде.

GromHoll 13.06.14 в 23:10

0

Каждый программист на замле хотел "Выучить ООП за 30 дней" и мидл-менеджеры платили им в зависимости от того, сколько классов они создадут.

GONGOTA 07.06.14 в 14:55

0

Каждый программист на Земле мечтал "Выучить ООП за 30 дней", а менеджеры платили им исходя их количества написанных классов.

GromHoll 13.06.14 в 23:13

0

Инженеры оценивали свое мастерство по глубине их наследственных иерархий.

GONGOTA 07.06.14 в 14:59

0

В этом же году, у Ace of Base был не один сингл,а целых 3 хита, думаю это что-то скажет вам о наших вкусах и взглядах на тот момент.

GONGOTA 07.06.14 в 15:01

0

В тот же год у Ace of Base вышло аж целых 3 хита. Думаю, это что-то да говорит о наших вкусах и взглядах на тот момент.

GromHoll 13.06.14 в 23:16

0

Шаблон "Наблюдатель" получил популярность в духе того времени, так что не удивительно, что он достаточно сложен.

GromHoll 13.06.14 в 23:22

0

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

GromHoll 13.06.14 в 23:23

0

Реализовывать весь интерфейс только ради получения уведомлений не соответствует нынешней эстетике.

GromHoll 13.06.14 в 23:26

0

Это выглядит тяжеловесно и косно.

GromHoll 13.06.14 в 23:27

0

Это действительно тяжеловесно и косно!

GromHoll 13.06.14 в 23:28

0

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

GromHoll 13.06.14 в 23:30

0

Поэтому субъект передаёт себя наблюдателю.

GromHoll 13.06.14 в 23:31

0

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

GromHoll 13.06.14 в 23:33

0

Более современный подход к "Наблюдателю" это просто ссылка на метод или функцию.

GromHoll 13.06.14 в 23:33

0

В языках с функциями первого класса, и в особенности с замыканиями, это более распространённый вариант реализации наблюдателя.

GromHoll 13.06.14 в 23:36

0

В наши дни практически в каждом языке есть функция замыкания.

GONGOTA 07.06.14 в 14:49

0

В наши дни практически в каждом языке есть замыкания.

GromHoll 13.06.14 в 23:36

0

C++ преодолел проблему замыканий в языках без сборщика мусора, и даже Java наконец-то урегулировала всё и ввела их в JDK8.

GromHoll 13.06.14 в 23:38

0

К примеру, в C# есть "события" вшитые в язык.

GONGOTA 07.06.14 в 14:45

0

При этом, наблюдатель регистрируется как "делегат", что в терминах языка означает ссылку на метод.

GromHoll 13.06.14 в 23:40

0

В системе сообщений JavaScript, наблюдателем могут быть объекты, поддерживающие специальный протокол EventListener, или же просто функции.

GromHoll 13.06.14 в 23:42

0

Люди почти всегда используют последний вариант.

GromHoll 13.06.14 в 23:43

0

Если бы я проектировал "Наблюдателя" сегодня, я бы сделал его основанным на функциях, а не на классах.

GromHoll 13.06.14 в 23:44

0

Даже в C++, я бы стремился к системе, которая позволяет регистрировать указатели на функции как наблюдателя вместо экземпляра некого интерфейса Наблюдателя.

GromHoll 13.06.14 в 23:48

0

Вот интересный пост о способе реализовать это в C++.

GromHoll 13.06.14 в 23:49

0
+1

"Наблюдатели" завтра

GromHoll 13.06.14 в 23:50

0

Системы событий и другие шаблоны, подобные "Наблюдателю", невероятно распространены в наши дни.

GromHoll 13.06.14 в 23:51

0

Это избитый путь.

GromHoll 13.06.14 в 23:53

0
Минутку...

← Предыдущая страница

Следующая страница →