Witam
Jestem początkującym programistą jeżeli chodzi o OOP (wcześniej pisałem strukturalnie).
Mam kilka pytań dotyczących projektowania/programowania obiektowego.
Pytania dotyczą aspektów nad którymi często się zastanawiam pisząc program
aby uzyskać dobrą czytelność jak najmniej powiązań itp. ponieważ uważam,
że OOP ułatwia budowanie aplikacji jeżeli się je dobrze zrozumie i umie wykorzystać.
1)
Czy w tego typu klasie:
class Punkt {
public:
Punkt(int x, int y);
private:
int x,y;
}
może być metoda: bool porownaj(const Punkt& p);
czy to narusza SRP (single responsibility principle) i trzeba stworzyć
do tego nową klasę np Porównywanie? Jak rozpoznać czy klasa ma jedną lub wiele odpowiedzialności?
Z pewnej książki wiem że długość kodu w klasie może być wyznacznikiem ale
mogą być klasy krótkie z wieloma odpowiedzialnościami.
2)
Czy klasa powinna zawierać metodę wyświetl?
(oczywiście taka klasa, której obiekt jest przeznaczony do pokazania go na ekranie)
W w wielu przykładach klas w internecie widziałem, że np klasa Figura abstrakcyjna
ma metodę
wyświetl jednak czytając inne artykuły bardziej o projektowaniu to nie powinno tak być ponieważ
klasa powinna mieć tylko jeden powód do zmiany, a tu by były 2 powody czyli sposób prezentowania na
ekranie i przechowywanie/zmiana informacji o tym obiekcie. Jednak może takie rozumowanie
stosuję się bardziej przy większych aplikacjach z interfejsem użytkownika a w konsoli do
wyświetlenia dowolnego obiektu (np obiekt klasy Element, który przechowuje położenie int x,y; i char znak;)
przyjmuje się że taka metoda dla obiektu może być ?
3)
Jak rozumiem hermetyzacje:
Hermetyzacja to ukrywanie implementacji
a udostępnianie interfejsu. Klient klasy(może być inna klasa, która deleguje odpowiedzialność) nie
musi wiedzieć jak klasa działa, w jaki sposób realizuje usługę, korzysta tylko z interfejsu w celu
zrealizowania swoich działań. Klient klasy nie może odwoływać się do składowych prywatnych tej klasy
(np. poprzez wskaźnik) to by było wbrew zasad hermetyzacji.
Kiedy np mam klasę klasaA
, która składa się z klasy klasaB
a ta jeszcze się składa z klasaC
i potrzebuję informacji o czymś co jest przechowywane i udostępniane przez interfejs w klasie klasaC
to muszę dodać w klasach nadrzędnych(klasaB
i klasaA
) odpowiednie metody aby to zrobić?
Często jak potrzebuję takich informacji i myślę że tyle metod trzeba dodać aby to zrobić to wydaje
mi się, że coś jest źle zaprojektowane, albo obiekty są zbyt powiązane itp.
**4) **
Jak pisać programy tak aby uzyskać jak największą skuteczność
(przez skuteczność rozumiem brak duplikacji kodu, kod czysty, zrozumiały
jak najlepiej odwzorowujący rzeczywistość)
Załóżmy, że istnieją klasy klasaA
i klasaB
oraz ich
instancje obiektA
i obiektB
.
Jak powinno się korzystać z obiektów (np w metodzie głównej programu)
if( obiektA.sprawdz_stan() )
obiektA.wykonaj_czynnosc();
czy lepiej od razu w ciele metody wykonaj_czynnosc()
sprawdzić stan metodą sprawdz_stan() i wykonać czynność?
oraz
if( obiektA.sprawdz_stan() )
obiektB.wykonaj_czynnosc();
czy w obiekcie obiektB
zawrzeć wskaźnik
na obiekt obiektA
i w ciele metody
wykonaj_czynność obiektu obiektB
sprawdzić : if( obiektA->sprawdz_stan() ) obiektB.wykonaj_czynnosc();
Czy są jakieś zasady w związku z tym?
5)
Rozumiem pojęcie kompozycji po prostu obiekt nadrzędny aby
wykonać swoje zadanie zleca innym obiektom zadania podrzędne
przy czym obiekt część nie może istnieć bez całości.
Jak to jest z asocjacją (trochę słabsza zależność od kompozycji)?
Czy często się ją stosuje? Jak ją skutecznie stosować aby uniknąć
zbędnych zależności miedzy obiektami?