wysekm/DistributedSystemMonitoring — pull request #47 by grabarczyk-t (2014-05-20 21:15:44+00:00)
Title: Refaktoring - DDD

Postanowiłem zmienić strukturę projektu, żeby lepiej wykorzystać idee MVC i DDD

Zmiany robiłem w oparciu o prezentację [Crafted Design](http://www.slideshare.net/sandromancuso/crafted-design-geecon-2014).

Główne założenia:

- Podział na core i mechanizmy dostępu (np. web, rest, udp, itp)

Struktura Core'a:
- package `.model` - wyraźnie umiejscowione obiekty domenowe
- wiadomo co stanowi sedno aplikacji
- tu umiejscowione są wszystkie encje domenowe i klasy pomocnicze z nimi związane
- funkcjonalności umiejscowione są w serwisach domenowych
- zawiera interfejsy do komunikacji z zewnętrznymi obiektami (np. bazy danych, web serwisy)
- package `.usecase` - przejrzysty interfejs aplikacji
- wiadomo co aplikacja robi
- stanowi fasadę aplikacji dla użytkowników
- usecase'y wywołują odpowiednie serwisy domenowe, definiują flow operacji, a nie jej implementację
- package `.infrastructure` - osobne miejsce na infrastrukturę aplikacji
- integracja z technologiami i usługami
- funkcjonalności i obiekty, które bezpośrednio nie stanowią domeny aplikacji

Struktura Web
- package `.controller` - obsługa żądań - wywołanie usecase'ów
- package `.view` - obiekty definiujące widok, walidatory
- package `.infrastructure` - parsery, konwertery

Zalety:
- aplikacja jest bardziej przejrzysta i modularna
- wiadomo gdzie dodać nowe feature'y
- dużo łatwiej wybrać elementy które warto przetestować

Spodobała mi się ta struktura projektu i chciałem ją wypróbować na naszej aplikacji. Wydaje mi się że efekt jest całkiem fajny. Napiszcie co sądzicie o tym. (Do porównania najlepiej jest otworzyć sobie dwa okna IDE z tym branchem i z masterem i porównać strukturę package'y i klas).

Jak nikt nie zgłosi sprzeciwu to jutro zmerguje te zmiany.

Note: żeby było lepiej widać faktyczną strukturę package'y zrobiłem że żaden moduł nie korzysta z commonsów, To można będzie później przywrócić.