Tasarım desenleri - bunları kullanıyor musunuz?


44

Bir BT öğrencisi olarak, kısa bir süre önce öğretmenlerimizden biri tarafından tasarım desenleri hakkında genel bir bakış verildi. Ne için olduklarını anladım, ama bazı yönler hala beni rahatsız ediyor.

Gerçekten programcıların çoğunluğu tarafından kullanılıyor mu?

Deneyimden bahsetmişken, programlama sırasında bazı sıkıntılar yaşadım, bir süre çözemediğim şeyler var, ancak Google ve birkaç saatlik araştırma benim sorunumu çözdü. Web'de bir yerde sorunumu çözmenin bir yolunu bulursam, bu bir tasarım deseni mı? Kullanıyor muyum?

Ayrıca, siz (programcılar) geliştirmeye başladığınızda kendinizi (bu arada nereye bakmam gerekiyor?) Kalıpları ararken buluyor musunuz? Eğer öyleyse, bu kesinlikle benim kucaklamaya başlamam gereken bir alışkanlık.

GÜNCELLEME: Sanırım programcıların bunları kullanıp kullanmadığını sorduğumda, "Oh, bu modeli kullanmalıyım" diye düşünmek için bir problemin olup olmadığını soruyorum.


7
Tam bir yinelenen soru değil, ama cevabım aynı olurdu. programmers.stackexchange.com/questions/70877/…
pdr

4
Bunların çoğu abartılı, aşırı yazılmış "tasarım desenleri" sadece OOP programlaması ile ilgilidir. Ve mümkün olduğunca uzun süre OOP'den uzak durmanın birçok iyi nedeni var.
SK-mantık

5
Kendimi Büyük Top Çamur Kullanarak istediğimden daha sık kullanıyorum. Şaka yapıyorum.
sashoalm

Tek cevap "uygun olduğunda" şartlı ifadesi ile evet
Rig

Yanıtlar:


114

Acemi bir programcı iken tasarım kalıplarını çok severdim. Sadece tasarım kalıplarını kullanmadım. Onları ben etkiledim. Nerede ve ne zaman yapabilirsem. Ben acımasızdım. Aha! Gözlemci desen! Al bunu! Bir dinleyici kullanın! Vekil! AbstractFactory! Beş kişi ne zaman neden bir soyutlama katmanı kullanıyor? Birçok deneyimli programcı ile konuştum ve GoF Kitabını okuyan herkesin bu aşamadan geçtiğini gördüm .

Acemi programcılar tasarım modellerini kullanmazlar. Tasarım desenlerini kötüye kullanıyorlar.

Daha yakın zamanlarda, Tek Sorumluluk İlkesi gibi ilkeleri göz önünde bulundurmanın ve ilk olarak test yazmanın, kalıpların daha pragmatik bir şekilde ortaya çıkmasına yardımcı olduğunu buldum . Kalıpları tanıdığımda daha kolay ilerlemeye devam edebilirim. Onları tanıyorum, ancak artık kodları zorlamaya çalışmıyorum. Bir Ziyaretçi kalıbı ortaya çıkarsa, bu muhtemelen çoğaltmayı yeniden yaptığımdan, zamanlarını bir ağaç oluşturmaya karşı değerlerini toplamaya benzeyen benzerlikleri hakkında düşündüğümden değil.

Deneyimli programcılar tasarım modellerini kullanmazlar. Tasarım desenleri onları kullanır.


2
@schlingel - Neden OP Efendim diyorsunuz?
Oded

10
@Oded Bu şartlar altında "Efendim" olarak adlandırılma hakkım saklıdır ve tadını çıkarın.
Lunivore

3
Efendim evet efendim. Alınma demek istemedim!
Oded

1
Sovyet Rusya'da .. :)
Sorantis

5
İyi cevap, ama son satırda derin olmaya çalıştın, ama saçma değil. "Tecrübeli programcılar tasarım modellerini seçmezler, onların olmasına izin verirler."
Garrett Hall

43

Kimse onları tanır olup olmadığı, çoğu programcı yapmak kullanım şekilleri.

Bununla birlikte, günlük işlerde, bir model akılda tutularak programlamaya başlamaz - biri bir kalıbın kodda ortaya çıktığını algılar ve daha sonra adlandırır.

Ortak kalıplardan bazıları, bazı dillerde bulunur - örneğin, anahtar kelimeyle C # içine yerleştirilmiş yineleyici kalıpforeach .

Bazen elinizdeki soruna ortak bir çözüm olarak kullanacağınız örüntüyü zaten biliyorsunuz ( depo kalıbını söyleyin - verileri bir bellek koleksiyonu olarak göstermek istediğinizi zaten biliyorsunuz).


13
Söyleyeceğim şey buydu, kalıplar, programcıların bir sistemi uygulamak için bir araya getirilebilecek bir dizi programlama lego tuğlası değil, tasarım ve uygulama fikirlerini iletmelerine yardımcı olacak bir dildir .
Mark Booth,

27
@DeadMG Neden bu?
Kris Harper

11
@DeadMG: Körü körüne aptalca bir fikir yüzünden kör olmuş olmalıyım - Neden aptalca olduğunu düşündüğünü anlamıyorum ;-)
Treb

2
@ root45 - Arkadaş görüyorsunuz, foreachyapı programlamayı çok kolaylaştırıyor. Bir koleksiyon üzerinde yineleme gibi karmaşık bir işin kolay olması durumunda, biri diğerlerinden daha iyi nasıl hissedebilir? Tüm CRUD uygulamalarım için montajda bir tane kod yazdım. Açıkçası @DeadMG'nin hissi saf pragmatik dehalardan biri.
ChaosPandion

8
@DeadMG - .NET 1.0 / 1.1 iken LINQ etrafında değildi. yieldo zaman da yoktu. Bir anahtar kelimeyi kaldırarak eski kodları kırmanın daha iyi bir seçenek olduğunu düşünüyor musunuz?
Oded

22

Pdr bağlantılı cevabın ima ettiği gibi : tasarım kalıpları, insanların zaten yaptıkları şeylere verilen adlardır , insanların bu konuları tartışmalarını kolaylaştırmayı amaçlar.

Genel olarak, işe başladığınızda onları öğrenmeye değerdir, çünkü size insanların çalıştığı çözümler hakkında bazı bilgiler verir, böylece yılların deneyimine ve deneme yanılmalarına dayanabilirsiniz.

Modellere dahil olan motive edici problemlerin tartışılması, probleminizi ilk başta ele almanın iyi yolları hakkında size fikir verebilir, fakat model bilginiz iyi bilinen bir çözüm olduğunu kabul etmiyorsa, hala sadece çözümlemeye odaklanmanız gerekir . önce sorun .

Varsa bir veya daha fazla mevcut örüntü kullanmanız durumunda, harika, diğerlerinin kodunuzu anlamalarını kolaylaştıracak hazır isimleriniz vardır.


Söylemek istediklerimin önemli bir toplamı için +1: Soruna odaklanın ve ardından sorun yalnızca bir model çözülür gibi görünürse, deseni uygulayın.
Joshua Drake

1
Tasarım desenlerinin insanların zaten yaptıkları şeylere verilen isimler olduğu gerçeğini belirten +1 .
miraculixx

12

Genel olarak konuşursak, hayır. Kodlarımda kalıpların ortaya çıktığı zamanlar vardır, ancak genel olarak, onları aramıyorum ve kesinlikle "Ah, Köprü Kalıbı sorunumu çözer!" Demiyorum.

İşte şey. Çoğu desen, insanlar iyi bir tasarım olup olmadıklarını düşünmeden kötüye kullanılır ve kötüye kullanılır. Desenler atom değildir. Kod, kalıpların X permütasyonundan oluşmaz. Tüm kalıpların aslında iyi fikirler olmadığını ya da bazı dillerin bazı kalıplardan çok daha üstün olan dil düzeyinde çözümlere sahip olduğundan bahsetmiyorum.


+1: Kalıpların bazen yanlış kullanıldığına katılıyorum. Bazen, programcının sadece bir kalıp kullandığı ve sadece iyi olduğunu düşündüğü ve harika olduğunu düşündüğü bir kod görüyorum, ancak bu kodu gereksiz yere karmaşık ve okumasını zorlaştırıyordu. Buldozerle somunu kırmak gibi. Dil düzeyinde çözümler ile ilgili olarak, dil düzeyinde bir çözüm, yalnızca dilin doğrudan desteklediği bir kalıp değil mi? Veya fark nedir?
Giorgio

1
@Giorgio: Başka bir yolla çerçevelenmiş, bazı desenler dilin belirli bir şeyi düzgün bir şekilde ifade etmenin bir yolunun bulunmadığı gerçeği üzerinde çalışmak için kullanılır.
Daenyth

8

evet, şimdiye kadar karşılaştığım programcıların çoğu orada en yaygın olanı kullanıyor: Büyük Çamur Topu . Genellikle iyi tasarlanmış mimarilerle başlarlar, ancak genellikle buraya gelirler, özellikle de her yerde "tasarım desenlerini kullanmalıyız" ve acımasızca refactor olarak düşünmeye başlarlarsa.


2
Bağlantı
günümü yarattı

1
Ahh. Bu web sayfasının biraz metin biçimlendirmesi gerekiyor.
Nailer

7

Onları kullanıyor musun?

Evet, deneyimli programcılar kesinlikle öyle. Şimdilik çoğu tasarım desenini (basit singleton malzeme hariç) kullanmaktan kaçınabilirsiniz; ancak ne kadar çok program yaparsanız ve o kadar karmaşık sistemler kurarsanız, tasarım modellerini kullanma gereksinimi o kadar fazla hissedersiniz. Hala bundan kaçınırsanız, sisteminizi genişletmek ve yeni gereksinimlere göre değiştirmek zorunda kaldığınızda acıyı hissetmeye başlayacaksınız.

Web'de bir yerde sorunumu çözmenin bir yolunu bulursam, bu bir tasarım deseni mı?

Şart değil. Bir tasarım deseni, belirli bir hedefe ulaşmak (veya belirli bir problemden kaçınmak) için sınıfları, davranışlarını ve etkileşimlerini tasarlamanın belirli bir yolunu ifade eder. Karşılaştığınız şey gerçekten bir tasarım sorunu olmayabilir, ancak belirli bir API'yi programlamak için belirli bir adım dizisi olabilir. Örneğin: bir soket bağlantısı kurmanın belli bir sırası var. Yanlış yaparsanız soketiniz iletişim kuramaz. Bu adım dizisi bir model oluşturmaz.

(programcılar) kendinizi kalıpları ararken buluyor musunuz?

Evet. Tasarım desenleri "önleme tedaviden daha iyidir" aksiyomunu içerir. Önümüzdeki belirli bir tasarım sorununu önceden tespit edebiliyorsanız, daha sonra yapılan değişiklikleri karşılamak için büyük yeniden tasarımları önleyebilirsiniz. Bu nedenle tasarım desenlerini önceden bilmek ve uygulamanızı oluştururken kullanmanız gereken yerleri aramak için para ödersiniz.

nereye btw bakmalıyım?

Öğrenci olduğunuz için tasarım desenlerine ilham veren tipik sorunları görmediniz. Head First Design Patterns'a göz atmanızı şiddetle tavsiye ederim . Önce bir tasarım problemi sunarlar ve sonra belirli bir desenin onu nasıl çözebileceğini / önleyebileceğini gösterir.


5

Okuldayken Tasarım Desenleri öğretilmedi. Programlama kariyerimin çoğu için, eski, nesne yönelimli olmayan kodlarla çalıştım. Son yıllarda onları öğrenmeye çalıştım çünkü çok iyi bir fikirmiş gibi geliyorlar. Bununla birlikte, her kitap okuduğumda veya konuyla ilgili bir öğretici okumaya çalıştığımda, gözlerimin sırıldığını ve onlar hakkında pratik bir şey öğrenemediğimi itiraf etmeliyim.

Bunu sadece kamuya itiraf ettiğime inanamıyorum. Sanırım yıllar içinde kurduğum herhangi bir inek dosyasını kaybettim.


3

Trend için bakma

Belirli bir soruna yönelik herhangi bir standart programlama çözümü, bir tasarım deseni olarak düşünülebilir, ne kadar popüler oldukları veya başka programcıların kullanıp kullanmamaları önemli değildir.

Henüz icat edilmemiş / belirtilmemiş bir tasarım deseni kullanıyor olabilirsiniz.

Onları kullanmayı denemeyin, onların açısından düşünmeyi deneyin

Tasarım modelleriyle ilgili sorun, bazen programcıların, başka bir yoldayken sorunlarını kendilerine sığdırmak istemeleridir.

Tasarım kalıplarının tasarım konvansiyonunun çözmesi gereken tipik bir problemi olduğunu hatırlayın, hatta daha büyük problemlerle başa çıkmak için tasarım kalıplarını bile birleştirebilirsiniz. Servis Odaklı Mimari'de bu tipik bir durum, sadece bazı SOA modellerini görün .

Onları vahşi doğada ara

Uygulamalı tasarım kalıplarını bulabileceğiniz birçok açık kaynaklı proje var. Akla gelen bir örnek Joomla'dır: tekilleri , gözlemcileri bulacaksınız . GUI kütüphanelerinde dekoratör deseni , uygulanan komut düzeni ve hatta uçucu ağırlık olacaktır .

Veri kalıpları, örneğin yalnızca Dokümantasyon Projesi'nin kullandığı, aktif kayıt kalıbı (1.x), varlık yöneticisi kalıbı (2.x), iş birimi , depo , sorgu nesnesi , meta veri haritalama , veri gibi başka kalıplar da vardır. haritalama ve strateji deseni ve dekoratör deseni gibi diğer daha genel olanlar .

Seçilecek çok ilginç çözümler var. Martin Fowler'in Kurumsal Mimari Modellerine bakın , ayrıca veri modeli modelleri de var .

Sadece zamanı gelince onları öğren.

Onları öğrenin, onları tanıyın, onlara saplantılı olun ve zaman geldiğinde programlama problemini nasıl çözeceğinizi bilirsiniz, o zamana kadar daha iyi bir programcı olacaksınız.

Mimar ol

Problemleri çözmek için kalıp terimleriyle düşünebilmenin, sizi etkili bir şekilde yazılım mimarına dönüştürdüğünü söyleyebilirim . Başta bir yazılım mimarı olmak istemeseniz bile, çözümleriniz daha fazla teknik kaliteye sahip olacak, varsayılan olarak daha temiz ve daha iyi bir ölçeklenebilirlik (tasarım açısından) olacaktır.


1

Yaklaşık 7 yıl boyunca C ++ programladım ve yaklaşık 2 yıl önce kalıp öğrendim. Çoğu modelde muhtemelen bazı uygulamalar vardır, ancak benim kullanımımda bazıları diğerlerinden daha iyidir. Onları neden kullandığını düşünmelisin.

Yineleyici modeli kodumu daha kafa karıştırıcı hale getirdi ve gereksiz karmaşıklık ekledi. STL vektör tipleri için typedef kullanarak aynı bakımı elde edebilirim. Ve yinelenen sınıfta yaptığım değişiklikler de yineleyici sınıfına yapmalıyım.

Bununla birlikte, fabrika yöntemi, sağladığı polimorfizme dayanarak son derece faydalı olmuştur. Kimin söylediğini unuttum, ancak "yeniden kullanılabilirlik eski kodun yeni kod kullanabileceği anlamına gelir" ifadesi, fabrika modeli için kesinlikle geçerlidir.

Şablon yöntem kalıbını yıllardır “tasarım deseni” olduğunu bile bilmeden kullandım.

Gözlemci örneği bazı durumlarda yardımcı olmuştur, bazen değildir. Bazen, Gözlemci modelinin üst düzey karmaşıklığının buna değip değmeyeceğini belirlemek için bazen karmaşıklığı tahmin etmeniz gerekir. Yaklaşık 10 abone kullanan bir programımız var ve daha fazlası olabilir, bu nedenle gözlemci / abone modeli yardımcı oldu. Bununla birlikte, başka bir programda iki GUI ekranı bulunur. Bu program için gözlemci modelini uyguladım ve karmaşıklık eklediğinden ve daha fazla ekran eklemeyi öngörmediğim için büyük ölçüde gereksizdi.

Bence her zaman kalıp kullanmayı söyleyenler, programınızın sonsuz derecede karmaşık olacağını varsayıyorlar, ancak her şeyde olduğu gibi, karmaşıklık açısından bir kırılma noktası var.


1

Lunivore'a ekleme. Bunu ilk baştaki kitaptan alıntı yapmak istiyorum

        ## **Three steps to great software** ##     
  • Yazılımın müşterinin istediğini yaptığını doğrulayın.
  • İyi nesne yönelimli ilkeler uygulayın
  • Bakım yapılabilir, tekrar kullanılabilir bir tasarım için gayret gösterin

Üçüncü aşamada, sisteminiz olması gerektiği gibi çalıştıktan sonra. Yazılımınızı gelecek yıllar için hazır hale getirmek için kalıpları uygulama zamanı geldi.


0

Gerçekten programcıların çoğunluğu tarafından kullanılıyor mu?

Evet sanırım. ADO.Net'te, desenleri hangi alanda özelleştirmek istediğinize bağlı olarak değişebilir ancak basit bir örnek vermek için bir DataAdapter sınıfı vardır.

Deneyimden bahsetmişken, programlama sırasında bazı sıkıntılar yaşadım, bir süre çözemediğim şeyler var, ancak google ve birkaç saatlik araştırma benim sorunumu çözdü. Web'de bir yerde sorunumu çözmenin bir yolunu bulursam, bu bir tasarım deseni mı? Kullanıyor muyum?

Hayır, bu benim için bir tasarım deseni değil. Bir tasarım deseni, bir modelin tarifini tanımlayan bazı sınıf ve yöntem düzenlemelerine sahip olma eğilimindedir.

Orada ne yaptığınızı ortak bir uygulama olarak düşünmeyi tercih ederim. Kopyalama ve yapıştırma kodlarına rağmen dikkat edin.

Ve ayrıca, siz (programcılar) geliştirmeye başladığınızda, kendinizi kalıpları aradığınızı (nerede btw'ye bakmam gerekiyor?) Buluyor musunuz? Eğer öyleyse, bu kesinlikle benim kucaklamaya başlamam gereken bir alışkanlık.

Bazen aynı kodu tekrar tekrar gördüğümde, kodu bir düzende yeniden biçimlendirmenin bir yolunu bulabilirim veya bir model içeren benzer bir sorunun çözümünü hatırlarsam, alıp kullanacağım. Head First Design Patterns içinde çok fazla şablon bulunur ; Refactoring , farklı desenler bulmak için kodlama uygulamaları için bir öneridir. Başka bir olası başlangıç ​​noktası istiyorsanız, Microsoft'un Kalıp ve Uygulamalarına bakın .


0

Öğrenme kalıpları sadece bir şeyler öğrenmek değildir. Programlama dilleriyle neler yapabileceğinizi öğrenirsiniz. Ben sadece bir kalıbın nasıl çalıştığını öğrenerek ( bu durumda kompozit kalıp) , nesne yönelimli programlama hakkında çok şey öğrendim .

Oded'in belirttiği gibi, çoğu programcı onları tanımadan bazen kullanırlar. Kalıpların güzelliği, önceden tanımlanmış bir kalıpla belirli problemleri çözebilmenizdir, böylece mimari şeyler hakkında çok fazla düşünmenize gerek kalmaz.


0

Mevcut projelerle çalışmaya başladığınızda kalıpları öğreneceksiniz. Öğrenmeniz için orada çok fazla kalıp var ve üzerinde çalıştığınız projeye bağlı olarak hepsine hakim olmak için zaman ayırmaya değmez. Ne zaman birine rastlarsanız, nasıl kullanıldığını görmek için bu konuda bilgi edinin.

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.