Cytat
Jeśli dobrze zrozumiałem to robiąc diagram klas mam skupić się na faktycznych czynnościach jakie wykonują kluczowe obiekty, a to w jaki sposób coś robią i za pośrednictwem czego mogę ukryć lub pominąć, tak?
'W jaki sposób' - to już kwestia implementacji i nie jest to istotne na etapie projektowania. No chyba, że wymagania pozafunkcyjne mówią co innego:)
'Za pośrednictwem czego' - to powinno być w modelu, ponieważ powinien on w jasny sposób przedstawiać asocjacje i zależności. U mnie to najczęściej wygląda tak, że mam diagram, na którym przedstawiam powiązania i zależności między klasami (na nim są tylko nazwy klas), a dokładniejszy ich opis jest na kolejnych diagramach. Dzięki czemu przedstawiając ten pierwszy jestem w stanie przedstawić ogólną ideę. Jeżeli nie ma żadnych uwag, to mogę przejść do bardziej szczegółowego opisu, czyli przedstawienia klas wraz z atrybutami i metodami. Oczywiście takie rozbijanie ma sens, jeżeli przedstawiany diagram składa się z wielu klas. W innym przypadku można sobie podarować takie rozdrabnianie:)
Cytat
[...] najpierw była analiza [...] określenie wymagań [...] przypadki użycia [...] i diagramy stanów [...] projekt bazy danych [...]
Kolejność jest mniej więcej taka
1) Określenie wymagań funkcjonalnych i niefunkcjonalnych. Te drugie, najczęściej, w dalszych etapach, będą zwiększały swoją obiętość

Poczytaj o
FURPS+.
2) Rozmowy z klientem i użytkownikami systemu. Na tej podstawie powstają scenariusze.
3) Tworzenie przypadków użycia na podstawie zebranych scenariuszy.
4) W między czasie powstaje słownik ze wszystkimi nazwami itp. Chodzi o to, żeby i dla klienta i dla programisty wszystko było jednoznaczne.
5) Na tym etapie możliwe, że będziesz potrzebował ponownie wrócić do wcześniejszych punktów. Ogólnie trwa to do momentu, gdy wszystkie przypadki użycia są zadowalające.
6) W tym momencie dopiero zaczyna się analiza:) Najpierw identyfikujemy obiekty encji, brzegowe i sterujące. Pomocne tutaj mogą być heurystyki Abbotta (także na innych etapach projektowania:), niestety nie znam żadnego dobrego linku:(
7) Na podstawie zidentyfikowanych obiektów powstają diagramy sekwencji.
8) Dla obiektów o długim czasie życia warto jeszcze stworzyć diagramy stanów.
9) Na podstawie zebranych informacji tworzymy diagramy klas:)
Punkty 7-9 nie muszą być realizowane w takiej kolejności. To już zależy od indywidualnego podejścia.
Projekt bazy danych moim zdaniem powinien powstać dopiero w momencie, gdy są gotowe już wszystkie diagramy klas, ponieważ dopiero na podstawie prawidłowo zidentyfikowanych obiektów encji jesteś w stanie stworzyć dobrą bazę danych.
Co do makiety GUI, to może być przedstawiona klientowi, gdzieś między 3-5 punktem, gdy już wiadomo mniej więcej, co dany system ma robić.
@up after your last edit:)
Cytat
To co napisał bastard13 wydaje mi się jednak być w sprzeczności ze słowami Crozin (albo odwrotnie), bo jeśli mam ukrywać szczegóły implementacji to powinienem pozbyć się z diagramu tych wszystkich managerów
To nie jest sprzeczne. Przez implementację miałem na myśli ciało metod. Crozin przedstawił ci projekt za pomocą kodu.
Ogólnie diagram powinien zawierać wszystkie klasy, które planujesz wykorzystać. Jednak nie musisz pisać, że Controller dziedziczy po Zend_Controller i wypisywać wszystkich metod, które tam się znajdują, bo to już nie należy do dziedziny aplikacji, którą projektujesz.
Kilka uwag:
1) Atrybuty klas powinny być prywatne (Invoice).
2) Rozumiem, że InvoiceMapper służy do zapisu i pobierania danych. Takie metody powinny znajdować się w klasie Invoice.
3) Nie ma potrzeb powtarzania metod i atrybutów i w klasach bazowych i dziedziczących. To oczywiste, że jeżeli AbstractSingleObjectDAO posiada metodę getById(), to klasy potomne również ją posiadają. Coś takiego ma sens tylko wtedy, jeżeli klasa abstrakcyjne deklaruje metodę abstrakcyjną, a dopiero w klasie potomnej jest ona implementowana.
4) Wydaje mi się, że klasy InvoiceManager i InvoiceDAO mogły być połączone w jedną klasę. Tak samo InvoiceListManager i InvoiceListDAO.
5) List powinien być kolekcją Single, a u ciebie jest totalny brak powiązania między nimi, nie licząc oczywiście klasy InvoiceMapper.
6) I nazwy klas abstrakcyjnych powinny być pisane pochyłą czcionką