Table of Contents
Programowanie Zaawansowane 1
Laboratoria
Adres kursu na UPEL: https://upel.agh.edu.pl/course/view.php?id=7445 Każda grupa otrzyma osobne hasło
- Laboratorium 11
Symbolem ✔ oznaczono zadania planowane w 2022
Uwagi
- Zmiennych w stylu
Map<Long, AdminUnit> adminUnitId = new HashMap<>();
nie dodajemy doAdminUnitList
jako atrybutów. Nie jesteśmy w stanie zapewnić spójności stanu takich atrybutów - kiedy np. tworzymy listę zawierającą wybrane jednostki. Mapy powinny być tworzone tylko na czas czytania wewnątrz funkcjiread()
. - Napisaliśmy isMissing() ponieważ działa znacznie szybciej, niż obsługa wyjątków.
- Proszę nie pisać funkcji wyrzucającej wyjątki typu
Exception
bo:- Zmusza to do ich przechwytywania (a to zawsze jest pewien kłopot)
- Nie daje żadnej informacji o typie wyjątku; to już lepiej
RuntimeException
…
- Przechwytując wyjatki nie piszemy
catch(SomeException e){ System.out.println("exception description"); }
ale
catch(SomeException e){ e.printStackTrace(); }
Ważniejszą informacją jest miejsce wystąpienia błędu, niż jego lakoniczny opis!
- Klasa typu
BoundingBox
zapewnia interfejs addPoint(), który implementuje pewną logikę. Nie wpisujemy tam wartości bezpośrednio, bo musielibyśmy powtórzyć tę logikę. filter
zindexOf
nie jest zbyt dobrym pomysłem. Złożoność $O(n^2)$ zamiast $O(n)$- Dla klas typu
AdminUnit
raczej nie ma sensu pisać konstruktorów. Taki typ klas nazywa się DTO (inna wersja to POJO). Rekord z pliku lub bazy danych został zamieniony na obiekt. Gdzieś tam jest kod który wypełnia te atrybuty podczas odczytu lub odczytuje ich wartości podczas zapisu. Konstruktor tylko w tym przeszkadza. Patrz: https://stackoverflow.com/questions/1612334/difference-between-dto-vo-pojo-javabeans. Można też pisanie konstruktorów zautomatyzować: Lombok - Jeżeli klasa implementuje settery i gettery, to równie dobrze można jej atrybuty zamienić na publiczne i nie produkować zbędnego kodu. Czasem jest to wymagane (Hibernate) - rozwiązaniem może być ich automatyczna generacja - projekt Lombok
AdminUnitsQuery
polecam rozwiązanie M.Ś. Proszę zastanowić się dlaczego?
AdminUnitList execute(){ src = src.filter(p); src = src.sort(cmp); src = src.filter(x -> true, offset, limit); // x->true oznacza ze nic nie bedzie wurzucone, predykat zwiekszylby zlozonosc return src; }
fixMissingValues()
memoizacja ????. Gdyby drzewo miało głębokość 1000, było posortowane od najgłębiej połozonych węzłów, a szukana wartość byłaby w korzeniu, to przeglądalibyśmy je 1000+999+…1 razy - $O(n^2)$. Zamiast tego można zapisać wartość przy okazji rekurencji i znacznie zmniejszyć złożoność. To powinnien być automatyczny wybór.
Archiwalne wykłady z języka Java