@_flamingAccount
Graf to dobry punkt wyjścia ale to nie pełny model. Graf w nie reprezentuje ani stanu ani algorytmu, a maszna stanów ma oba
Do reprezentacji aktualnego stanu (wierzchołka w grafie) potrzebujesz 1 pola. Algorytm poruszania się po grafie, to 1 linijka mieszcząca się na standardowym ekranie.
Minute, 5min? znajdujesz klase reprezentujaca anulowanie, do pisujesz wysłanie maila.
NIe bardzo, bo przy 30 stanach masz 30 Klas, z których każda ma własną implementację. Akcja X może powodować zmian A -> B, C->D.
@WeiXiao
switch statement
Tak, można mieć switch po typach sealed. O punkt lepiej.
@_flamingAccount
Kolejne mało metytoryczne pytanie.
Moim zdaniem bardzo merytoryczne - podatność na zmiany, to jedno z podstawowych kryteriów jakości kodu.
Argumentacja ze stan tez jest grafem mnie nie przekona, bo nie zaimplemetujesz 4 miliardow mozliwych roznic w intach jako graf.
Co to wnosi do dyskusji? Wiadomo, że kalkulator działający na int, czy float dałoby się teoretycznie zapisać jako graf stanów. Wiadomo też, że to bez sensu. Hindusi aż tak tani nie są.
Jeżeli zamiast metod miało byc którego stanu uzyc, przed pobraniem danych. to to jest głupie. Nie da sie, najpiew pobierasz potrzebna informacje potem decydujes z definicji.
No to jest głupie, dlatego to krytykuję. Pobieram jakieś dane, odczytuję stan, pakuję to w odpowiadający mu wrapper z metodami możliwymi do wywołania i go zwracam. No i w jaki sposób metoda która tego obiektu potrzebuje, ma wiedzieć co to za typ specyficzny?
@LukeJL
Wg mnie wewnętrznie obiekty mogą sobie być w różnych stanach, jednak to, w jaki sposób dane obiekty współpracują ze sobą, to trochę co innego. Możliwe, że nie ma sensu tworzyć globalnie stanów, w których jest cała aplikacja (stany mogą być poukrywane w poszczególnych obiektach).
No możliwe. Można przecież taki wniosek urlopowy przypisywać do stanu na podstawie daych w nim zawartych, według jakiejś reguły, np. "jeżelii data zatwierdzenia przez kierownika not null, to zatwierdzony". Zwykle prowadzi to do wypasionej drabinki if'ów, ale są też przypadki, w których taka prosta walidacja wystarczy.
No to łapiemy globalnie ten event cancel i go obsługujemy.
Owszem, jeżeli ten event istnieje i jest jakieś miejsce w którym da się go przechwycić globalnie. W moim przekonaniu, mając 30 stanów, 30 klas je reprezentujących jest też 30 miejsc w których należałoby dopisać wyślijMaila()
No i właściwie jaki macie problem z implementacją, którą proponuję? jedna funkcja eval(stan, akcja) -> stan? Jakie niedostatki tutaj widzicie i dlaczego zrobienie obiektowej struktury klas niby jest lepsze?