İstekleri işleyen bir proje üzerinde çalışıyorum ve isteğin iki bileşeni var: komut ve parametreler. Her komutun işleyicisi çok basittir (<10 satır, sık sık <5). En az 20 komut var ve muhtemelen 50'den fazla olacak.
Birkaç çözüm buldum:
- bir büyük anahtar / if-else komutlarında
- fonksiyonların komut haritası
- statik sınıflara / tekillere komut haritası
Her komut küçük bir hata kontrolü yapar ve soyutlanabilen tek bit, her komut için tanımlanan parametre sayısını kontrol etmektir.
Bu sorunun en iyi çözümü ne olabilir ve neden? Ayrıca, kaçırmış olabileceğim herhangi bir tasarım desenine açığım.
Her biri için aşağıdaki pro / con listesini buldum:
şalter
- profesyoneller
- tüm komutları bir fonksiyonda tutar; Basit olduklarından, bu görsel bir arama tablosu yapar
- Sadece bir yerde kullanılacak olan tonlarca küçük fonksiyon / sınıf kaynağını karıştırmanıza gerek yok
- Eksileri
- çok uzun
- programatik komutlar eklemek zor (varsayılan büyük harf kullanarak zincirlemeniz gerekir)
harita komutları -> işlevi
- profesyoneller
- küçük, lokma büyüklüğünde parçalar
- komutları programlı olarak ekleyebilir / kaldırabilir
- Eksileri
- in-line yapılırsa, görsel olarak anahtarla aynı
- yerinde yapılmazsa, yalnızca bir yerde çok sayıda işlev kullanılır
harita komutları -> statik sınıf / singleton
- profesyoneller
- polimorfizmi basit hata kontrolü yapmak için kullanabilir (sadece 3 satır gibi, ancak yine de)
- map -> işlev çözümüne benzer faydalar
- Eksileri
- Çok küçük sınıfların çoğu projeyi karıştıracak
- uygulama aynı yerde değil, bu yüzden uygulamaları taramak o kadar kolay değil
Ekstra notlar:
Bunu Go'da yazıyorum ama çözümün dile özgü olduğunu sanmıyorum. Daha genel bir çözüm arıyorum çünkü diğer dillerde çok benzer bir şey yapmam gerekebilir.
Bir komut bir dizedir, ancak uygunsa bunu kolayca bir numaraya eşleyebilirim. İşlev imzası şuna benzer:
Reply Command(List<String> params)
Go'nun üst seviye fonksiyonları var ve sanırım diğer platformların da üst seviye fonksiyonları var, bu nedenle ikinci ve üçüncü seçenekler arasındaki fark.