Лекция #14. Паттерны revisited. Введение. [Лектор - aruslan] (3 стр)
Автор: Арсений Капулкин
[01:34] <Cote-Duke> Есть мнение. UnrealScript - клон С++ (для программистов), но удобный.
[01:35] <aruslan> Есть мнение, что UnrealScript - это жёсткий геморрой и на нём пишут программисты. Причём некоторые - отказываются и переписывают всё нафик на своём языке. Сложный вопрос, но UnrealScript не содержит достаточного количества мощных примитивов.
[01:36] <aruslan> То есть я не хочу не войны, но если UnrealScript - это всё, что есть, тогда на нём и пишут, потому что больше не на чем.
[01:37] <aruslan> Скриптовые языки (и типично в проектах их несколько) должны решать вполне конкретные задачию
[01:37] <aruslan> То есть они должны предоставлять наружу очень простые и легко модифицируемые концепции.
[01:38] <aruslan> В скриптах должна быть очень хорошая диагностика и митигирование ошибок.
[01:38] <aruslan> И, конечно же, никаких new/delete и C++.
[01:39] <aruslan> Обычно пытаются уменьшить нагрузку на почву и использовать C#, Java, Python, Lua.
[01:39] <aruslan> То есть сравнительно универсальные языки.
[01:39] <aruslan> Очень хорошо для AI (которое всё равно пишут программисты), для _создания_ ползунков (т.е. программист пишет таки код, но ползунки выносит наружу).
[01:40] <aruslan> Уменьшается время разработки ценой небольших потерь в эффективности кода (терпимых вполне, особенно в Lua).
[01:41] <aruslan> Но не возникает переноса на другие специальности (впрочем, зарплаты скриптовикам можно ставить меньшие иногда).
[01:42] <aruslan> UnrealScript в этом смысле скорее оброс очень загадочными спецэффектами (бесконечные циклы, waitы, ретриггер ивентов etc).
[01:42] <aruslan> Что роднит его с C++ в плохом смысле этого слова. Но это моё имхо.
[01:42] <aruslan> Идеальный скрипт для непрограммистов - не скрипт вовсе.
[01:43] <aruslan> Применим в гуи, в шейдерах, в простых реакциях типа "наступил два раза на грабли - они и триггернули".
[01:43] <aruslan> Классика жанра - Quake Console. Вообще не скрипт.
[01:43] <aruslan> Маленькое улучшение - и появляется возможность неспециалисту написать вот такое:
[01:43] <aruslan> par {
[01:44] <aruslan> loop { set_color(red); wait(1); set_color(green); wait(1); }
[01:44] <aruslan> loop { interpolate_size( 0, 100.0, 1.5 ); interpolate_size( 100.0, 0, 1.5 ); }
[01:44] <aruslan> }
[01:45] <aruslan> для кнопочек и прочей гуйни решает вопросы красивостей легко и непринужденно.
[01:45] <aruslan> впрочем, экспорт из флэша - лучше %)
[01:45] <aruslan> -- собственно data driven
[01:45] <aruslan> про фазы я уже писал
[01:45] <aruslan> вот здесь http://www.gamedev.ru/community/oo_design/forum/?id=886&page=2#22
[01:46] <aruslan> "фазы" не следует понимать буквально - это не "фазы процесса", это просто такой анамнез.
[01:47] <aruslan> ( в предыдущем шмотке скрипта - "par" - это "исполнять в параллель то, что ниже", ниже - два цикла. )
[01:48] <aruslan> обычно по очереди включает все паттерны GoFа как паттерны, защищающие от распространения изменений
[01:48] <aruslan> код, конечно же, становится не очень читаемым, зато действительно много чего можно сделать снаружи.
[01:48] <aruslan> здесь важны следующие дзен-моменты в архитекторе.
[01:48] <aruslan> - имперсонификация.
[01:49] <aruslan> каждый ваш пук должен сопровождаться мыслями "я пукнул", "пук - это я", "я чувствую запах".
[01:49] <aruslan> то есть любая ассоциация - это и участники, и сама ассоциация, - и вы должны почувствовать это как человек.
[01:50] <aruslan> "я послал сообщение рендеру", "я и есть сообщение рендеру", "меня преобразовали в", "я получил какое-то странное сообщение"
[01:50] <aruslan> "я ошибка ДНК"
[01:50] <aruslan> имперсонификация - очень важный приём, который позволяет вам отождествить себя со всеми элементами системы.
[01:50] <aruslan> смысл - почувствовать себя в шкуре другого программиста.
[01:51] <aruslan> в реальной жизни к вам этот другой программист потом обязательно придёт и популярно отождествит в любом случае.
[01:51] <aruslan> поэтому лучше подготовиться заранее.
[01:51] <aruslan> ну и плюс НЕпрограммисты. учитесь работать с инструментом художников, смотрите, как работает, геймдизайнер.
[01:51] <aruslan> это совсем другая область.
[01:52] <aruslan> много ошибок делается просто потому, что люди не понимают, что художник не рисует сразу правильным цветом, грубо говоря.
[01:52] <aruslan> он раз пять пройдётся разными цветами, смешивая их друг с другом.
[01:53] <aruslan> поэтому интерфейс для геймдизайнера в стиле wizard - а теперь укажите защиту армора - это в ацтой сразу.
[01:53] <aruslan> генерация ползунков - один из типовых моментов data driven.
[01:54] <aruslan> возвращаясь к "сериализации" - в сериализации главное - схема, чтобы потом другие тулзы могли ползунки нарисовать.
[01:54] <aruslan> в общем, не забывайте о людях.
[01:55] <aruslan> - "посмотри вокруг" - базовая техника архитектора. паттерны - везде.
[01:55] <aruslan> объяснять, думаю, не надо. посмотрите, как работает бизнес. везде одно и то же. половина паттернов пришла из жизни.
[01:55] <aruslan> - собственно C++ и паттерны для data driven.
[01:55] <aruslan> . Реализация
[01:56] <aruslan> Здесь важно понимать, что архитектор, не пишущий код, не может быть архитектором.
[01:56] <aruslan> С другой стороны, основное количество кода и его поддержкой будут заниматься другие люди.
[01:56] <aruslan> Поэтому чем чётче вы выражаете мысли - тем лучше.
[01:57] <aruslan> В идеале - вы должны назубок знать паттерны, чтобы помогать человеку в реализации.
[01:57] <aruslan> Рассмотрим, например, resource и asset management.
[01:57] <aruslan> Во-первых, это разные вещи - resource и asset.
[01:58] <aruslan> Это не то, чтобы сильно важно, но если мы говорим о ясных мыслях - то вещи разные.
[01:58] <aruslan> Есть широкоизвестные паттерны управления ресурсами.
[01:59] <aruslan> Caching, pooling, prefetching (eager acquisition), streaming, partial и lazy acquisition, leasing, lookup, coordinator, evictor.
[02:00] <aruslan> БОльшую часть из них вы применяли, вопрос только, для чего.
[02:00] <aruslan> Например, caching и pooling - часто путают.
[02:01] <aruslan> (asset - это единица управления контентом)
[02:01] <aruslan> (resource - это единица распределения (обычно ограниченных) ресурсов)
[02:01] <aruslan> (caching - это кэширование имеющий identity
[02:01] <aruslan> объектов)
[02:02] <aruslan> (pooling - это кэширование сырых (без identity) ресурсов)
[02:02] <aruslan> то есть можно иметь кэш текстур и пул потоков.
[02:05] <aruslan> -- compile time, С++ и data driven.
[02:05] <aruslan> C++ очень мощный язык.
[02:05] <aruslan> Очень плохо поэтому подходит для data driven %)
[02:06] <aruslan> То есть если вас одна штука - C++ вполне вменяемый язык, ему бы получше (читай - попроще) средства метапрограммирования и интеграции DSEL - и всё.
[02:06] <aruslan> Но это если вы всё пишете на C++ в количестве одна штука.
[02:06] <aruslan> Я уже пытался раскрыть тему потери ОО и перехода на мета-ОО вот здесь:
[02:07] <aruslan> http://www.gamedev.ru/community/oo_design/forum/?id=886#8
[02:15] <aruslan> кстати, вопрос.
[02:15] <aruslan> кто-нибудь читал POSA?
[02:16] <aruslan> можно в приват. да/нет, просто интересно.
[02:16] <aruslan> POSA, POSA-2, POSA-3, GoF, Booch.
[02:16] <aruslan> Patterns of Software Architecture.
[02:16] <Qiller> DSEL == DSL?
[02:16] <aruslan> Qiller - почти.
[02:16] <aruslan> DSEL = Domain Specific _Embedded_ Language.
[02:17] <aruslan> то есть par { loop - это DSL, а par[ loop[... - это C++ DSEL.
[02:26] <aruslan> -- сцылки на почитать.
[02:27] <aruslan> удивительно, но самые первые ссылки - самые правильные.
[02:27] <aruslan> http://www.gamedev.ru/community/oo_design/forum/?id=864 - пост Гвоздодёра.
[02:28] <aruslan> Принципы. Самые главные и основополагающие. И правильные, что особенно удивительно.
[02:28] <aruslan> То есть это надо прочесть и выучить наизусть. И постоянно думать о.
[02:28] <aruslan> http://c2.com/cgi/wiki?PrinciplesOfObjectOrientedDesign - это оно же
[02:29] <aruslan> Книжки.
[02:29] <aruslan> Pattern-Oriented Software Architecture. POSA.
[02:29] <aruslan> Том I. A System of Patterns. (там отварищ Бушманн отметился).
[02:30] <aruslan> Том II. Patterns for Concurrent and Networked Objects. (Шмидт).
[02:30] <aruslan> Том III. Patterns for Resource Management.
[02:31] <aruslan> http://www.jcurley.com/software/design-patterns/design-patterns.html - вот отсюда можно практически всё найти.
[02:31] <aruslan> еще репозиторий на c2 и в wikipedia, конечно.
[02:32] <aruslan> Для дзена - читать про
[02:33] <aruslan> http://www.geocities.com/tablizer/oopbad.htm
[02:33] <aruslan> и http://www.smalltalk.ru/articles/oo-design.html
[02:34] <aruslan> у таблайзера - очень много, но есть очень внятные и конкретно правильные вещи.
[02:34] <aruslan> естественно, читать GoF.
[02:35] <aruslan> Если смелые - можно прочесть Large Scale C++ Design и Майера Object-Oriented Software Construction (OOSC).
19 февраля 2006
Комментарии [5]