Tasarım desenleri günümüzde gerçekten gerekli mi?


107

"İşyerinde Kodlayıcılar" okuyordum ve kitapta görüşülen bazı profesyonellerin tasarım kalıpları konusunda çok hevesli olmadıkları gerçeğiyle karşılaştım.

Bunun 2 ana nedeni olduğunu düşünüyorum:

  1. Tasarım desenleri bizi terimleriyle düşünmeye zorlar. Başka bir deyişle, yeni bir şey icat etmek neredeyse imkansızdır (belki daha iyi).

  2. Tasarım desenleri sonsuza dek sürmez. Dil ve teknolojiler hızlı değişiyor; Bu nedenle, tasarım desenleri sonunda alakasız hale gelecektir.

Bu yüzden belki de belirli bir kalıp olmadan nasıl düzgün bir şekilde programlandığını öğrenmek ve onları öğrenmek için daha önemlidir.

Mesele şu ki, genellikle insanlar bir sorunla karşı karşıya kaldıklarında ve fazla zamanları olmadığında, bir kalıp kullanmaya çalıştıklarıydı. Bu, çalışmasını sağlamak için mevcut kodu projenize küçük değişiklikler yaparak kopyalayıp yapıştırmak anlamına gelir. Bir şeyi değiştirme veya ekleme zamanı geldiğinde, bir geliştirici nereden başlayacağını bilmez, çünkü bu onun kodu değildir ve ona çok aşina değildir.


79
Bir desen uygulamak mevcut kodu kopyalayıp yapıştırmak anlamına geliyorsa, o zaman muhtemelen yanlış yapıyorsunuzdur
Dyppl

9
tasarım kalıplarını kullanarak! = kargo kültü programlama
saat

11
Bu sorunun başlığı, "Günümüzde tekerleği yeniden icat etmemek gerçekten gerekli mi?" Olarak tekrar ifade edilebilir.
Eric King,

2
Tasarım desenleri bizi kendi terimleriyle düşünmeye zorlar - eğer izin verirseniz. Kalıpların farkındalığı, belirli bir tasarım problemi için olasılıkları düşünmeme izin veriyor. Genellikle bir restoran menüsü okumak gibi ... "hayır, hayır, ilginç, hayır, hmm, a-ha!". Dahası, modern dil özellikleri çoğu zaman on yıllar önce kodlanmış olan belirli desen şemalarını arkaik hale getirir.
radarbob

Yanıtlar:


261

Param için, herkesin tasarım desenleri noktasını kaçırdığını düşünüyorum. Belirli bir durumda hangi modeli kullanmam gerektiğini merak ediyorum. Ayrıca, bu kalıpların çoğunu isimlerinin olduğunu bilmeden çok önce kullanıyordum.

Tasarım kalıplarının gücü iletişimde. “Bunun için bir Strateji kullanın” demek benim için önerdiğim şeyi ayrıntılı olarak açıklamaktan daha hızlı. Bu iki terimin ne anlama geldiğini hepimiz biliyorsak, yağ alanlı modellerin ve işlem komut dosyalarının yararlarını tartışmamız çok daha kolaydır. Ve bunun gibi.

Ve hepsinden önemlisi, eğer bir FooBuilder sınıfı seçtiyseniz, Foo'umu oluşturmak için Oluşturucu desenini kullandığımı biliyorsunuz.

"Gözlemci modeli bunun için ideal" derken neyden bahsettiğimi bilmeseniz bile, hemen çıkıp kolayca google’a erişebileceksiniz.

Bu anlamda, tasarım modellerinin gücü asla kaybolmayacak.


55
+1 "Bu kalıpların çoğunu, adları olduğunu bilmeden çok önce kullanıyordum." Bunların hepsi uzun zamandır var, sadece kalıpların isimlendirilmesi olmadan. 1991’de, C’de singleton yazıyordum ve daha önce hiç görmemiş ve oldukça şık olduğunu düşünen daha deneyimli bir programcıya bir tane gösterdim.
Bob Murphy

8
Ancak, desenler de ortadan kalkar. 1950'lerde, "alt rutin çağrı" oldukça popüler bir düzendi. C'de "nesne" (biraz) popüler bir kalıptır. Her ikisi de şimdi pratik olarak nesli tükendi, çünkü modern dillerde ve (alt programlarda) modern CPU'ların komut setlerine bile dahil edildiler.
Jörg W Mittag

9
@Bob Murphy: Argh Singleton :( :( @pdr: tam olarak, örüntüler programlama ile ilgili iletişim hakkındadır. Bir örüntü uygulamak, neredeyse uyması nedeniyle, yapılabilecek en büyük hatadır ve bu nedenle tasarım yansıması örüntüler açısından yapılmamalıdır, Ne düşündüğünüzü açıklamak için sadece tasarıma girmeliler: “Çimdiklemiş olmam dışında neredeyse bir <pattern> gibiydi ...” Bence GOF'un kendisi tarafından onaylandığını düşünüyorum: kalıplar kesilmiş / sadeleştirilmiş vizyonlar, özel durumlara adapte olmaları gerekir
Matthieu M.

10
@Jorg: "altprogram çağrısı" deseni ne zaman kayboldu? Sizce bir yöntem / işlev çağrısı nedir?
Dunk

10
@Dunk: Tabii ki kullandığınız dillere bağlı. Ben hangi dilleri bilmiyorum sen kullanıyor, ancak tüm dillerde ben bugün kullanıyorum, değişmez arama yerleşik bir dil özelliği vardır değil bir tasarım örneği. Bununla birlikte, örneğin C'de yöntem çağrısı bir tasarım düzenidir, oysa Java'da yerleşik bir dil özelliğidir.
Jörg W Mittag

32

Tasarım kalıpları, yazılım insanı olarak kullandığımız ortak dilin ifade gücünde bir artıştır. Bu ortak dil zorunlu değildir, ancak sorunlara birçok ortak çözümü ifade etmeyi daha kolay ve daha hızlı hale getirir. Örneğin, Singletons hakkında konuşmak, "yalnızca bir örneğe sahip olmamız gereken ancak durağan ve küresel olamayacağımız sınıflar" hakkında konuşmaktan çok daha kolaydır.

Tasarım modellerinin sağladığı çözümler kullanışlıdır, ancak çözdükleri sorunlarla karşılaştığınızda muhtemelen önceden düşündüğünüz çözümlerdir. Tasarım kalıplarını anlamak için belirli bir vade seviyesi gereklidir - sorunu hiç çözmek zorunda kalmazsanız, çözüme olan değeri veya ilgiyi göremezsiniz.


15

Desenler iki ana amaca hizmet eder:

  • Gerginlikleri tahmin edilebilir bir şekilde çözme : Desenler, belirli bir gerginlik kümesini işe yaradığı bilinen bir şekilde çözmek için tasarlanmıştır. Smalltalk En İyi Uygulama Kalıplarının yazarı Kent Beck, kalıpları benzer durumlarda bir uzmanın vereceği kararı tekrarlamanın bir yolu olarak tanımlar. Gerilimler aynı kaldıkça (ve sıklıkla yaparlarsa), onları çözen kalıplar yararlı kalacaktır.

  • İletişim gücü çarpanı : Desenler çok fazla şey söylememize izin veriyor. Çok çeşitli problem alanlarında uygulanabilir küçük, güçlü ve iyi anlaşılmış kavramlar setinden yararlanırlar. @ pdr'nin yanıtı, kalıpların iletişimsel değeri konusunda öldü.


12

Tasarım kalıplarının yeniliği engellediğine dair olumlu düşüncenin tamamen yanlış olduğunu düşünüyorum. Nerede olduğunu bilmelisin ki tekerleği yeniden icat etmene gerek kalmaz. Geçici olmak için, bir bütün olarak desenler OOP sistemlerine uygulanır ve herhangi bir platform veya dile bağlı değildir.

Şimdi, insanlar kalıplardan bahsettiklerinde sevmediğim şey, bazı insanların onlarla bir tür takıntı yaşaması. Bir keresinde benden "en az iki kalıp daha eklemem" (WTF ?!) sormam için bir müşterim vardı, çünkü kodumdaki buzzwords eksikliği nedeniyle yeterince girişimci görünmüyordu.


3
Tecrübelerime göre, iyi yazılmış kod tam olarak iyi tasarım tanımladıkları için çoklu tasarım modellerine uyuyor. Bu yüzden müşterinizi memnun etmek için, hangisini kullandığınızı tespit etmek ve isimlerini dokümanlara koymak meselesi olmalıydı. Kolay!
Donal Fellows

1
@ Donal Fellows Ben de öyle yaptım :) Sonunda lekelenme kalıplarını bulup isimlendirerek projeye mutlu bir son verdim. En büyük sorunum, çok, çok küçük bir proje (yaklaşık bir haftalık çalışma) ve çok basit bir şeydi: garip bir veri biçiminden veri okudu, birkaç dönüşüm yaptı, verileri yakaladı ve bir veritabanına battı.
Vitor Py

@Vitor Sizinle tamamen katılıyorum. Şahsen ben senin sorununa / senaryosuna uyan bir tasarım deseni aramanın kötü bir fikir olduğunu düşünenleri tanıyorum! Tekerleği yeniden icat etmeyi tercih ediyorlar. Bir gün uyanıp, Java IO derslerini kullanmamamı ve kendi IO işleyicileri yazmamamı isteyebileceklerinden korkuyorum!
Cking

6

Belki de anti-kalıp kavramı almanyadır. Tasarım kalıplarını çalışmayı yazılım mühendisi olmak için kritik bir adım olarak düşünmüyorum. Yazılım tasarımı, genellikle bir projedeki yazılım mimarının ayrıcalığı olarak ayrılan bir şeydir, ancak gerçekçi bir şekilde, atasözü “iyi huylu” takımda fikir birliği ile dövülebilecek bir şeydir.

Ancak tasarım kalıpları ve anti kalıpları bu tartışmalar için bir kaynak oluşturur. İnsanın iyi işleyen (veya iyi olmayan) dersleri ve tasarım tercihlerinin sonuçlarını nasıl kullanabileceğinizi (veya azaltacağını) takdir etmesi gerekir. İyi bir takım , bu tür tartışmalar için kendi kelime hazinesiyle gelebilirdi, ancak orada bulunan yazarların uyguladığı defacto standartlarına atıfta bulunmak gerçekten de o kadar da kötü bir şey değil.


3
“Anti-patern”, “kötü” için sadece uzun soluklu bir örtmecedir.
Michael Shaw,

@hardmath "Anti-pattern" sadece "kötü" den çok daha fazlasını ifade eder
GoatInTheMachine

1
@GoatInTheMachine: Katılıyorum, bu benim yazıya bir yorum oldu. Anti-paternler kaçınılması gerekenlere örnek olmakla birlikte, onları çekici tasarım seçimleri yapan karakteristik özelliklere sahiptir. Bazen bilinçli olarak bir anti-paterni takip etmek, eksikliklerini ve tuzaklarını bilmek makul olur.
hardmath

4

İki tür tasarım deseni vardır:

  1. Onları daha iyi anlayabilmeniz için karmaşık programların nasıl organize edileceği hakkında çok daha fazlası olan evrensel modeller . Bunlar gitmiyor, ancak daha fazla örnek keşfedilebiliyor.
  2. Kısıtlamalar (örn. Programlama dili) tarafından oluşturulan belirli güçlere o kadar bağlı olan durum örüntüleri , bu güçler değiştiğinde, ilgisiz kalmaktadır.

Tamam, tartışmasız tüm kalıplar biraz durumsaldır, ancak bazı güçler gerçek dünyadan ve diğerleri ile güçler araçlardandır. Araçlar gerçek dünyadan çok daha hızlı değişiyor.


Tüm modeller, belirli bir gerginlik kümesini çözdükleri şekilde tanımlanır. Gerilimler aynı olduğu sürece (ve sık sık, bu yüzden kalıplar ), kalıplar faydalı kalacaktır.
Rein Henrich,

@Rein: Ancak gerginlikleri yaratan kuvvetler iç veya dış olabilir. Farklı dillerin farklı iç güçleri vardır (örneğin, arayüzlerle ilgili kalıplar, Java'larında sınıf sistemlerindeki farklı gerilimler nedeniyle C ++ için olduğundan daha uygundur).
Donal Fellows

Kesinlikle. Uygulama Paternlerine (Kent Beck'in Java paternleri kitabı) genel bakış, genel amaç paternleriyle Java'nın özelliklerine daha spesifik olanlar arasında oldukça eşit bir dağılım olduğunu gösterir. Bu kitabı Smalltalk Best Practice Patterns ile karşılaştırmak da çok açık.
Rein Henrich,

3

Tasarım kalıplarını okumak, yeniden icat etmek yerine matematiği öğrenmek gibidir. Hiçbiri, daha önce neler olduğuna dair sağlam bir anlayışa sahip olduğunuzda sizi belirli bir alanda büyük ilerleme kaydetmekten alıkoymaz. Rieman'ın Euclid'i hiç okumadığını mı düşünüyorsun?


1

Meslektaşlarınızın veya müşterilerinizin "Bu nasıl çalışır?" Diye düşünerek harcadıkları süreyi azalttıklarında kalıp tasarlamanın yararı vardır. Standardizasyon uğruna bir standardın uygulanmasının bir anlamı olmasa da, bir şeyi yapmanın ortak ve iyi anlaşılmış bir yolu varsa, bir kodlayıcı onu bulmayı bekleyen ve yapmayı bekleyen bir model aradığında, onların ve işlerini yaptın Daha kolay.


1

Dört kişiden oluşan çetenin tasarım kalıplarını şöyle sınıflandırdığını düşünüyorum.

Sık karşılaşılan bir problem için ortak bir çözüm *

Bu yüzden evet, aynı tür problemler ortaya çıktığında modeller birbiriyle ilgilidir. Bu da bizi "Tasarım Deseni" terimiyle ilgili bir soruna getiriyor. Bir kalıp, tekrar tekrar meydana gelen tanınabilir bir şeydir. Yani gerçekte bir tasarım deseni yoktur, bir sorun modeli vardır.

Bazı programlama dilleri, bu sorunların bazıları için doğal çözümler olabilir. “Tasarım Desenleri” kitabının kendisi, eğer CLOS kullanıyorsanız, çok yönlü gönderim CLOS tarafından doğal olarak desteklendiğinden, Ziyaretçi deseninin çözmeye çalıştığı sorun olan CLOS kullanıyorsanız, ziyaretçi şablonunun değeri çok azdır.

Ayrıca, .NET çerçevesi, olayları birden fazla dinleyiciye yayınlamak için yerleşik bir olay mekanizmasına sahiptir ve böylece Observer modelini bu bağlamda daha az alakalı hale getirir.

Masaüstü uygulamalarından web uygulamalarına ** geçiş, çözmemiz gereken programlama problemlerinin türünü de değiştirir. "Tasarım Kalıpları" kitabındaki kalıpların çoğu, masaüstü uygulamaları ile ilgilidir, ancak web uygulamaları için fazla değildir. Tabii ki, tek sayfa uygulamalarında, bu modeller müşteri tarafında yine alakalı olabilir.

Ancak, tasarım kalıpları ve "Tasarım Kalıpları" veya "Kurumsal Uygulama Mimarisi Kalıpları" gibi kitaplar, acemi bir programcı olduğunuzda ve ilk kez yeni bir sorunla karşı karşıya kaldığınızda çok değerlidir; ilk kez olduğum gibi Geri Al işlevselliğini uygulamam istendi. “Tasarım Desenleri” kitabı olmasaydı, benim uygulamam büyük olasılıkla her durum değiştiren operasyondan sonra verilerin bir anlık görüntüsünü depolamak gibi bir şey olabilirdi *** - çok hataya açık ve korkunç derecede yetersiz bir yaklaşım.

Bu yüzden evet, kalıbın bir kısmı zamanla daha az alakalı hale gelir ve deneyimli bir programcı olduğunuzda onlar hakkında daha az düşünürsünüz. Ancak bir acemiye göre, bir problemi çözmenin bir yolu olduğunu hatırladığınız sürece değerlidirler - ve mümkün olduğunca çok bir arayış değildir.

* alıntı, bellekten alındığı için% 100 doğru olmayabilir

** benim deneyimlerime göre, işletmelerin iç iş kolu uygulamaları için web dağıtım mekanizmaları seçmeleri çok yaygınlaşıyor.

*** fonksiyonel programlama ve fonksiyonel veri yapılarını öğrendikten sonra, bu aslında bugün çözme yöntemim olabilir.


-3

Tasarım kalıplarına Slav bağlılık zarar verebilir - kalıplar genel sorunların çözümünde belgelenmiştir, ancak kullanım kılavuzları değildir. Bununla birlikte, sadece uzun süre tartışıldıkları ve bazı durumlarda, etkili sorun alanları dışında uygulanan herhangi bir değere sahip olmadıkları anlamına gelmez. Bunlar, bir program ilkesi tasarlarken, mimarın çözüm çalışmasını nasıl görmek istediğine dair bir izlenim vermesine olanak tanıyan bir dizi prensiptir - buna bir çerçeve diyoruz. İyi bir geliştirme ekibi onları işlevsel bir şartname yerine fonksiyonelliğin temeli olarak görür.


2
Bu, önceki cevaplarda verilen ve açıklanan hususlar üzerinde önemli bir şey sunmuyor gibi görünüyor
gnat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.