Tomasz Gądek Home Page

tgadek.bitbucket.io

Testowanie i Jakość Oprogramowania

Laboratorium 8: OOP.

OOP

Programowanie obiektowe (ang. Object-Oriented Programming) to paradygmat programowania, który opiera się na koncepcji obiektów. Obiekty są instancjami klas, które definiują ich właściwości i zachowanie. Programowanie obiektowe umożliwia tworzenie bardziej złożonych i elastycznych aplikacji poprzez organizację kodu w moduły.

Paradygmaty programowania obiektowego

Programowanie obiektowe opiera się na kilku kluczowych paradygmatach:

  • Abstrakcja: Proces ukrywania szczegółów implementacji i przedstawiania tylko istotnych cech obiektu.
  • Enkapsulacja: Proces grupowania danych i metod w jedną jednostkę (klasę) oraz ograniczania dostępu do niektórych jej elementów.
  • Dziedziczenie: Mechanizm, który pozwala na tworzenie nowych klas na podstawie istniejących, dziedzicząc ich właściwości i metody.
  • Polimorfizm: Zdolność różnych klas do implementacji tych samych metod, co pozwala na użycie tych samych interfejsów w różnych kontekstach.

Zadanie - setter()

setter() jest odpowiedzialny za zmianę "wnętrza" obiektu. Jeśli zaimplementujesz go niedbale, może narobić bałaganu. Weryfikuj, czy podajesz sensowne dane, pilnuj, aby wszystko w obiekcie do siebie pasowało po zmianie. Możesz łatwo "zepsuć" swój obiekt i wprowadzić go w zły stan.

Prosty przykład: Wyobraź sobie setter set_age(). Jeśli pozwala ci wpisać -5 lat, to coś jest nie tak z Twoim obiektem user. Masz okazję poprawić implementację klasy.

Porady dotyczące tworzenia metod ustawiających.

  • Sprawdzaj, co wpisujesz: Upewnij się, że wiek nie jest ujemny.
  • Pilnuj porządku: Jeśli zmiana wzrostu wpływa na BMI, setter wzrostu powinien też zaktualizować BMI.
  • Pomyśl dwa razy: Czy naprawdę potrzebujesz tylu setterów? Może zamiast zmieniać wszystko po kawałku, lepiej zrobić jedną akcję, która logicznie zmienia stan obiektu.

Zadanie - getter()

getter() jest odpowiedzialny za bezpieczny odczyt danych z "wnętrza" obiektu. Jeśli zaimplementujesz go niedbale, możesz ujawnić zbyt wiele. Getter powinien być prosty, ale przemyślany – upewnij się, że zwraca dane w odpowiedniej formie i nie zdradza więcej, niż powinien.

Klasa Transfer posiada niebezpieczny getter(). Zobacz, jak łatwo można naruszyć integralność kluczowej operacji finansowej z zewnątrz. Obiekt, reprezentujący gotówkę klienta, jest uszkodzony. Napraw go stosując kopię defensywną.

Zadanie - OOP i Flask

Pobierz aplikację flask-figure-app, skopiuj ją do katalogu źródłowego src i uruchom moduł app.py.

Flask Figure App

Aplikacja jest prostą aplikacją webową, która pozwala na zmianę kolorów figur geometrycznych. Używa Flask do obsługi żądań HTTP i renderowania szablonu HTML.

Wykonaj refaktoryzację kodu i spełnij wymagania:

  • Zdefiniuj klasy (Figure, Square, Circle, Triangle) reprezentujące figury z atrybutami i metodami.
  • Utwórz kolekcję (np. słownik figures) przechowującą instancje figur.
  • Utwórz dedykowaną klasę (serwis) odpowiedzialną za zarządzanie stanem figur.
  • Zaimplementuj w serwisie metody do pobierania stanu kolorów figur w spójnym formacie (np. słownik).
  • Użyj serwisu w module app.py. Zmodyfikuj funkcje obsługi żądań HTTP, aby korzystały z metod utworzonego serwisu do interakcji z figurami.

Wiem, że nic nie wiem

~Sokrates