Jako ćwiczenie edukacyjne (nie jestem w szkole - po prostu stary facet stara się nauczyć czegoś nowego), próbuję napisać symulację bramki logicznej, która zawiera opóźnienie propagacji. Użytkownik powinien także mieć możliwość grupowania bramek w celu tworzenia obiektów wyższego poziomu.
Chcę zastosować wzorce projektowe do mojego problemu, ale mam trudności.
Czytam wzorce projektowe Head First i widzę, że wzór Command jest dobrym sposobem na symulację impulsów elektrycznych przez obwód z opóźnieniem. Widzę również, że wzór złożony jest dobrym sposobem na symulację zagnieżdżonych jednostek. Po prostu nie wiem, jak je połączyć.
Innymi słowy, gdy przechodzę przez bramę, widzę, że brama „x” powinna odpalić. Ma opóźnienie 15 nanosekund, więc tworzę polecenie ze znacznikiem czasu 15 ns od bieżącego czasu gry. Gdzie jest dyspozytor? W przykładzie restauracji, w której polecenie jest „Rozkazem”, kelnerka i kucharz wysyłają polecenie i mają możliwość wprowadzenia opóźnienia. Jeśli mam bramę „kompozytową”, czy ma ona również własnego dyspozytora? Czy muszę używać Singletona do zarządzania kolejką?
Przeczytałem, co mogłem znaleźć, ale nadal potrzebuję pchnięcia we właściwym kierunku:
źródło
Odpowiedzi:
Możesz spojrzeć na przykład z programowania w Scali , ponieważ mają symulator, który robi to, co próbujesz zrobić w Javie:
http://www.cs.helsinki.fi/u/wikla/OTS/Sisalto/examples/html/ch30.html#sec6
Patrząc na ich podejście, możesz dowiedzieć się, jak zmienić program, aby uzyskać pożądane zachowanie.
Wspomniałeś, że nie możesz go łatwo dodać, więc dlaczego nie wyjaśnić, jakie jest twoje podejście i jaka jest trudność, na którą napotykasz, aby ludzie mogli dać ci sugestie, których mogłeś nie wziąć pod uwagę.
Jak wspomniano, wzorce projektowe są sposobem na mówienie o tym, co robi twój kod, jako skrót, ale pomysł próby wymuszenia wzorców projektowych wydaje się po prostu złym pomysłem.
Zasadniczo opóźnienie propagacji nie powinno być trudne.
Możesz mieć klasę podstawową, która jest
Gate
w niej opóźniona.Wszystkie bramki wychodzą z tego i ustawiają rzeczywiste opóźnienie.
Teraz, gdy podążasz za sygnałem, gdy znajdujesz się w bramie, wątek może spać dla symulowanego opóźnienia, ale oznacza to również, że musisz mapować czas rzeczywisty do symulowanego czasu, ponieważ symulator będzie wolniejszy niż prawdziwy system byłoby.
Jeśli okaże się, że masz zbyt wiele wątków, po prostu umieść na posortowanej liście, obok następnego na górze, a gdy zatrzymasz się, po prostu ustaw czas opóźnienia i na każdej pętli symulator wybierze te, które są teraz gotowe , wykonaj następną akcję, a następnie nastąpi następne opóźnienie.
Byłoby to podobne do pętli gry.
źródło
Zatem nie używasz wzorca poleceń.
Dobry Boże, nie. Cały punkt złożonego wzoru polega na tym, że można dostarczyć obiekt złożony do lokalizacji, która oczekuje tylko jednego obiektu. Pozwala to na rozsądne komponowanie zachowań.
Piekło nie Czy masz tylko jednego kucharza i jedną kelnerkę na całym świecie? Czy mają tylko jedną kuchnię?
Mieszanie polecenia i wzorca złożonego jest dość proste. Masz interfejs reprezentujący polecenie. Każde konkretne polecenie może zastąpić (lub w inny sposób spełnić je w językach innych niż dziedziczenie) ten interfejs, aby zapewnić pewne zachowanie. Twoje opóźnienie jest jednym z takich prostych zachowań.
Wzór złożony zapewnia dwa (lub więcej) obiekty / zachowania za jednym interfejsem. Najprostszym zastosowaniem w tym przykładzie byłoby polecenie złożone, które pobiera dwa inne polecenia, a następnie, gdy zostanie wyświetlone polecenie wykonania, wyzwala dwa zapisane polecenia. W ten sposób możesz wziąć izolowane polecenie „opóźnienie” i dowolne inne polecenie, aby utworzyć polecenie opóźnione.
źródło