# Zajęcia laboratoryjne z programowania grupa nr 11 studia zaoczne 2022/2023 ## Cele przedmiotu Celem przedmiotu jest zapoznanie studentów z procesem pracy nad złożonym serwisem internetowym z uwzględnieniem różnych jego aspektów (przetwarzanie danych, współpraca z bazą danych, komunikacja sieciowa, wymiana informacji pomiędzy różnymi elementami systemu informatycznego, interfejs użytkownika). W ramach przedmiotu studenci wykonują samodzielnie różne podmoduły projektu, które ostatecznie integrują w jeden złożony serwis. Student otrzymuje *dowolność w wyborze technologii*, z której będzie korzystał w celu wykonania projektu, ale ma także możliwość wyboru ścieżki wyznaczonej przez prowadzącego. Przedmiot oceniany jest na podstawie indywidualnych obron projektów. ## Wymagania wstępne w zakresie wiedzy, umiejętności oraz kompetencji społecznych Wymagania: Znajomość zasad programowania obiektowego, wiedza z zakresu: Technologii Internetowych, Systemów Operacyjnych, Baz Danych. Umiejętność pracy z materiałami dodatkowymi, samodzielnego pozyskiwania informacji i analizy przykładów. ## Zagadnienia poruszane na laboratorium 1. Przygotowanie środowiska programistycznego: - utworzenie repozytorium, - wybór edytora kodu źródłowego, - logowanie komunikatów. - pomiar pokrycia kodu testami, - automatyczna weryfikacja kodu, - automatyzacja (zapewnienie testowania, kompilowania, pomiaru pokrycia kodu i jego weryfikacji, oraz budowy artefaktów programistycznych za pomocą jednego polecenia), 2. Programowanie sterowane przez testy: - rodzaje testów, - testy jednostkowe: - Red-Green-Refactor; - testy behawioralne; - asercje; - mockowanie; - testy sparametryzowane, - testy eksploracyjne, - debuggowanie kodu: - dobre praktyki, - krokowe uruchamianie programu, - przerwania warunkowe, - zdalne debuggowanie. 3. Paradygmat programowania funkcyjnego: - logika predykatów, - funkcje i ich składanie, - wyrażenia lambda, - wzorzec projektowy map-reduce, - wzorzec projektowy Maybe (wartości opcjonalne) i obsługa wartości `null`, - wzorzec projektowy Try: obsługa wyjątków, - wzorzec projektowy Either i Railway Oriented Programming, - algorytm dziel i zwyciężaj na przykładzie wielowątkowego przetwarzania strumieniowego. 4. Serializacja i deserializacja danych: - wczytywanie i zapisywanie danych w XML, - wczytywanie i zapisywanie danych w JSON. 5. Mapowanie obiektowo-relacyjne (ORM): - obiekty do transferu danych (DTO), - obiekty dostępu do danych (DAO), - model CRUD, - optymalizacja dostępu (natywne zapytania SQL). 6. Usługi sieciowe: - dostęp do zewnętrznych usług sieciowych REST: - z linii poleceń (curl); - z dedykowanej aplikacji klienckiej; - z własnoręcznie napisanego kodu, - tworzenie usług sieciowych w oparciu o REST API: - metody dostępu (GET, POST, PUT, DELETE); - obsługa nieprawidłowych żądań: kody błędów; - obsługa różnych formatów wartości zwracanej, - obsługa generowania pliku "w locie", - obsługa wgrywania plików na serwer. 7. Serwery aplikacji: - osadzanie aplikacji, - monitorowanie osadzonej aplikacji, - debuggowanie aplikacji (patrz zdalne debuggowanie). 8. Interfejs użytkownika i logika biznesowa: - serwowanie plików statycznych, - obsługa odwołań i przekierowań, - integracja z zewnętrznym frameworkiem, - warstwa logiki biznesowej. 9. Integracja usług sieciowych: - zabezpieczanie usług OAuth, - autoryzacja i korzystanie z zewnętrznych usług. ## Kryteria zaliczenia Zaliczenie zajęć polega na (inkrementalnym!) przygotowaniu projektu, który pokrywa zagadnienia poruszane na zajęciach: - Zagadnienia 1-3 – 20% oceny (20 punktów do zdobycia), - Zagadnienia 4-6 – 40% oceny (40 punktów do zdobycia), - Zagadnienia 7-9 – 40% oceny (40 punktów do zdobycia). ### Dodatkowe punkty Dodatkowe punkty można zyskać za: - aktywność na zajęciach, - prawidłową dekompozycję kodu: - segregacja interfejsów; - kohezja na poziomie klasy i metody; - konsekwentną i logiczną organizację kodu w pakiety (np. zastosowanie Domain Driven Design), - czystość kodu (ang. Clean Code): - odpowiednie (ang. meaningful), anglojęzyczne nazwy zmiennych, metod, klas i pakietów; - posortowanie atrybutów i metod według kolejności użycia lub wywołania; - minimalizację liczby parametrów wywołania metod (lub funkcji); - powstrzymanie się od korzystania z efektów ubocznych, niemutowalność; - upewnienie się że metoda i klasa robi jedną rzecz (patrz kohezja); - odpowiednią liczbę metod publicznych w klasie (do siedmiu); - właściwą liczbę linii kodu w metodzie (5 +/- 2, przy czym strumienie należy liczyć jako jedną linię), - stosowanie zasad: - SOLID; - YAGNI/KISS; - DRY, - zastosowanie wzorców projektowych nieujętych w zagadnieniach (Uwaga! Tam gdzie to ma sens), - zastosowanie metodologii Test Driven Development, szczególnie w odmianie Behavior-Driven Development, - zastosowanie paradygmatu funkcyjnego wszędzie gdzie się da. ### Oceny | Punkty | Ocena | |:------:|:-----:| | do 50 | niedostateczny (2.0 | | 51 do 60 | dostateczny (3.0) | | 61 do 70 | dostateczny plus (3.5) | | 71 do 80 | dobry (4.0) | | 81 do 90 | dobry plus (4.5) | | powyżej 90 | bardzo dobry (5.0) |