Istnieje wiele prawidłowych sposobów rozwiązania problemu. Basile Starynkevitch zaproponował podejście „zero biurokracji”, które pozostawia prosty interfejs i polega na programiście używającym odpowiednio interfejsu. Chociaż podoba mi się to podejście, przedstawię inne, które ma więcej eingineeringu, ale pozwala kompilatorowi wykryć pewne błędy.
Określ, w jakich stanach może znajdować się Twoje urządzenie, as Uninitialised
,
Started
, Configured
i tak dalej. Lista musi być skończona.¹
Dla każdego stanu określ struct
gospodarstwo niezbędne dodatkowe informacje istotne dla tego stanu, npDeviceUninitialised
,
DeviceStarted
i tak dalej.
Zapakuj wszystkie zabiegi w jeden przedmiot DeviceStrategy
którym metody wykorzystują struktury zdefiniowane w 2. jako dane wejściowe i wyjściowe. W związku z tym możesz mieć DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)
metodę (lub dowolną równoważną, zgodną z konwencjami projektu).
Przy takim podejściu prawidłowy program musi wywoływać niektóre metody w sekwencji wymuszonej przez prototypy metody.
Różne stany są niepowiązanymi obiektami, wynika to z zasady substytucji. Jeśli użyteczne jest, aby struktury te miały wspólnego przodka, przypomnij sobie, że wzorzec odwiedzających może być użyty do odzyskania konkretnego typu wystąpienia klasy abstrakcyjnej.
Chociaż opisałem w 3. wyjątkową DeviceStrategy
klasę, zdarzają się sytuacje, w których możesz chcieć podzielić jej funkcjonalność na kilka klas.
Podsumowując je, kluczowe punkty opisanego przeze mnie projektu to:
Ze względu na zasadę podstawiania obiekty reprezentujące stany urządzeń powinny być wyraźne i nie mogą mieć specjalnych relacji dziedziczenia.
Pakuj zabiegi urządzeń w obiekty startowe, a nie w obiekty reprezentujące same urządzenia, tak aby każde urządzenie lub stan urządzenia widział tylko siebie, a strategia widziała je wszystkie i wyrażał możliwe przejścia między nimi.
Przysięgałbym, że widziałem kiedyś opis implementacji klienta Telnet zgodnie z tymi wierszami, ale nie byłem w stanie go znaleźć ponownie. Byłoby to bardzo przydatne odniesienie!
¹: W tym celu postępuj zgodnie z intuicją lub znajdź klasy równoważności metod w swojej rzeczywistej implementacji dla relacji „method₁ ~ method₂ iff. ważne jest, aby używać ich na tym samym obiekcie ”- zakładając, że masz duży obiekt otaczający wszystkie zabiegi na twoim urządzeniu. Obie metody wyświetlania stanów dają fantastyczne wyniki.
discovery
lubhandshake
?