Cześć, uczę się podstaw Javy, napisałem prostą aplikację - notatnik, kod pod adresem:
https://github.com/InPursuitPL/JAVA-Notebook
Proszę o ogólną ocenę pod względem OOP. Mam też kilka konkretniejszych pytań, głównie chodzi mi o sensowne projektowanie (OOD) aplikacji od początku:
-
W programie mam klasę Menu, która posiada metody showNoteById, removeNote, modifyNote. Doszedłem do wniosku, że kod w nich na tyle powtarza się, że mogę całość skrócić poprzez stworzenie wspólnej metody i użycie warunków. Stworzyłem więc klasę MenuCombined, w której zadania tych trzech metod pełni metoda handleNote(String task) i zależnie od podanego argumentu ("show", "remove" lub "modify") za pomocą if else zajmuje się notatką. Zastanawiam się jednak, który sposób jest poprawny pod względem OOP jako takiego? Co jest w tym przypadku ważniejsze - to, że skróciłem klasę i uniknąłem powtarzania kodu czy też in minus przeważa to, że stworzyłem metodę, która zajmuje się kilkoma rzeczami na raz zamiast zostać przy osobnych metodach dla każdego zadania?
-
Działanie programu wygląda tak, że po wywołaniu metody addNote w klasie Menu, instancja klasy Note zostaje od razu stworzona i przekazana do instancji Notebook poprzez metodę public void addNote(Note newNote), gdzie jest dorzucona do ArrayList. Zastanawiam się, czy nie powinienem przekazywać np. samego stringa tekstu notatki jak 'najniżej' w programie czyli w tym przypadku, metoda dla Notebook nie powinna przyjąć jeszcze stringa zamiast już obiektu Note i go dopiero stworzyć w swoim ciele. Czy jest jakaś generalna zasada, która odnosiłaby się do tego, gdzie tworzyć obiekt? Wiem, że w tym programie nie ma to większego znaczenia ale chodzi mi o dobre praktyki od początku.
-
Staram się tworzyć testy od początku i z moją podstawową wiedzą w tym momencie nie jestem w stanie tworzyć sensownych 'automatycznych' (takich, które nie wymagają ode mnie wklepywania danych a tylko po uruchomieniu klasy informują, że wszystko przebiegło ok lub, że jest błąd) testów dla metod, w których występuje user input - w moim przypadku chodzi o klasę Menu. Zakładam, że metody powinny być, o ile to możliwe, tworzone bez konieczności oczekiwania na dane użytkownika, jak rozwiązać to w moim przypadku? Tworzyć jeszcze mniejsze metody, uruchamiane po otrzymaniu danych od użytkownika?
Będę wdzięczny za wszelkie konstruktywne uwagi :)