{"id":91,"date":"2017-11-05T21:26:19","date_gmt":"2017-11-05T20:26:19","guid":{"rendered":"http:\/\/discreteempire.com\/?p=91"},"modified":"2021-02-28T15:17:58","modified_gmt":"2021-02-28T14:17:58","slug":"lubie-ddd","status":"publish","type":"post","link":"https:\/\/discreteempire.pl\/index.php\/2017\/11\/05\/lubie-ddd\/","title":{"rendered":"Lubi\u0119 DDD"},"content":{"rendered":"<p>Na studiach nauczono mnie programowa\u0107 obiektowo, lecz w pracy ta umiej\u0119tno\u015b\u0107 nie bardzo mi si\u0119 przyda\u0142a. Pierwszy du\u017cy projekt, z kt\u00f3rym si\u0119 w niej spotka\u0142em, by\u0142 napisany w architekturze tr\u00f3jwarstwowej. Musia\u0142em zapomnie\u0107 o tym czego si\u0119 wcze\u015bniej nauczy\u0142em i zacz\u0105\u0107 pisa\u0107 strukturalny kod jak w C tylko, \u017ce w Javie. Nie widzia\u0142em sensu pisania kodu w taki spos\u00f3b. Miesi\u0105cami pr\u00f3bowa\u0142em zrozumie\u0107 dlaczego tak, a nie inaczej napisana jest aplikacja. Podczas analizy w mojej g\u0142owie pokazywa\u0142y si\u0119 rozwi\u0105zania obiektowe, kt\u00f3re by\u0142y \u0142atwiejsze w zrozumieniu i kr\u00f3tsze ni\u017c serwisy opisane w 1000 linii, w kt\u00f3rych znajduje si\u0119 wszystko.<\/p>\n<p>Jestem po kilkudziesi\u0119ciu wyk\u0142adach i ksi\u0105\u017cce z &#8220;Czystego Kodu&#8221; (&#8220;Czysty kod. Podr\u0119cznik dobrego programisty&#8221; &#8211; Robert C. Martin). Nie by\u0142o to dla mnie nic odkrywczego, pomog\u0142o mi jednak w nazwaniu niekt\u00f3rych rzeczy, co u\u0142atwia wsp\u00f3\u0142prac\u0119 w zespole. Same zasady czystego kodu nie pokazuj\u0105 jak pisa\u0107 kod obiektowo. Tu z odsiecz\u0105 przyszli Vaughn Vernon i Eric Evans (&#8220;Implementing Domain Drive Design&#8221;, &#8220;Domain-Driven Design: Tackling Complexity in the Heart of Software&#8221;), kt\u00f3rzy pokazali jak to robi\u0107 oraz jak to robi\u0107 z biznesem.<\/p>\n<p>Zgodnie z zasad\u0105 czystego kodu wszystko co zostanie napisane musi zosta\u0107 przetestowane. W Unity3D stosuje si\u0119 obiekty MonoBehaviour, w kt\u00f3rych znajduje si\u0119 wi\u0119kszo\u015b\u0107 logiki. Przez d\u0142ugi okres czasu obiekty te by\u0142y &#8220;nietestowalne&#8221;. Tw\u00f3rcy Unity chc\u0105c pom\u00f3c programistom zacz\u0119li tworzy\u0107 tutoriale jak rozdziela\u0107 obiekty tak aby cho\u0107 po cz\u0119\u015bci da\u0142o si\u0119 je przetestowa\u0107.<\/p>\n<ul>\n<li><a href=\"https:\/\/blogs.unity3d.com\/2014\/06\/03\/unit-testing-part-2-unit-testing-monobehaviours\/\">unit-testing-part-2-unit-testing-monobehaviours<\/a><\/li>\n<\/ul>\n<p>Moim zdaniem nie wygl\u0105da to za dobrze. Jak dla mnie MonoBehaviour powinny zajmowa\u0107 si\u0119 tylko wy\u015bwietlaniem\u00a0 modelu albo zbieraniem danych od u\u017cytkownika. Ca\u0142a reszta logiki gry powinna znajdowa\u0107 si\u0119 gdzie\u015b pod spodem. Ostatnio znalaz\u0142em przydatne narz\u0119dzie:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.unity3d.com\/Manual\/testing-editortestsrunner.html\">Editor Test Runner<\/a><\/li>\n<\/ul>\n<p>kt\u00f3re umo\u017cliwia testy obiekt\u00f3w MonoBehaviour, z czego bardzo si\u0119 ucieszy\u0142em.<\/p>\n<p>DDD sk\u0142oni\u0142o mnie do my\u015blenia o tym jakich narz\u0119dzi brakuje mi w Unity. Dlatego zacz\u0105\u0142em pisa\u0107 framework &#8220;Dynamics&#8221;. W pierwszej wersji chcia\u0142bym aby projekt zawiera\u0142 trzy rzeczy:<\/p>\n<ul>\n<li>obs\u0142ug\u0119 rozkaz\u00f3w<\/li>\n<li>obs\u0142ug\u0119 zdarze\u0144<\/li>\n<li>kontener z zale\u017cno\u015bciami<\/li>\n<\/ul>\n<p>Pierwsz\u0105 poboczn\u0105 funkcjonalno\u015bci\u0105 w Dynamics, kt\u00f3r\u0105 b\u0119d\u0119 potrzebowa\u0142 to planista. B\u0119dzie on wykorzystywany w CommandBus i EventBus. Dzi\u0119ki IoC w \u0142atwy spos\u00f3b b\u0119d\u0119 m\u00f3g\u0142 podmieni\u0107 jego implementacja z jednow\u0105tkowej na wielow\u0105tkow\u0105. Planista b\u0119dzie kolejkowa\u0142 zdefiniowane przez inne obiekty akcje. M\u00f3g\u0142bym skorzysta\u0107 z .Net Reactive Extension lecz niestety nie dzia\u0142a w Unity3D. Kto\u015b ju\u017c zauwa\u017cy\u0142 ten brak i stworzy\u0142 implementacj\u0119 dla Unity3D. Nazwa\u0142 j\u0105 UniRx. Nie skorzystam jednak z gotowego rozwi\u0105zania, aby zwi\u0119kszy\u0107 swoj\u0105 przyjemno\u015b\u0107 z pisania.\u00a0Kolejn\u0105 funkcjonalno\u015bci\u0105 do napisania po plani\u015bcie b\u0119dzie obs\u0142uga polece\u0144. Ka\u017cda zmiana stanu gry rozpocznie si\u0119 od rozkazu, kt\u00f3ry nazw\u0105 wskazuje na intencj\u0119, a we wn\u0119trzu posiada dane do podj\u0119cia akcji. Podczas pisania b\u0119d\u0119 si\u0119 wzorowa\u0142 na Axon Framework. Nast\u0119pnie napisz\u0119 obs\u0142ug\u0119 zdarze\u0144, kt\u00f3re wyra\u017caj\u0105 zmian\u0119 stanu gry.<\/p>\n<p><del>Kod mo\u017cna znale\u017a\u0107 na GitHubie: Dynamics &#8211; I like ddd<\/del><\/p>\n<p>Na repo nie by\u0142o nic ciekawego, wi\u0119c wraz z porzuceniem projektu usun\u0105\u0142em je.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na studiach nauczono mnie programowa\u0107 obiektowo, lecz w pracy ta umiej\u0119tno\u015b\u0107 nie bardzo mi si\u0119 przyda\u0142a. Pierwszy du\u017cy projekt, z kt\u00f3rym si\u0119 w niej spotka\u0142em, by\u0142 napisany w architekturze tr\u00f3jwarstwowej. Musia\u0142em zapomnie\u0107 o tym czego si\u0119 wcze\u015bniej nauczy\u0142em&#8230; <a class=\"read-more\" href=\"https:\/\/discreteempire.pl\/index.php\/2017\/11\/05\/lubie-ddd\/\">Read More<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true},"categories":[19],"tags":[],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9lLj4-1t","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":280,"url":"https:\/\/discreteempire.pl\/index.php\/2018\/10\/14\/wprowadzenie\/","url_meta":{"origin":91,"position":0},"title":"Wprowadzenie","date":"2018-10-14","format":false,"excerpt":"Od czterech lat jestem profesjonalnym klepaczem kodu. Od dw\u00f3ch lat klepi\u0119 ten kod w do\u015b\u0107 nowych technologiach takich jak: Spring BootSpring Boot DataSpring CloudAxon FrameworkPostgresRabbitMQ Przek\u0142ada si\u0119 to na problemy, na kt\u00f3re nawet szesnasta zak\u0142adka z Stack Overflow nie pomaga. \u0179r\u00f3d\u0142em tych problem\u00f3w nie by\u0142 Spring, spokojnie mo\u017cesz korzysta\u0107 dalej,\u2026","rel":"","context":"In &quot;Nie korzystaj z Axona&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":133,"url":"https:\/\/discreteempire.pl\/index.php\/2017\/11\/16\/szybki-sprawdzian\/","url_meta":{"origin":91,"position":1},"title":"Szybki sprawdzian","date":"2017-11-16","format":false,"excerpt":"Ju\u017c jaki\u015b czas pisz\u0119 framework Dynamics. Ilo\u015b\u0107 funkcjonalno\u015bci si\u0119 zwi\u0119ksza, wi\u0119c trzeba sprawdzi\u0107 czy to co zosta\u0142o zaimplementowane do czego\u015b si\u0119 przyda. Postanowi\u0142em obs\u0142u\u017cy\u0107 poruszanie si\u0119 Pacmana. Jest to jedna z podstawowych funkcji gry dlatego zdecydowa\u0142em si\u0119 zaimplementowa\u0107 j\u0105 jako pierwsz\u0105. Potrzebne aby posta\u0107 mog\u0142a si\u0119 porusza\u0107: plansza (Gameboard) b\u0119dzie\u2026","rel":"","context":"In &quot;Dynamics&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":75,"url":"https:\/\/discreteempire.pl\/index.php\/2017\/10\/13\/pierwszy-kontakt\/","url_meta":{"origin":91,"position":2},"title":"Pierwszy kontakt","date":"2017-10-13","format":false,"excerpt":"W pracy g\u0142upot robi\u0107 nie mog\u0119 (klient si\u0119 na to nie zgadza),\u00a0 wi\u0119c w domu musz\u0119 si\u0119 wyszale\u0107. Dlatego postanowi\u0142em napisa\u0107 w\u0142asny framework do Unity3D. Od kilku lat stara\u0142em si\u0119 napisa\u0107 jakie\u015b gry ale zawsz\u0119 ko\u0144czy\u0142o si\u0119 to fiaskiem. G\u0142ownie ze wzgl\u0119du na brak test\u00f3w i ci\u0119\u017cki do utrzymania kod.\u2026","rel":"","context":"In &quot;Dynamics&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":153,"url":"https:\/\/discreteempire.pl\/index.php\/2017\/12\/06\/usprawnienia\/","url_meta":{"origin":91,"position":3},"title":"Usprawnienia","date":"2017-12-06","format":false,"excerpt":"Po cz\u0119\u015bciowej implementacji przyszed\u0142 czas na usprawnienie. Pierwsze na czym si\u0119 skupi\u0142em to agregaty. Nic nowego nie wymy\u015bli\u0142em, po prostu wykona\u0142em metod\u0119 Kopiego Pejsta z Axona. Najwi\u0119ksz\u0105 zalet\u0105 przepisywania tego by\u0142o zrozumienie jak dzia\u0142a metoda apply z\u00a0AggregateLifecycle\u00a0i jest to jedna z ciekawszych implementacji jak\u0105 widzia\u0142em w swoim \u017cyciu. Drugim usprawnieniem\u2026","rel":"","context":"In &quot;Dynamics&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":297,"url":"https:\/\/discreteempire.pl\/index.php\/2019\/01\/16\/nie-korzystaj-z-axona-i-list\/","url_meta":{"origin":91,"position":4},"title":"Nie korzystaj z Axona i list","date":"2019-01-16","format":false,"excerpt":"To nie jest tak, \u017ce w Axonie w agregatach i sagach nie mo\u017cna korzysta\u0107 z list. Je\u017celi kolekcja zawiera niewielk\u0105 ilo\u015b\u0107 element\u00f3w, oko\u0142o 1000, to nie ma problemu. Je\u017celi jednak wymagana jest obszerniejsza lista to napotykamy problemy pami\u0119ciowe i wydajno\u015bciowe. Co nale\u017cy zrobi\u0107 aby nie mie\u0107 takich problem\u00f3w? Problem pami\u0119ci\u2026","rel":"","context":"In &quot;Nie korzystaj z Axona&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":269,"url":"https:\/\/discreteempire.pl\/index.php\/2018\/10\/16\/nie-korzystaj-z-axon-i-jpa\/","url_meta":{"origin":91,"position":5},"title":"Nie korzystaj z Axon i JPA","date":"2018-10-16","format":false,"excerpt":"Problemy z JPA i Axonem nie zaczynaj\u0105 si\u0119 od razu. Pocz\u0105tki s\u0105 wolne, chcesz aby wykona\u0142 si\u0119 jeden rozkaz, p\u00f3\u017aniej sto rozkaz\u00f3w, wszystko przechodzi swobodnie i szybko, nie wida\u0107 \u017cadnego problemu. Gdy zaczyna si\u0119 robi\u0107 powa\u017cnie i musisz wykona\u0107 np. czterdzie\u015bci tysi\u0119cy rozkaz\u00f3w to wtedy zauwa\u017casz dziwne zachowanie swojego komputera.\u2026","rel":"","context":"In &quot;Nie korzystaj z Axona&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/posts\/91"}],"collection":[{"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/comments?post=91"}],"version-history":[{"count":12,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/posts\/91\/revisions"}],"predecessor-version":[{"id":292,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/posts\/91\/revisions\/292"}],"wp:attachment":[{"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/media?parent=91"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/categories?post=91"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/tags?post=91"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}