Wpis z mikrobloga

Mirki od #uml mam zamodelować system w którym mam pompę. Ta pompa może być włączana/wyłączana automatycznie przez system(w zależności od zmierzonego przez czujniki poziomu wody), przez Operatora(jeśli poziom wody znajduje się pomiędzy dopuszczalnymi wartościami), przez Supervisora(w dowolnym momencie, jego decyzja nadpisuje działanie pompy ustalone przez dwóch poprzednich).
Nie do końca wiem jak to powinno wyglądać na diagramie klas. Z diagramu, który wrzucam teraz wynika, że w zasadzie każdy z tej trójki może włączać i wyłączać pompę na tych samych zasadach, bo obie funkcje w klasie Pump są publiczne. Myślałem żeby zrobić jakąś funkcję abstrakcyjną i po prostu wymusić osobne implementacje w zależności od "wywołującego" ale nie bardzo wiem jak to przedstawić graficznie i w sumie nie wiem czy w ogóle kombinuję w dobrą stronę. Ktoś pomoże?
#programowanie #informatyka
FantaZy - Mirki od #uml mam zamodelować system w którym mam pompę. Ta pompa może być ...

źródło: comment_ftVk5j8NJkvFb7caHB7eGlxufncbRUpC.jpg

Pobierz
  • 15
Najprostsze rozwiązanie jakie widzę to po prostu wstawić funkcje "startPump()", "stopPump()" do "User'a" jako abstrakcyjną i "zaimplementowaną" do "System" i zrezygnować z klasy Pump ale to chyba nie jest eleganckie rozwiązanie.(?)
@FantaZy: Nie wiem czy dobrze pamiętam, ale wydaje mi się że możesz dodać te metody do User'a a to czy poszczególne klasy dziedziczące będą mogły z tej metody korzystać, to raczej rozwiązuje się na dalszych etapach projektu a nie na diagramie klas (miałem analogiczną sytuację, klasa abstrakcyjna "Pracownik" korzystała z metody "dodaj_pracownika", ALE nie każdy pracownik mógł z tej metody skorzystać).

Druga kwestia, jesteś pewien że pomiędzy Userem i Systemem powinna
@VukoPL: w sumie może masz rację z tym systemem, że jak on padnie to dalej User może włączać,wyłączać pompę. Zapomniałeś jeszcze, że i System może włączać/wyłączać pompę i w takim przypadku chyba dojdzie do tego, że zarówno System jak i User będą posiadały te same metody - "startPump()", "stopPump". Zastanawiałem się czy nie możnaby tego załatwić jakimś wzorcem projektowym ale niestety niczego nie udało mi się znaleźć. Trochę słabo się orientuję
@FantaZy: no jezeli system padnie a user dalej bedzie mógł włączyć pompę to miedzy userem a pompą tez musi byc asocjacja :)

Poza tym jeśli na dalszych etapach będziesz tez robił diagram sekwencji, to tam w zasadzie wychodzą wszystkie brakujące metody i można je wtedy pododawać

przyszła mi do głowy jeszcze jedna rzecz. Robiąc diagramy uml'a projektujesz w zasadzie jakiś system informatyczny, czy więc powinna być w nim klasa System? bo
Robiłem, i zrobiłem go tak, że wszystkie te przypadki użycia takie jak: "start/stop pump", "measure methane level" , "log into the system" , "start alarm" , "measure water level" które mam w owalach. Wszystkie są wewnątrz dużego prostokąta o nazwie "System".
@VukoPL: ok, wykminiłem to tak, że stworzę <> Pump, który będzie miał te 4 metody i po prostu System i User będzie musiał zaimplementować te metody. A methan sensor który może tylko zatrzymać pompę będzie implementował stopPump, a dla startPump będzie rzucał wyjątek "nonImplementedException". #taktyk
@FantaZy: w sumie, to możesz chyba miec metode startPump() w klasie Pump ktora "fizycznie" uruchamia pompę, i metode startPump() w klasie User, ktora odwoluje sie do metody startPump() z klasy Pump, i wtedy w klasie methanSensor ja bym w ogóle nie tworzyl metody StartPump() bo rozumiem że z tego poziomu nigdy nie będzie wywoływana tak?
@VukoPL: taki wariant też rozpatrywałem ale w końcu to nie wiedziałem co z tymi uprawnieniami do uruchamiania pompy(bo Supervisor, Operator i Methane sensor uruchamiają na innych zasadach). Czy to na diagramie klas nie musi być przedstawione i jak wszystkie metody będą w klasie Pump to będzie git? A gdzieś na diagramach behavioralnych dopiero przedstawię kiedy kto może uruchamiać jakąś metodę?
Tylko mi się to trochę kupy nie trzyma, bo ani System,
@FantaZy: wydaje mi się, że na diagramie klas nie należy wchodzić w taki poziom szczegółowości. Tak jak pisałem wcześniej jeżeli masz klase User i ona ma metode X to nie znaczy ze wszystkie klasy dziedziczące muszą mieć do niej dostęp, jest to ograniczane ale raczej na dalszych etapach projektu.

na diagramie klas powinieneś w zasadzie pokazać jakie są klasy, jakie mają atrybuty i metody oraz czy istnieja miedzy nimi powiazania i
@VukoPL: tak na studia, ale teraz są święta :P Ogólnie #!$%@? mnie to jak UML jest zawsze przedstawiany. Wyrecytują slajdy, pokażą przykład który krąży w internecie, czyli pompa insulinowa i bawcie się. Z gościem nie narysowaliśmy ani jednego przykładu. Wzorcow projektowych też nie zastosuje bo nie bardzo wiem jak, a na siłę też nie chcę wciskać. Trochę kicha ogólnie. Deadline to 11 styczeń. Ale po drodze mam egzaminy i jeszcze jeden
@FantaZy: jeszcze raz podkreślę, że przedstawiam tylko subiektywny punkt widzenia na przedstawiony problem, jak wspomniałem ekspertem nie jestem więc mozliwe że Twoje rozumowanie jest poprawne, poddaję tylko w wątpliwość elementy które ja bym zrealizował inaczej, ale w żadnym wypadku nie czuje się kompetentny żeby powiedzieć że coś masz definitywnie źle lub dobrze, musiałby na to spojrzeć ktoś bardziej oblatany w temacie ;)
@VukoPL: jasne! Tak czy owak dzięki za pomoc i wspólną dyskusję. Trochę czasu zeszło na kontemplację nad tym, a teraz po prostu siadam i będę robił, bo można tak w nieskończoność kombinować :P