3. Игровой объект с позиции ООПЖесткая иерархия объектовРазрабатывается на этапе планирования игрыЛегко поддерживаетсяЛогика внутри объектаЗависимости видны явноЕсли дизайн не менятьА если менять?www.mail.ru3
4. В конечном итогеClass UberObjectВесь код в одном классеНепонятно, где чья логикаКаша из зависимостейТрудно что-то добавитьНе доводите до такого{}Игровой объект с позиции ООПwww.mail.ru4class MyObject
15. Подбор кораблямиМодульный объект АллодовОбщий контейнерХранит компоненты, предоставляющие интерфейсыОтображение интерфейсов в их компонентыИнтерфейс указывается явно при добавленииУмеет get() и put()Больше ничего не умеетИнтерфейс компонентСам по себе не умеет ничегоwww.mail.ru9
16. Модульный объект АллодовСоздание объектаBunch createMyObject() {final Bunch myObj = new Bunch();final Health health = new Health(100);myObj.addPart(Health.class, health);returnmyObj;}www.mail.ru10
17. Модульный объект АллодовПолучение определенной запчастиvoiddoSomething(@NotNull Bunch obj) {final Health health = obj.getPart(Health.class);health.consume(30);}www.mail.ru11
18. Модульный объект АллодовНе спрашивайте, что это за объектСпросите, умеет ли он то, что вам нужно?if(myObjinstanceofMyClass) { // Wrong way :( }if(myObj.getPart(MyPart.class)!=null) { // Right way :) }www.mail.ru12
19. Объекты можно собирать «на лету»void assemble(@NotNullBunch myObj){myObj.addPart(Health.class, new Health(100));myObj.addPart(IFFOwner.class, newIFFOwner()); <...>}Таких функций может быть многоwww.mail.ru13
20. Знаем только про то, что нам нужноvoid affect(@NotNullBunch myObj){final Mortal mortal = myObj.getPart(Mortal.class);final Health health = myObj.getPart(Health.class);if(health.getLevel() < 50.f) mortal.die();}Нет зависимостей на тип объектаНет зависимостей, полученных «в нагрузку»www.mail.ru14
23. voidmortalTest () {final Mortal mortal = new Mortal();Assert.assertFalse(mortal.isDead()); mortal.die();Assert.assertTrue(mortal.isDead());}Объект целиком создавать не обязательноМожно и более сложные функциональные тестыЛегко тестироватьwww.mail.ru17
24. Куда положить редко нужную логикуwww.mail.ru18ОбъектОбъектОбъектОбъектОбъектОбъектОбъектОбъект
25. Куда положить редко нужную логикуwww.mail.ru19ОбъектОбъектОбъектОбъектОбъектОбъектОбъектОбъектКакое-то событие
26. В стандартном подходеvoid someInternalProcessing() { <...> if(eventActive) doExtraLogic(); <...>}void itHappened(@NotNullMyObjobj) {obj.eventActive = true; }Куда положить редко нужную логикуwww.mail.ru20
27. В модульном подходеclass ExtraLogicimplementsBunchPart { void doExtraLogic() { // Extra logic goes here }}voiditHappened(@NotNullBunch obj) {obj.addPart(ExtraLogic.class, newExtraLogic());}Куда положить редко нужную логикуwww.mail.ru21
31. void process(@NotNullBunch obj) {if(obj.getPart(RequiredPart.class) == null) { // И что теперь делать? }<...>}Например, заклинания, наносящие урон по площадиПодходит нам объект или нет?www.mail.ru25
32. void assebleObj(@NotNullBunch obj) {obj.addPart(Part1.class, new Part1());obj.addPart(Part2.class, new Part2());obj.addPart(Part3.class, new Part3());}Мы точно ничего не забыли?Эти запчасти между собой не конфликтуют?Заработает ли собранное?www.mail.ru26
33. В классическом подходеclass MyObj {@NotNullpublicMyPart part = newMyPart();}void process(@NotNullMyObjobj) {obj.part.doSomething();}Нет проверок @NotNullwww.mail.ru27
34. В модульном подходеBunch assembleMyObj() {final Bunch myObj = new Bunch();myObj.addPart(MyPart.class, newMyPart());returnmyObj;}void process(@NotNull Bunch obj) {finalMyPart part = obj.getPart(MyPart.class);if(part == null) return; /* Never happens */part.doSomething();}Нет проверок @NotNullwww.mail.ru28
35. <spell> <targetImpacts> <Item type = “ImpactKill” /> </targetImpacts></spell>Что нужно от цели воздействию ImpactKill?Нужно ли ему здоровье?А что будет, если его нет?В данных тоже есть проблемыwww.mail.ru29
40. Не забывайте про дизайнеров!Как что работает должно быть понятно из редакторовРазумеется, они должны бытьЛучше – из самих данныхТекстовый редактор F4Билд-система тоже полезнаНужна поддержка в данныхwww.mail.ru34
41. Mail.RuРазработчик игр и сервисов №1Крупнейший работодатель в отраслиРаботайте у нас!job.gamedev@corp.mail.ruhttp://corp.mail.ru/career/vacancies/voronezhСпасибо!Михаил КазаковСтарший программист, Команда «Аллодов Онлайн»m.kazakov@corp.mail.ruwww.mail.ru