2012-12-03 15 views
17

Próbuję dostać się do OOP ostatnio i mam problemy z SOLID zasadami i wzorami projektowymi. Rozumiem, dlaczego ludzie ich używają i naprawdę chcę też z nich korzystać, ale nie mogę się skupić na rozwijaniu moich klas do specyfikacji. Byłbym wdzięczny za wszystko, co pomogłoby mi zrozumieć takie rzeczy.Nie można zrozumieć SOLIDNYCH zasad i wzorców projektowych

+1

Myślę, że dobre zrozumienie tego jest możliwe tylko z doświadczeniem zawodowym, ważne jest doświadczenie w zespole z DOBRYMI programistami. – sll

+0

Myślę, że powinieneś być trochę bardziej konkretny, może do konkretnej zasady, która sprawia ci kłopoty. –

+0

Spróbuj uczyć się od anty-wzorców. Spróbuj napisać małą aplikację, która celowo narusza porady SOLID i aplikację, która podąża za radą i widzi, co jest mniej bolesne w pisaniu. – MatthewMartin

Odpowiedz

51

Zrobiłem zajęcia w college'u, które spędziłem dwa tygodnie na projektowaniu wzorów i przeczytałem książkę Gang of Four bez rezultatu. Zrozumienie, na czym polega każdy z obsługiwanych wzorców i jak z nich korzystać, by pasowało do moich problemów, było bardzo trudne dla mnie, programisty, który nie miał dużego doświadczenia w programowaniu OO.

Książka, która naprawdę mnie kliknęła, to Head First Design Patterns. Zaczyna się od pokazania problemu, różnych podejść rozważanych przez deweloperów, a następnie w jaki sposób wykorzystali wzór projektu, aby go naprawić. Używa bardzo prostego języka i sprawia, że ​​książka jest bardzo wciągająca.

Wzorce projektowe w końcu są sposobem na opisanie rozwiązania, ale nie musisz mieć, aby dostosować swoje zajęcia do rozwiązania. Pomyśl o nich bardziej jako o przewodniku, który sugeruje dobre rozwiązanie szerokiej gamy problemów. Dyskusja

Miejmy o stałej:

  1. pojedyncze odpowiedzialność. Klasa powinna mieć tylko jedną odpowiedzialność. Oznacza to, że na przykład klasa Person powinna martwić się tylko problemem domeny dotyczącym samej osoby, a nie na przykład jej trwałością w bazie danych. Do tego celu możesz użyć np. PersonDAO. Klasa Person może chcieć, aby jej obowiązki były jak najkrótsze. Jeśli klasa używa zbyt wielu zewnętrznych zależności (czyli innych klas), jest to symptom, że klasa ma zbyt wiele obowiązków. Ten problem często pojawia się, gdy programiści próbują modelować rzeczywisty świat za pomocą obiektów i zabierają go za daleko. Luźno powiązane aplikacje często nie są bardzo łatwe w nawigacji i nie dokładnie modelują działanie prawdziwego świata.
  2. Otwarte Zamknięte. Klasy powinny być rozszerzalne, ale nie można ich modyfikować. Oznacza to, że dodanie nowego pola do klasy jest w porządku, ale zmiana istniejących rzeczy nie jest. Inne komponenty programu mogą zależeć od tego pola.
  3. Zastępstwo Liskov. Klasa, która oczekuje, że obiekt typu zwierzę będzie działał, jeśli zostanie przekazany pies z podklasy i kot z podklasy. Oznacza to, że zwierzę NIE powinno mieć na przykład metody zwanej korą, ponieważ podklasy typu kota nie będą mogły się szczekać. Klasy, które używają klasy Zwierząt, również nie powinny zależeć od metod należących do klasy Dog. Nie rób takich rzeczy jak "Jeśli to zwierzę jest psem, to (rzuca zwierzęciem na psa) kora, jeśli zwierzę to kot, wtedy (rzuca zwierzęcia na kota) miau".
  4. Zasada podziału interfejsu. Trzymaj swoje interfejsy jak najmniejsze. Nauczyciel, który również jest uczniem, powinien implementować interfejsy IStudent i ITeacher, zamiast jednego dużego interfejsu o nazwie IStudentAndTeacher.
  5. Zasada zależności inwersji. Obiekty nie powinny tworzyć swoich zależności, ale powinny być do nich przekazywane. Na przykład samochód, który ma obiekt Engine w środku, nie powinien robić engine = new DieselEngine(), ale raczej silnik powinien być przekazany do niego na konstruktorze. W ten sposób klasa samochodów nie będzie sprzężona z klasą DieselEngine.
+5

+1 za rekomendację książki. Książka wzorów wzorów GoF jest trudna do zrozumienia. Książka "Head First" jest absolutnie niezbędna, aby przejść do następnego poziomu programowania. –

+7

** 1) ** Powinien mieć jeden powód do zmiany. To różni się od jednej odpowiedzialności. ** 2) ** Nie. Nie powinieneś w ogóle modyfikować klas. Rozszerzenie to to samo co dziedziczenie. ** 3) ** Może mieć metodę "Bark", jeśli ma również metodę "CanBark". ;) ** 4 ** Prawidłowy, ale dość kiepski przykład;) ** 5 ** To zastrzyk zależności. Inwersja zależności mówi, że powinieneś polegać na abstrakcjach, a moduły wyższego poziomu powinny zależeć od modułów niższego poziomu, a nie odwrotnie. – jgauffin

+0

Rozpocząłem czytanie tej książki. To znacząca pomoc. Dzięki. – will

Powiązane problemy