Desenler sadece en iyi çözüm olabilecekleri veya iyi bir çözümün oluşturulmasında yardımcı olabilecek yerlerde kullanılmalıdır (kabul ediyor musunuz?).
Tasarım kalıplarını kesinlikle uygulama detayları olarak görüyorum. Herkese açık API'larınızı ve programınızı bu dokümantasyona belgelendirirseniz, genel olarak tasarım modellerinizin nerede olduğu önemli değildir (veya sizi çok fazla etkiler). Yani, "Burada bir köprü modelim var ve üstüne bir ziyaretçi uygulayacağım". Bunun yerine, "bu sınıfın çeşitli işletim sistemleri üzerinde farklı uygulamaları olacaktır, bu yüzden bir köprü deseni kullanılarak uygulanacaktır". Daha sonra, onu kullandığınızda, köprü olarak uygulanmasına kayıtsız kalırsınız - çünkü bir köprü modeline değil, genel API'ye bakarsınız.
gevşek bağlanmış, esnek tasarımlar yaratmak için ne kadar çaba harcanmalıdır?
Gevşek bağlantı basit bir dizi kural izlenerek elde edilebilir. Bunlara saygı duyarsanız, kodunuz yazarken (daha fazla) gevşek bir şekilde birleştirilir (yani herhangi bir çaba zaten geliştirme sürecinin bir parçasıdır).
Kurallar arasında (kapsamlı bir liste değil):
- arabirimlerinizi, sınıfın ne yapacağını değil (yani uygulama için değil, arabirim için tasarım) düşünerek (veya sınıfın nasıl kullanılacağını) düşünerek (veya yazarak)
- "söyle, sorma"
- önceden oluşturulmuş parçalardan nesneler oluşturma
- kullanacağınız gerçek nesneleri kurucuya iletin (üyeler için fabrikalar değil, parametrelerin fabrikaları için parametreler veya bunun gibi herhangi bir şey).
- KURU (iki yerde aynı sırada görünen iki satırınız varsa, bunları ayrı bir işleve çıkarın vb.).
- Bir nesnenin oluşturulması daha karmaşık bir işlemse, ara parçaların oluşturulmasını fabrika yöntemi / sınıfı olarak uygulayın (örn. Yapıcı gövdesinde değil).
- YAGNI (daha önce değil, ihtiyacınız olan şeyleri yaratın).
Bu kurallar dile, geliştirme metodolojisine ve ardından ekibinize (örneğin TDD), zaman bütçesi kısıtlamalarına vb. Bağlı olarak farklı şekilde uygulanır.
Örneğin, Java'da, arayüzünüzü bir olarak tanımlamak interface
ve bunun üzerine istemci kodu yazmak iyi bir uygulamadır (daha sonra arayüzü bir uygulama sınıfıyla başlatın ).
Öte yandan C ++ 'da arabirimleriniz yoktur, bu nedenle arabirimi yalnızca soyut bir temel sınıf olarak yazabilirsiniz; C ++ 'da kalıtım yalnızca güçlü bir gereksiniminiz olduğunda kullanıldığından (ve dolayısıyla gereksiz sanal işlevlerin ek yükünden kaçının), muhtemelen arabirimi ayrı olarak tanımlamazsınız, yalnızca sınıf üstbilgisini tanımlarsınız).
Tasarım kalıplarına karşı çıkanlar, bu kalıpları kullanma maliyetlerinin genellikle faydalardan daha ağır bastığını söylüyor.
Bence yanlış yapıyorlar. Gevşek olarak bağlanmış (ve DRY) kod yazarsanız, tasarım desenlerini içine entegre etmek çok az çaba gerektirir. Aksi takdirde, kodunuzu bir tasarım deseni uygulamak için uyarlamanız gerekir.
Bir tasarım deseni uygulamak için çok fazla değişiklik yapmanız gerekiyorsa, sorununuz tasarım deseni değildir - kod tabanınız monolitik ve sıkıca bağlıdır. Bu kötü / yetersiz bir tasarım problemidir, tasarım kalıpları problemi değildir.
Bilmek istediğim, gerçekte ek soyutlama ve tasarım seviyeleri oluşturmak için ne kadar çaba harcamam gerektiğidir, sadece uygulamamın gevşek bağlantı, bir arayüze programlama vb.Gibi OO ilkelerini izlemesine izin vermek gerçekten değer mi? o? Bunun için ne kadar çaba harcamalıyım?
Sorularınız, (bağlanmamış) varsayımını gevşetmenin tek faydasının tasarım desenlerini kolayca uygulayabilme yeteneği olduğunu varsaymaktadır. O değil.
Gevşek kuplajın faydaları arasında:
- yeniden düzenleme ve yeniden tasarım esnekliği
- daha az harcanan çaba
- test edilebilirlik
- kodu tekrar kullanma olasılığı arttı
- tasarım basitliği
- hata ayıklayıcıda daha az zaman harcanması
... ve şu an aklıma gelmeyen birkaç kişi daha.