Przeczytałem wszystkie książki o tym, dlaczego stworzyć klasę i rzeczy typu "szukaj rzeczowników w swoich wymaganiach", ale to nie wydaje się być wystarczające. Moje zajęcia wydają mi się niechlujne. Chciałbym wiedzieć, czy istnieją jakieś dane lub coś, co mogę porównać z moimi zajęciami i zobaczyć, czy są one dobrze zaprojektowane. Jeśli nie, to kto jest najbardziej szanowanym guru OO, skąd mogę uzyskać odpowiednie wskazówki dotyczące projektowania klas?Opisywanie właściwych klas
Odpowiedz
jeśli jesteś zaznajomiony z projektowania baz danych, a zwłaszcza pojęcie normalizacji, to odpowiedź jest prosta: klasa data-centric powinien reprezentować podmiot w trzeciej postaci normalnej
jeśli to nie pomaga, spróbuj tego zamiast:
- klasa to zbiór elementów danych i sposoby, które działają na nich
- klasa powinna mieć swoistą odpowiedzialność, to znaczy powinien on reprezentować jedną cechę modelu; jeśli reprezentuje więcej niż jedną rzecz, wówczas powinna to być więcej niż jedna klasa.
- wszystkie elementy danych w klasie powinny być logicznie powiązane/powiązane ze sobą; jeśli nie są one, podzielić ją na dwie lub więcej klas
- wszystkich metod w klasie powinna działać wyłącznie na ich parametrów wejściowych i elementów danych klasy - patrz na Law of Demeter
to o ile mogę iść z ogólną abstrakcyjną radą (bez pisania długiego eseju); możesz opublikować jedną ze swoich klas do krytyki, jeśli potrzebujesz konkretnej porady.
@ [Celebrus]: dziękuję –
Uważam, że projektowanie obiektów jest tak samo sztuką, jak nauką. Potrzeba czasu i praktyki, aby zrozumieć, jak zaprojektować czyste eleganckie klasy. Być może, jeśli możesz podać przykład prostej klasy, którą zaprojektowałeś, że nie jesteś zadowolony z tego, że użytkownicy SO mogą krytykować i dawać wskazówki. Nie jestem pewien, czy istnieją ogólne odpowiedzi poza tym, co już przeczytałeś w tekstach.
również, jakiego języka używasz? chociaż OOD jest neutralny językowo, używanie specyficznych dla języka funkcji w klasie może uczynić go czystszym. – Jason
Najbardziej szanowanym guru OO, którego znam osobiście, jest StackOverflow. Połóż tutaj swoje nazwy klasowe i sądzę, że dostaniesz sporą liczbę recenzji.
Dobrze czy bezbożnie? – orbfish
Klasy są zazwyczaj używane do modelowania koncepcji dziedziny problemowej. Gdy masz już dobrze zdefiniowany problem (inaczej zestaw przypadków użycia), będziesz w stanie zidentyfikować wszystkich uczestników. Podzbiór uczestników będzie nieodłącznym elementem systemu, który projektujesz. Zacznij od jednego dużego czarnego pudełka jako systemu. Rozdaj go, kiedy i kiedy będziesz miał więcej informacji. Kiedy masz poziom, na którym nie można ich już podzielić (na pojęcia w domenie twojego problemu), zaczynasz zdobywać klasy.
Ale jest to subiektywny pogląd nie-guru. Proponuję szczyptę soli do menu.
Tworzenie klas, które zaczynają się od czyszczenia, a następnie stają się brudne, jest zasadniczą częścią OO, czyli wtedy, gdy odnawiasz. Wielu programistów próbuje przejść do idealnego projektu klasowego od samego początku, z mojego doświadczenia to po prostu niemożliwe, zamiast tego potykasz się, rozwiązujesz problem, a potem refactor. Możesz zbierać, klasy bazowe i interfejsy w miarę pojawiania się projektu.
jeśli nie wiesz, jak zaprojektować dobrą klasę na pierwszym miejscu, jest szansa, że nie wiesz, jak zmienić klasę, aby była lepsza ... ;-) –
To prawda, ale jego punkt jest również prawdziwy i brakowało go gdzie indziej. – orbfish
Dane? Nie dlatego, że byś im zaufał.
Czy Twoje zajęcia sprawiają, że program działa i utrzymuje go w stanie umożliwiającym konserwację za pomocą wielu wersji?
Jeśli tak, robisz dobrze.
Jeśli nie, zadaj sobie pytanie, dlaczego nie, a następnie zmień to, co nie działa.
Postaraj się skupić na zachowaniu zamiast na strukturze. Obiekty są "żywymi" istotami o zachowaniu i odpowiedzialności. Mówisz im, żeby robili różne rzeczy. Spójrz na podejście CRC-card, które pomoże Ci w ten sposób modelować.
- 1. Algorytm wyznaczania właściwych dzielników
- 2. TFS opisywanie wykryć usunięcie kodu
- 3. opisywanie działkę przy użyciu matplotlib
- 4. Opisywanie sumą dwóch pól pomnożone
- 5. Strategie rozpoznawania rzeczowników właściwych w NLP
- 6. Django opisywanie liczyć z odrębną dziedzinę
- 7. Opisywanie pierwszy miesiąc roku w ggplot2
- 8. Jak mogę używać właściwych modeli obiektowych w CodeIgniter z konstruktorami?
- 9. Opisywanie instancji E2C nie powraca w żaden sposób
- 10. Django opisywanie queryset na konkretnej wartości modelu relacyjnego atrybut
- 11. Jak opisywanie anonimowy obiekt z opcjonalnej właściwości w JSDoc
- 12. jak wykreślić i opisywanie hierarchicznych dendrogramów klastrów w scipy/matplotlib
- 13. Generowanie klas JAXB o niestandardowych nazwach klas
- 14. Jak posortować listę klas klas zawierających właściwości?
- 15. Niestandardowa serializacja json klas uporządkowanych klas scala
- 16. Nie można umieścić znacznika we właściwych współrzędnych za pomocą otwartych warstw 3
- 17. Pobieranie próbek w centrach texel nie daje właściwych rezultatów, OpenGL, C++
- 18. Jak używać klas wyprowadzonych z listy klas Pythona
- 19. Kiedy używać klas wewnętrznych w Javie dla klas pomocniczych
- 20. Jak wygenerować diagram klas z istniejących klas w Netbeans IDE
- 21. Łączenie list klas potomnych z listami klas nadrzędnych
- 22. Czy widoczność klas może być widoczna na diagramach klas UML?
- 23. Generowanie diagramu klas
- 24. Lista klas w zespole
- 25. Automapper i hierarchii klas
- 26. Wiele pochodnych klas abstrakcyjnych?
- 27. UnitTestowanie klas statycznych
- 28. Wiosenne wiele klas @Configuration
- 29. Usuwanie wiele klas (jQuery)
- 30. Wiele klas wewnątrz: nie()
+1, chciałbym również poznać – krebstar