====== Programowanie Zaawansowane 1 ====== ===== Laboratoria ===== Adres kursu na UPEL: [[https://upel.agh.edu.pl/course/view.php?id=5180]] Każda grupa otrzyma osobne hasło *[[pz1:lab1|Laboratorium 1 -- kompilacja, uruchamianie, IDE]] *[[pz1:lab2|Laboratorium 2 -- klasa Matrix]] *[[pz1:lab3|Laboratorium 3 -- testy metod klasy Matrix]] *[[pz1:lab4|Laboratorium 4 -- piszemy CV]] *[[pz1:lab5|Laboratorium 5 -- Konstruujemy wyrażenia matematyczne...]] *[[pz1:lab6|Laboratorium 6 -- CSV reader]] *[[pz1:lab7|Laboratorium 7 -- Wczytujemy województwa,​ powiaty, gminy...]] *[[pz1:lab8|Laboratorium 8 -- Województwa,​ powiaty, gminy - kontynuacja]] *[[pz1:lab9|Laboratorium 9 -- Województwa,​ powiaty, gminy - sortowanie i filtrowanie]] *[[pz1:lab10|Laboratorium 10 -- Rysujemy choinkę]] *Laboratorium 11 *[[pz1:watki-zegar|Wątki i animacja: zegar]] ✔ *[[pz1:watki-ladowanie-plikow|Wątki: ładowanie plików]] ✔ Symbolem ✔ oznaczono zadania planowane w 2022 *[[pz1:watki-obliczenia-rownolegle|Wątki: obliczenia równoległe]] ✔ *[[pz1:watki-winda|Wątki: winda]] *[[pz1:animacja-zderzenia-sprezyste|Wątki i animacja: zderzenia sprężyste kulek (Swing)]] *[[pz1:animacja-zderzenia-sprezyste-javafx |Wątki i animacja: zderzenia sprężyste kulek (Java FX)]] *[[pz1:java-zombie|Wątki i animacja: gra Java Zombie]] ✔ *[[pz1:java-movielens|Movielens]] *[[pz1:java-spring|Spring: pierwsze kroki]] ===== Uwagi ===== *Zmiennych w stylu ''Map 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ć: [[https://projectlombok.org/features/constructor|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 [[https://projectlombok.org/features/GetterSetter|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 ===== * {{::java:w1-java-wprowadzenie.pdf |Wykład 1: Wprowadzenie,​ ogólny opis języka}} * {{ ::java:w2-3-java-skladnia.pdf |Wykład 2-3 Elementy składni, rozmieszczenie obiektów w pamięci, klasa String, tablice}} * {{ :java:w4-5-java-klasy.pdf |Wykład 4-5 Klasy, pola, metody, konstruktory,​ klonowanie}} * {{ ::java:w6-java-interfejsy-klasy-wewnetrzne.pdf | Wykład 6 Intefejsy, klasy wewnętrzne,​ wyliczenia}} * {{ :java:w7-java-wyjatki.pdf |Wykład 7 Wyjątki}} * {{ :java:w8-java-generics.pdf |Wykład 8 Typy generyczne}} * {{ :java:w9-java-lambdas.pdf |Wykład 9 Wyrażenia lambda i strumienie}} * {{ :java:w10-java-threads.pdf |Wykład 10 Wątki}} * {{ :java:w11-java-gui.pdf |Wykład 11 GUI (AWT + Swing)}} ===== Ciekawostki ===== *[[pz1:galeria_choinek_2022|Galeria choinek 2022]] *[[po:galeria_choinek|Galeria choinek 2017]] [[https://advancedweb.hu/a-categorized-list-of-all-java-and-jvm-features-since-jdk-8-to-18/|Zmiany w języku Java 8 - 18]]