Jak zamodelować domenę dla aplikacji

0

Piszę prostą apkę czatu do spotkań której szczegółowe zasady działania nie są istotne, najważniejsza to taka, że aby spotkanie mogło się rozpocząć to muszą dołączyć 4 osoby i nie mogą się one zmienić.
Zastanawiam się jak zamodelować domenę w tym przypadku. Widze 2 podejścia.

  1. Tworzę klasę Meeting w ktorej ustawiam sobie jakąś nazwę spotkania + hasło (te pola mogą być niemutowalne bo nie da się ich zmienić) i na podstawie tych danych pozostali członkowie mogą dołączać do spotkania (+ kilka dodatkowych pól które są ustawiane na podstawie dołączających osób) i te pola niestety muszą być mutowalne bo będą się zmieniać/ustawiać w trakcie dołączania kolejnych osób.
  2. Tworzę klasę np. PreMeeting która ma tak jak wyżej pisałem nazwę + hasło niemutowalne a pozostałe pola mutowalne. Kiedy wszyscy dołączą i spotkanie może się rozpocząć to tworzony jest obiekt z klasy Meeting który budowany jest na podstawie PreMeeting i dzięki temu wszystko tam może być niemutowalne. Dalsza logika opiera się już na działaniu na tym obiekcie.

Co myślicie? Co ma większy sens? Wydaje mi się że drugie rozwiązanie ale z drugiej strony zastanawiam się czy to nie jest overkill chociaż przypominam sobie jakaś prezentacje Jakuba Nabrdalika w której mówił o modelu artykułów w Allegro i rozwiązanie tam było podobne. Na początku tworzony jest DraftArticle i jak zostanie wszystko przygotowane jak należy to dopiero na tej podstawie tworzony jest konkretny obiekt z klasy Article.

0

Twój Meeting ma kilka stanów i rzeczywiście można to zamodelować jako osobne klasy (becoming) - nowy obiekt będzie udostępniał inne zachowania (behaving) niż ten poprzedni, np. nie można już dołączyć.

0

Bardzo fajny drugi pomysł -- oddzielasz od siebie dwie istotnie różniące się byty (bo z Twojego opisu wynika jasno, że INNYM regułom podlegać ma spotkanie już rozpoczęte od tego dopiero w trakcie tworzenia) i zyskujesz tutaj strasznie ważną cechę, to jest niemutowalność. I mi to w ogóle nie wygląda na overkill, pracy dodatkowej chyba prawie nie będzie, a będzie czytelność i odporność.

0

@Charles_Ray: @koszalek-opalek okej, spróbuję zamodelować i zobaczymy co z tego wyniknie. Zauważyłem jednak jeden problem. Chciałbym dodać też metodę która zwróci opis/status spotkania. Trochę inaczej ten status będzie wyglądał w przypadku PreMeeting (czekamy jeszcze na gości, więc mamy mniej informacji do wyświetlenia) i Meetingu gdzie mamy już pełen obraz spotkania. Pomyślałem sobie więc że zrobię w obu serwisach tę samą metodę (typu getMeetingInfo()) i najpierw będę szukał spotkania w PreMeeting a jeśli nic nie znajdę to albo nie istnieje albo już się zaczęło (spotkanie które się rozpoczęłop będzie usuwane z PreMeeting i przenoszone do Meeting) więc będę musiał przeszukać jeszcze Meeting. Ma to sens? Problem w tym że logika mi się trochę rozjeżdża bo nie mam 1 metody która zwraca info o spotkaniu tylko dwie w różnych miejscach i gdziekolwiek będę chciał uzyskać info o spotkaniu muszę pamiętać żeby wyciągać te dane z obu miejsc i to mi się bardzo nie podoba :/

0

Spróbowałbym użyć wzorca projektowego: Stan.

Osobna klasa Meeting i wydzielony interfejs/klasa abstrakcyjna na jego stany i dwie implementację na stany (PreMeeting, DuringMeeting)?

Masz wtedy dobrą separację między meeting a jego stanem. Łatwą możliwość dodania kolejnego stanu np. ClosedMeeting. Stany same mogą zarządzać tym że należy przejść do następnego.

0
eL napisał(a):

@Charles_Ray: @koszalek-opalek okej, spróbuję zamodelować i zobaczymy co z tego wyniknie. Zauważyłem jednak jeden problem. Chciałbym dodać też metodę która zwróci opis/status spotkania. Trochę inaczej ten status będzie wyglądał w przypadku PreMeeting (czekamy jeszcze na gości, więc mamy mniej informacji do wyświetlenia) i Meetingu gdzie mamy już pełen obraz spotkania. Pomyślałem sobie więc że zrobię w obu serwisach tę samą metodę (typu getMeetingInfo()) i najpierw będę szukał spotkania w PreMeeting a jeśli nic nie znajdę to albo nie istnieje albo już się zaczęło (spotkanie które się rozpoczęłop będzie usuwane z PreMeeting i przenoszone do Meeting) więc będę musiał przeszukać jeszcze Meeting. Ma to sens? Problem w tym że logika mi się trochę rozjeżdża bo nie mam 1 metody która zwraca info o spotkaniu tylko dwie w różnych miejscach i gdziekolwiek będę chciał uzyskać info o spotkaniu muszę pamiętać żeby wyciągać te dane z obu miejsc i to mi się bardzo nie podoba :/

Nie wygląda to jak sprawa dla zastosowania filozofii interfejsu (klasy abstrakcyjnej), gdzie w obu klasach implementujesz ten sam interfejs (getMeetingInfo)...? I nie widzę tu też problemu o którym piszesz...

1 użytkowników online, w tym zalogowanych: 0, gości: 1