Przedstawiony kod łamie jedną z fundamentalnych zasad SOLID. Którą?
Przedstawiony kod łamie jedną z fundamentalnych zasad SOLID. Którą?
Wyjaśnienie i uzasadnienie dydaktyczne
Poprawna odpowiedź: C
Uzasadnienie i szersze wyjaśnienie:
Zasada jednej odpowiedzialności (Single Responsibility Principle - SRP), pierwsza z zasad SOLID, mówi, że każda klasa (lub moduł) powinna mieć tylko jeden powód do zmiany. Innymi słowy, powinna być odpowiedzialna tylko za jeden, spójny aspekt funkcjonalności systemu.
Przeanalizujmy przedstawioną klasę ReportManager:
- Posiada ona metodę
GenerateReport, która jest odpowiedzialna za tworzenie (generowanie) treści raportu. Jest to jedna odpowiedzialność. - Posiada również metodę
SaveReportToFile, która jest odpowiedzialna za zapisywanie raportu do systemu plików. Jest to zupełnie inna odpowiedzialność, związana z operacjami wejścia/wyjścia.
Klasa ReportManager ma więc dwa powody do zmiany:
- Zmiana logiki generowania raportu (np. zmiana formatu, dodanie nowych danych).
- Zmiana sposobu zapisu (np. zapis do bazy danych zamiast pliku, dodanie kompresji).
Posiadanie dwóch różnych odpowiedzialności w jednej klasie jest bezpośrednim złamaniem zasady jednej odpowiedzialności. Poprawna refaktoryzacja polegałaby na rozbiciu tej klasy na dwie mniejsze, np. ReportGenerator i ReportSaver.
Dlaczego pozostałe odpowiedzi są nieprawidłowe?
- A. Zasada otwarte-zamknięte: Mówi, że byty programistyczne powinny być otwarte na rozszerzenia, ale zamknięte na modyfikacje. Problem w kodzie nie dotyczy rozszerzalności, a mieszania odpowiedzialności.
- B. Zasada podstawienia Liskov: Dotyczy poprawnego działania polimorfizmu w hierarchii dziedziczenia. W tym przykładzie nie ma żadnej hierarchii klas.
- D. Zasada odwrócenia zależności: Mówi, że moduły wysokiego poziomu nie powinny zależeć od modułów niskiego poziomu, a obie powinny zależeć od abstrakcji. W tym prostym przykładzie nie widać problemów z zarządzaniem zależnościami, a problem ze spójnością samej klasy.
Chcesz poćwiczyć całą kwalifikację INF.04?
Egzamin próbny na czas, nauka działami, losowe pytanie albo przegląd całej bazy — wszystko w przeglądarce i bez zakładania konta.
Pojęcia z tego pytania
- Zasady SOLIDPięć fundamentalnych zasad projektowania obiektowego: SRP, OCP, LSP, ISP oraz DIP, zwiększających czytelność, elastyczność i łatwość utrzymania kodu.
- Dziedziczenie (Inheritance w OOP)Mechanizm programowania obiektowego pozwalający klasie pochodnej (podrzędnej) na przejęcie pól i metod z klasy bazowej (nadrzędnej) oraz ich rozszerzenie lub modyfikację.
- Polimorfizm (Wielopostaciowość w OOP)Cecha programowania obiektowego pozwalająca na jednakowe traktowanie obiektów różnych klas pochodnych za pośrednictwem wspólnego interfejsu lub klasy bazowej z różną implementacją zachowań.
Podobne pytania z działu „Wzorce projektowe i architektura”
Ten sam obszar materiału z kwalifikacji INF.04. W całej bazie znajdziesz 14 pytań z tego działu.
- #30
Który wzorzec projektowy najlepiej pasuje do opisu: „Chcemy zapewnić, że w aplikacji istnieje dokładnie jedna instancja danej klasy, a dostęp do niej jest globalny”?
- #31
Który wzorzec projektowy najlepiej pasuje do opisu: „Obiekt może tworzyć różne typy innych obiektów, ale decyzja o tym, jaki obiekt stworzyć, jest podejmowana podczas działania programu”?
- #32
Który wzorzec projektowy najlepiej pasuje do opisu: „Chcemy umożliwić tworzenie skomplikowanego obiektu krok po kroku, a różne konfiguracje tego obiektu mogą być tworzone przez różne implementacje”?
- #33
Który wzorzec projektowy najlepiej pasuje do opisu: „Kiedy stan obiektu zmienia się, wszystkie jego zależności (obserwatorzy) są o tym informowane i automatycznie aktualizowane”?
- #130
Stosowanie wzorca Obserwator w programowaniu aplikacji WEB ma na celu: