Table of Contents
Programowanie Zaawansowane 1
Laboratoria
- Adres kursu na UPEL: https://upel.agh.edu.pl/course/view.php?id=9927
- Każda grupa otrzyma osobne hasło
Uwagi
- Zmiennych w stylu
Map<Long, AdminUnit> adminUnitId = new HashMap<>();nie dodajemy doAdminUnitListjako 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
Exceptionbo:- 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
BoundingBoxzapewnia interfejs addPoint(), który implementuje pewną logikę. Nie wpisujemy tam wartości bezpośrednio, bo musielibyśmy powtórzyć tę logikę. filterzindexOfnie jest zbyt dobrym pomysłem. Złożoność $O(n^2)$ zamiast $O(n)$- Dla klas typu
AdminUnitraczej nie ma sensu pisać konstruktorów. Taki typ klas nazywa się POJO (Plain Old Java Object). 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
AdminUnitsQuerypolecam 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
