Wpis z mikrobloga

@krasnoludkolo:

1. Task: dawno nie kodziłem w Javie, ale super() w konstruktorze chyba zbędne – nie dziedziczysz po żadnej klasie.
2. Task: w konstruktorze parametr nazywasz info, dalej już name – do ujednolicenia.
3. TaskRepository: nie traktuj repozytorium jak kolekcję (czyli nie powinna posiadać metody sort) – ale raczej jako dostawcę kolekcji. Czyli ewentualnie możesz poprosić repozytorium o posortowaną kolekcję (zamiast repo.sort(); repo.getAll() raczej rób repo.getAllSorted(sortBy)
co do pkt 4 i 5 będzie dobrym pomysłem wyciągnięcie metod save i load do osobnej klasy?


@krasnoludkolo: IMHO repo jest na tyle proste, że bym olał. Tak na prawdę to repozytorium nie ma za bardzo logiki, chyba, że ją potem dodasz i będziesz chciał wydzielić persystencję gdzie indziej, żeby mieć SOLID.
Mógłbyś trochę rozwinąć pkt 3? ;)


@krasnoludkolo: Repozytorium jest miejscem, skąd możesz czerpać obiekt(y). Służy Ci do tego, żeby mieć skąd pobrać jeden obiekt lub kolekcję obiektów.

To nie jest tak, że wykonujesz na nim jakieś działania. Nie sortujesz repozytorium. Możesz sortować kolekcję obiektów, ale nie repozytorium.

Czyli opcje dwie:

a.) tasks = repo.getAll() zwraca kolekcję i ta kolekcja ma metody sortowania tasks.sortBy(sortedBy)
b.) tasks = repo.getAll(sortedBy) – czyli repo zwraca
Mógłbyś trochę rozwinąć pkt 3? ;)


@krasnoludkolo: Jeszcze a propos tego. Wybraź sobie, że chcesz pobrać tylko taski, które mają priorytet powyżej określonego poziomu.

Nie będziesz robić metody typu repo.setReturningOnlyWithPriorityHigherThan(priority); repo.getAll();.

Raczej chcesz mieć repo.getWithPriorityHigherThan(priority);
Czyli repo zwraca Ci gotową kolekcję o jakichś cechach, ale robisz to na poziomie metody, zamiast mutować samo repo.

http://martinfowler.com/bliki/TellDontAsk.html
@MacDada: teraz jest tak, że tworząc adapter do listy podaje mu referencje do listy z repo. Dlatego jak cos zmienia sie w repo to zmienia się od razu w liście.
Czyli powinienem zrobić tak, że przy każdorazowej zmianie danych zrobić coś takiego?

adapter.clear()
adapter.addAll(repo.getAllSortBy(sortedby))
@krasnoludkolo: Celowo pisałem tylko o modelu, bo Javę tylko liznąłem kilka lat temu, więc nie znam frameworków i aktualnie stosowanych w nich praktyk. Za to idea modelu jest uniwersalna ;-)

Nie wiem więc jaka do końca jest rola tego adaptera, ale z tego co widzę TaskListAdapter dostaje repo w konstruktorze i je sobie trzyma w polu. Więc widzę dwie opcje:

a.) dorób sobie adapter.reload() (w końcu ma repo, więc sam sobie
@rex1313: notifyDataSetChanged() odświeża tylko listView na podstawie tej listy którą ma w sobie (podanej w konstruktorze). Jeśli zmieniam dane (sortowanie) w repo to muszę tą nową (posortowaną) liste i tak mu jakoś przekazać. Teraz mam tak ze adapter ma referencje to ArrayList z repo dlatego starczy wywołać tylko notifyDataSetChanged()
No to wydaje mi sie, ze to jest dobre podejscie. Zamiast adapter.clear() zawsze mozesz uzyc notifyDataSetInvalidated(), a potem notifyDataSetChanged. Natomiast kazdorazowe ladowanie adaptera na nowo wydaje mi sie malo wydajnym rozwiazaniem.
@krasnoludkolo: TaskCollection brzmi bardziej „pro” ;-)

Tak czy siak, wtedy wywalasz wszystkie funkcje zapisywania, zamieniasz save na add, etc.

SingleResponsibilityPrinciple: albo jest kolekcją albo jej persystencją.
@krasnoludkolo: Ogólnie skup się na trzech zadaniach:

1. Podmioty, obiekty którymi zarządzasz (Task),
2. Zestawy, listy, kolekcje tych podmiotów (TaskCollection, ArrayCollection, Array, TaskArray),
3. Dostarczyciela/zarządcę powyższych: repozytorium.

Podmiot (Task) może mutować siebie (może mieć jakieś cechy zmienione), ale nie powinien siebie zapisywać (tym zajmuje się repozytorium).

Kolekcja może mutować siebie (możesz do niej dodawać podmioty, usuwać, sortować), ale nie powinna mutować podmiotów (Tasków) i nie powinna siebie zapisywać.

Repozytorium może mutować