Komik, bu soru bana mühendislerimizden biriyle üzerinde çalıştığım iletişim kütüphanesi hakkında yaptığım aynı konuşmayı hatırlattı.
Komutlar yerine, Request sınıfları ve sonra RequestHandlers vardı. Tasarım, tanımladığınız şeye çok benziyordu. Sanırım sahip olduğunuz karışıklığın bir kısmı, İngilizce "komut" kelimesini görmeniz ve anında "fiil, eylem ... vb."
Ancak bu tasarımda, Komuta'yı (veya İsteği) bir mektup olarak düşünün. Veya posta hizmetinin ne olduğunu bilmeyenler için e-postayı düşünün. Basitçe içeriktir, bu içeriğin nasıl davranılması gerektiğinden ayrılmıştır.
Neden bunu yaptın? Çoğu basit durumda, Komut Deseni'nin bir nedeni yoktur ve bu sınıfın doğrudan iş yapmasını sağlayabilirsiniz. Bununla birlikte, tasarımınızdaki gibi ayrıştırmanın yapılması, eyleminizin / komutunuzun / isteğinizin biraz mesafe kat etmesi gerektiğinde mantıklıdır. Örneğin, soketler veya borular boyunca veya alan ve altyapı arasında. Ya da mimarinizde komutlarınızın kalıcı olması gerekir (örn. Komut işleyicisi, bazı sistem olayları nedeniyle 200 komut geldiğinde ve ilk 40 işlem kapatıldıktan sonra bir seferde 1 komut yapabilir). Bu durumda, basit bir salt mesaj sınıfına sahip olmak, sadece mesaj kısmını JSON / XML / ikili / herhangi bir şekilde serileştirmek ve komut işleyicisi işlemeye hazır olana kadar boru hattından geçirmek çok basit hale gelir.
Command'ı CommandHandler'dan ayırmanın başka bir avantajı, şimdi paralel miras hiyerarşisi seçeneğinizin olmasıdır. Örneğin, tüm komutlarınız serileştirmeyi destekleyen bir temel komut sınıfından türetilebilir. Ve belki de çok fazla benzerliğe sahip 20 komut işleyicisinden 4'üne sahipsiniz, şimdi bunları gelen işleyici temel sınıfından türetebilirsiniz. Eğer bir sınıfta veri ve komut yönetimi yapacak olsaydınız, bu tür bir ilişki hızla kontrolden çıkardı.
Ayrıştırma için başka bir örnek, komutunuz çok az girdi gerektiriyorsa (örneğin 2 tamsayı ve bir dize), ancak işleme mantığı, ara üye değişkenlerinde veri depolamak istediğiniz yerde yeterince karmaşıktı. 50 komutu kuyruğa alırsanız, tüm bu ara depolama için bellek ayırmak istemezsiniz, bu nedenle Command'ı CommandHandler'dan ayırırsınız. Şimdi 50 hafif veri yapısını kuyruğa alıyorsunuz ve daha karmaşık veri depolaması, komutları işleyen CommandHandler tarafından yalnızca bir kez (veya N işleyiciniz varsa N kez) ayrılıyor.