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:

  1. 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?

  2. 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.

  3. 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 :)