Zpo-13-wyk-Slajd26
"Dobry obywatel"
Korzystając z okazji, warto przypomnieć pojęcie dobrego obywatela , użyte przez J. Blocha (współarchitekta języka Java) w odniesieniu do klas spełniających pewne warunki. Klasa jest dobrym obywatelem, jeżeli postępuje w przewidywalny sposób, zatem korzystające z niej klienty mogą czynić pewne założenia dotyczące jej stanu.
Wśród wielu atrybutów dobrego obywatelstwa, z zasadą odwróconego sterowania są związane trzy:
- spójność stanu oznacza, że konstruktor zawsze tworzy prawidłowy obiekt lub zgłasza wyjątek. Dodatkowe metody inicjujące, które muszą zostać wywołane po konstruktorze, są błędem projektowym;
- testowalność , oznaczająca, że klasa wszelkie zależności otrzymuje z zewnątrz. Dzięki temu można zależności zastąpić np. obiektami zastępczymi (ang. mock objects ; zob. wykład nt. testowania jednostkowego);
- szybkie zgłoszenie błędu , które pozwala uniknąć niepotrzebnego zużycia zasobów na nieistotne w kontekście błędu operacje.
Warto zauważyć, że zasada dobrego obywatelstwa, choć odpowiada części warunków stawianych komponentom, jest naruszana przez wiele cieszących się dobrą opinią i dużą popularnością produktów i technologii komponentowych. Jest powszechną praktyką ograniczanie konstruktora obiektu wyłącznie do realizacji podstawowych operacji, które nie spowodują zgłoszenia wyjątku. Rolę "logicznego" konstruktora przejmuje w takim przypadku określona metoda, dzięki czemu można obsłużyć zgłaszane przez nią wyjątki bez konieczności tworzenia nowej instancji obiektu (co miałoby miejsce w przypadku zgłoszenia wyjątku przez konstruktor). Przykładem takiego rozwiązania jest technologia Java Servlets, w której cyklem życia serwletu zarządza kontener, i on fizycznie tworzy instancje tej klasy. Programista ma do dyspozycji jedynie metody związane z cyklem życia: init (), wykonywaną tuż po utworzeniu obiektu, oraz destroy (), związaną z jego finalizacją.
Dlatego stosowanie się do zasady dobrego obywatelstwa zależy od przyjętej filozofii projektowania i nie należy bezwzględnie jej przestrzegać.