Pracuję nad projektem, który przetwarza żądania, i są dwa elementy żądania: polecenie i parametry. Obsługa każdego polecenia jest bardzo prosta (<10 linii, często <5). Jest co najmniej 20 poleceń i prawdopodobnie będzie ich więcej niż 50.
Wymyśliłem kilka rozwiązań:
- jeden duży przełącznik / if-else na komendach
- mapa poleceń do funkcji
- mapa poleceń do klas statycznych / singletonów
Każde polecenie wykonuje małe sprawdzanie błędów, a jedynym bitem, który można wyodrębnić, jest sprawdzenie liczby parametrów zdefiniowanych dla każdego polecenia.
Jakie byłoby najlepsze rozwiązanie tego problemu i dlaczego? Jestem również otwarty na wszelkie wzorce projektowe, które mogłem przegapić.
Opracowałem następującą listę pro / con dla każdego:
przełącznik
- profesjonaliści
- utrzymuje wszystkie polecenia w jednej funkcji; ponieważ są proste, dzięki temu jest wizualną tabelą odnośników
- nie musisz zaśmiecać źródła tonami małych funkcji / klas, które będą używane tylko w jednym miejscu
- Cons
- bardzo długo
- trudne do dodawania poleceń programowo (trzeba połączyć łańcuch używając domyślnej wielkości liter)
polecenia map -> funkcja
- profesjonaliści
- małe kawałki wielkości kęsa
- potrafi programowo dodawać / usuwać polecenia
- Cons
- jeśli wykonane w linii, tak samo wizualnie jak przełącznik
- jeśli nie jest wykonywany w linii, wiele funkcji jest używanych tylko w jednym miejscu
polecenia map -> klasa statyczna / singleton
- profesjonaliści
- potrafi używać polimorfizmu do obsługi prostego sprawdzania błędów (tylko 3 linie, ale nadal)
- podobne korzyści jak mapa -> funkcja rozwiązania
- Cons
- wiele bardzo małych klas będzie zagracać projekt
- implementacja nie wszystko w tym samym miejscu, więc skanowanie implementacji nie jest tak łatwe
Dodatkowe uwagi:
Piszę to w Go, ale nie sądzę, że rozwiązanie jest specyficzne dla języka. Szukam bardziej ogólnego rozwiązania, ponieważ być może będę musiał zrobić coś bardzo podobnego w innych językach.
Polecenie jest ciągiem, ale mogę łatwo zmapować go na liczbę, jeśli jest to wygodne. Podpis funkcji jest podobny do:
Reply Command(List<String> params)
Go ma funkcje najwyższego poziomu, a inne platformy, które rozważam, mają również funkcje najwyższego poziomu, stąd różnica między drugą a trzecią opcją.