Programowanie Zaawansowane 1

Laboratoria

Uwagi

  • Zmiennych w stylu Map<Long, AdminUnit> adminUnitId = new HashMap<>(); nie dodajemy do AdminUnitList 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 funkcji read().
  • 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 z indexOf 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

Ciekawostki

programowanie_zaawansowane_1.txt · Last modified: 2023/12/16 22:01 by pszwed
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0