Tasarım Modellerini Öğrenme / Uygulama (Yeni Başlayanlar İçin) [kapalı]


85

Kafam karışmış bir acemi ve hobici programcıyım, bu konuyu anlamaya çalışıyorum, bu yüzden sorum biraz yanlışsa veya pek mantıklı gelmiyorsa beni affet.

SO hakkında tasarım modellerinin kullanımı etrafında dönen pek çok soru görüyorum ve merak ediyorum herhangi birinin tasarım modellerini öğrenmek ve uygulamak için iyi bir kaynağı var mı? Genel fikri anlıyorum ve birkaçını nasıl / ne zaman kullanacağımı biliyorum (Tekli tonlar, Fabrika yöntemleri) ama kaçırdığımı biliyorum.

(Önemli olması durumunda, tercih ettiğim dil C # ama diğer dillerdeki örneklerden öğrenebilirim)

Yanıtlar:


84

Head First Design Patterns

alternatif metin

ve Tasarım Modeli Wikipedia sayfası yeni başlayanlar için en iyi kaynaklardır. FluffyCat hem tasarım kalıpları için başka iyi, ücretsiz online kaynaktır Java ve PHP .

The Gang of Four kitabı daha sonra nereye gideceğidir, ancak oldukça ilerlemiştir, bu yüzden diğer kaynaklardan oldukça sağlam bir şekilde kavrayana kadar beklerim.


4
Head First Design Patterns için C # kodu örnekleri msquaredweb.com/DesignPatterns/…
toolkit

5
O kitaba baktım ... ondan nefret ettim. Ben de GoF kitabını aldım ve bundan tasarım kalıpları hakkında her şeyi öğrendim. Biraz kuruydu ama çok daha bilgilendiriciydi.
Thomas Owens

1
Başlangıçta ilk kitabın tamamen mide bulandırıcı olacağını düşünmüştüm (metafor açısından ağır ve çok konuşma tonu var) .. ama aslında gerçekten yaratıcı ve bilgilendirici; Risk alıp satın aldığım için çok mutluyum. Imo, çetenin seçilmesi = gereksiz mazoşizm.
codeinthehole

2
İlk kitabın başını tamamen mide bulandırıcı buldum. "Eğlenceli" olmak için o kadar çok zaman harcıyor ki, temel fikirleri zayıf bir şekilde aktarıyor - kayboluyorlar. Okumak, birinin babasının havalı olmaya çalışmasını izlemek gibi. Ancak GoF kitabı diğer uç noktadır ve bu nedenle herkes için değil.
Draemon

2
@Bill: Biliyorum ama @Thomas ve @Draemon'un yorumlarına katılıyorum. Programlama sınıflarının algoritmaları için bu kitap serisini tavsiye eden programlama odaklı olmayan arkadaşlarım, onlardan nefret ettiler ve sayfa başına bilgi miktarı daha yüksek olduğu için "daha kuru" kitaplara girdiler. Bu sadece bir tercih meselesi. Küçük yaşlardan beri teknik kitaplar okuyorum ve son derece teknik bir liseye gittim, bu beni "kuru" kitapları okumaya alıştırmış olmalı. Evcil hayvanların benimle aşağılanıp aklını karıştıran değil, benim için asimile edebileceğim sade bilgileri tercih ederim.
Esteban Küber

27

Tasarım kalıpları çeşitli nedenlerle harikadır:

  1. size yaygın problemleri çözmek için bir başlangıç ​​sağlar.
  2. geliştiricilere problem çözmenin belirli yolları hakkında çok kompakt bir şekilde konuşmaları için bir kelime hazinesi verir.
  3. Tasarım kalıplarını bilen ve çözümlerinizde tasarım kalıplarını kullanan geliştiricilerle çalışırken, çözümleri çok daha hızlı anlayacaklardır.

Ancak amacınız sadece tasarım modellerini öğrenmek olduğunda, temelleri kaçırdığınızı düşünüyorum. Tüm tasarım modelleri daha yaygın ilkelere dayanmaktadır. High Cohesion, Low Coupling Open Closed Principle, DRY, Liskov Substitution Principle vb. Bu temeller için aşağıdaki kitapları bu sırayla okurdum:

  1. Head First Object-Oriented Analysis and Design (Head First) [RESİMLE] (Ciltsiz Kitap)
  2. UML ve Kalıpları Uygulama (Ciltli)
  3. C # 'da Çevik İlkeler, Modeller ve Uygulamalar (Robert C. Martin Serisi) (Ciltli)

Bundan sonra, dört tasarım modelinden oluşan temel çete için hazırsınız

  1. Önce Baş Tasarım Modelleri (Önce Baş) [RESİM] (Ciltsiz Kitap)
  2. İncil
  3. Güzel bir web sitesi (hiçbir şey satın almayın, buna değmez) http://dofactory.com/Patterns/Patterns.aspx (bu sitenin bazı uygulamaları tartışmaya değer

Sonraki adım:

  1. Kurumsal Uygulama Mimarisi Kalıpları (Addison-Wesley Signature Series) (Ciltli)
  2. POSA kitapları

Ve her zaman hatırlayın: hedefin model değil!


2
Tasarım modellerini öğrenmeye başlamak için OO'nun temellerinin (kapsülleme, kalıtım, çok biçimlilik, vb.) Yeterli olduğunu düşünüyorum. Diğer ilkeleri (Yüksek Uyum, Düşük Kaplin Açık Kapalı İlke, KURU, Liskov İkame İlkesi, vb.) Öğrenme kalıpları ile öğrenebilirsiniz.
Bill the Lizard

Tasarım modellerini yalnızca OO'nun temelleri ile öğrenebileceğinizi kabul ediyorum. Ama sonra, bir kalıbı çalıştırabileceğiniz, ancak bunun neden iyi bir tasarım olduğunu, hangi değiş tokuşları yaptığınızı ve kalıplarda nasıl çeşitlemeler yapabileceğinizi henüz tam olarak anlamadığınız noktaya varırsınız.
KeesDijk

20

"Dörtlü Çete" nin Design Patterns kitabının, tasarım desenleriyle ciddi şekilde ilgilenen herkes için bir İncil olduğunu da eklemek isterim .


13
Veya programcı arkadaşlarına Gang of Four kitabını okuduklarını söylemek isteyenler için :)
Dave Markle

14

Tavsiyem:

Farklı kaynaklardan gelen desenler hakkında çok şey okuyun.

Bu nokta iyi sonuçlar vermeyeceğinden, yazdığınız tüm koda mümkün olduğunca çok sayıda kalıp yerleştirmeye çalışmak. Bunun yerine, bilginin bir süre beyninizin içinde kalmasına izin verin (okuyun: aylar).

Birdenbire kendinizi bir soruna veya bir kod parçasına tökezlerken bulacaksınız ve bu özel soruna bir çözüm olarak işe yarayabilecek bir şey gördüğünüzü belli belirsiz hatırlayacaksınız. Şimdi düşündüğünüz modelin ayrıntılarına bakma ve onu uygulamaya çalışma zamanı.

Zaten benim için de işe yarayan buydu.


9

Tasarım desenleri

Bu eğitim sitesi aşağıdaki alt bölümleri içerir

  • Hedefi her tasarım modelinin
  • Tasarım modeli için Gerçek Dünya Yapısı
  • Bir Sorun ifadesi
  • Sorunla ilgili ayrıntılı tartışma
  • Bir kalıba nasıl ulaşılacağına dair kontrol listesi
  • Modele ulaşırken pratik kurallar .
  • C #, C ++, Delphi, Java ve PHP içeren tasarım deseni için kod parçacıkları

Bu site ayrıca Anti Patterns , UML ve Refactoring hakkında kılavuz içerir .


Web sitesini çok faydalı buldum. Güzel, açık örnekler.
Augustas



5

Yararlı bulduğum ve iyi yazılmış bir giriş kitabı, Alan Shalloway ve James Trott (Addison Wesley) tarafından Açıklanan Tasarım Desenleri .

alternatif metin

Do not başlamak Dört Gang hiçbir şekilde tanıtıcı bir kitap değil için, kitabın.


4

Jean Paul Boodhoo'nun DNRtv'de Tasarım Modellerini Demistifiye Etme konusundaki kintolojisine (?) Bir göz atmanızı tavsiye ederim. Video kayıtları Singleton, Abstract Factory'ye değiniyor - aradaki fark, o teoriyi tartışırken kod yazmasını izleyebilmenizdir. Hafta içi yağmurlu bir gün öğle yemeğini izlemek güzel.

http://www.dnrtv.com/default.aspx?showNum=63 http://www.dnrtv.com/default.aspx?showNum=65 http://www.dnrtv.com/default.aspx?showNum= 68 http://www.dnrtv.com/default.aspx?showNum=71 http://www.dnrtv.com/default.aspx?showNum=92


DnrTV çöktü! Çok yazık çünkü Boodhoo'nun ekran görüntüleri bilgilendirici. Başka bir yerde barındırılan videoları gördünüz mü? Video dosyalarınız var mı, onları çevrimiçi tutmaktan memnuniyet duyarım.
Stephan Luis

4

Yukarıdaki yorumlara bir ek açıklama.

GOF Kalıpları İçin Hızlı Başvuru

İşte dofactory.com/patterns/patterns.aspx'e başlayabileceğiniz iyi bir yer - İlgili uygulamalarla birlikte her modelin bağlantısını bulabilirsiniz.

Ancak bunların GOF kalıpları olduğunu unutmayın. OOAD konusunda yeterince uzmanlık kazandıktan sonra, gelişmiş kalıpları da okuyup anlamanız gerekebilir. Head First Design Patterns iyi bir başlangıçtır ve biraz ilerleme kaydettikten sonra Martin Fowler'ın Kurumsal Uygulama Mimarisi Modellerini tercih edin.

Tasarım Modellerini Uygulama - Düşünce Süreci

Başka bir ana özellik - Tasarım modellerini uygulamak, onları bilmek kadar önemlidir. Bu makaleleri okumak da size yardımcı olabilir.

Tasarım Desenlerini Uygulama Bölüm I

Tasarım Desenlerinin Uygulanması Bölüm II

Bu yardımcı olur umarım


3

Head First Design Patterns, daha önce belirtildiği gibi iyi bir modeldir. Bunun yanında tabii ki orijinal kitap ve C # Tasarım Kalıpları. Ayrıca daha önce bahsedilen iyi web siteleri var.

Kendi kendine öğrenmenin yanı sıra , bölgenizde bir örüntü çalışma grubuna başlamanızı veya katılmanızı şiddetle tavsiye ederim . Açıklamalar ve kalıpları incelemek için harika bir düzen için Kalıpları Tasarlamak İçin Bir Öğrenme Kılavuzuna bakın . Bunu yaptık ve dürüstçe şunu söyleyebilirim ki şu anki kadar anlayamayacağım. İlgili diğer insanlarla haftalık bir toplantı, tasarım kalıpları gibi soyut bir şey öğrenirken şaşırtıcı bir şekilde disiplinli kalmanızı sağlar.

Mutlu çalışmalar!


3

Kitaplara para harcamadan önce Wikipedia'nın mükemmel tasarım modelleri sayfasını tavsiye ederim . Ayrıca "desen ekran kayıtları" için Google'da farklı bir şey arayın veya YouTube'da "tasarım modelleri" arayın . Aynı bilgilerin farklı şekilde sunulması çoğu zaman kuruşun düşmesine yardımcı olur.

Dört Gang kitabı en iyi bilinen kalıpları kesin metindir ama okumak o kadar kolay ve C ++ örnekleri herkesin en sevdiği değil ile değil.

Kafa İlk Tasarım Desenleri metin çok daha erişilebilir fakat sadece dört desen Gang bir alt kümesini içerir.

En önemli şey, belirli bir modelin nerede ve neden yararlı olduğunu anlamaktır. Daha sonra, seçtiğiniz dilde uygulama örnekleri için web'de arama yapın ve "anlayana" kadar deneyin. Bir sonrakine geçmeden önce bir kalıbı anlayın. Herkes bazı kalıpları diğerlerinden daha iyi anlar (ve daha az bilinen yüzlerce model vardır).

Sadece fişe takmaya devam edin.



2

Kurumsal Uygulama Mimarisi Modelleri (Ciltli), Martin Fowler

Kalıplara Yeniden Düzenleme (Ciltli), Joshua Kerievsky

Sürekli Entegrasyon: Yazılım Kalitesinin İyileştirilmesi ve Riskin Azaltılması (Ciltsiz Kitap) Paul Duval ve diğerleri tarafından yazılmıştır.

Yazılım Mimarisinin Ötesinde: Kazandıran Çözümler (Ciltsiz Kitap) Yaratmak ve Sürdürmek, Luke Hohmann


2

Tasarım desenleri herhangi bir kütüphane işlevi gibidir, onlar hakkında okuyun, sonra bir sorun ortaya çıktığında, tasarım deseni "Araç Kutusu" nuzda olacaktır. Orijinal "Dörtlü çete" tasarım desenlerinden sonra desenlenmiş birçok tasarım deseni kitabı vardır.

Herhangi bir programcı için, bunun ve Fowler'ın Refactoring kitabının mutlak minimum gereksinimler olduğunu düşünüyorum.


POSA kitapları "GOF modeline göre şekillendirilmedi" - GOF ilk basılacaktı - aynı zamanda üretimdeydi.
Tim

1
Herhangi bir karışıklığı önlemek için, ÇOĞU tasarım modelinin bir kitaplıkta uygulanmadığını söylemek istiyorum. Kitaplık sınıfları bir araya getirilerek birçok desen oluşturulur.
Bill the Lizard

Bunu bir kütüphanede yapılabilecekmiş gibi yaptım - bunun için üzgünüm, açıklama için teşekkürler, Bill. Tasarım desenleri genellikle LIKE kitaplıklarıdır, ancak tipik olarak bir kitaplığa Koyamayacağınız şeyler - birbirinin bilmediği sınıfların etkileşimde bulunduğu farklı yollar gibi.
Bill K

2

Web siteleri için, ajaxian web sitesinin geliştiricilerinden birinin hazırladığı çok iyi bir site http ://ajaxpatterns.org'dur.


2

Orijinal Tasarım Modelleri kitabı, tüm programcılar için mutlaka okunması gereken bir kitaptır.

Her düzeyde mükemmel bir kitaptır: düzen, açıklık, içgörü, derinlik. İlk önce baştan sona okuduğunuz ve daha sonra baştan sona öğrenene kadar referans olarak kullandığınız harika kitaplardan biridir.

Wikipedia sayfasından başlayabilirsiniz , ancak kendinizi harika kitapla da ödüllendirebilirsiniz.



2

Tasarım kalıplarını okursanız, Java'nın bunlardan birkaçının uygulandığını fark edeceksiniz.

Herhangi bir çerçeve için kaynağa bakın ve tasarım kalıpları hakkında bilgi edinebilirsiniz. Şahsen ben bunların hiçbir koduma tam olarak uyduğunu görmüyorum, bazen kitaplardaki ve öğreticilerdeki örnekler biraz idealize edilmiş görünüyor, özellikle de yalnız kodlayıcı için.

Tasarım kalıpları tembel kodlayıcılar için değildir.


2

Ben ve meslektaşlarım için, Pattern Study Group'u takip eden Design Pattern üzerinde çalışıyoruz . Sırayla öğrenmemiz gereken her bir modelin bir listesini hazırlarlar ve ayrıca grup içinde daha fazla tartışma yapan açılış sorularına sahiptirler.


1

Head First Design Patterns'i okuduktan sonra Refactoring to Patterns bölümünde bir shufty sahibi olmanızı öneririm .

Not: Kod örnekleri Java'dadır, ancak C # örneklerine çok benzer olmalıdır ...


1

Çok az deneyime sahip birinin tasarım modellerini çok derinlemesine araştırması bana çok mantıklı gelmiyor. Var olduklarını bilmek harika, ancak bu noktada sadece tasarım kalıplarını öğrenmek yerine başka şeylere odaklanmalısınız.

Bir problem bağlamında kullanışlıdırlar - yeni / yeni başlayan bir geliştirici için bir kavram olarak, bunları ne zaman ve nerede kullanabileceğinizi bilmenin dışında gerçekten çok fazla pratik değer değildirler.

DÜZENLE Açıklığa kavuşturmak için - birçok tasarım modeli, bazı alanlarda bulunan sorunların sonucudur. Yeni bir programcının (IMO) bazı problemler için kullanacağı tasarım modellerini bilmesi pek beklenemez (IMO). Bilgisayar bilimleri çalışmalarında algoritmaların dağınık bir şekilde dağılmasını sağladığımız gibi, kalıplarla yapabileceğimiz şeyleri ve bunların faydalarını anlamamız gerekir, ancak bir kişi hala merhaba dünyasını inşa ederken veya stl'yi keşfederken, tasarım modellerine çok fazla pratik ihtiyaç yoktur. Kalıplar harika. Ama onlar sihirli değnek değiller.

(Ne CASE (araçlar), ne UML, ne de UML, ne SCRUM, ne TDD, ne STL, ne Java, ne de XML vb.) Bunların hepsi mesleğimizin sadece yönleri ve bu konuları ikinci olarak ele almak gelmek saflıktır.


Ancak kalıplar hakkında bir bilginiz yoksa, kendi probleminize hitap eden bir tane olup olmadığını bilemezsiniz. Evet, yeni başlayan biri olarak bir kalıba İHTİYACINIZ OLMAZ, ancak bu ihtiyaç ortaya çıkmadan kalıpları öğrenmek önemlidir.
Elie

Sanırım bunu yazımda ele aldım ...
Tim

Sadece var olduklarını bilmekten daha fazlasına ihtiyacınız var .... nasıl çalıştıklarını ve kullanıldıkları türden durumları bilmelisiniz. Bu yüzeysel bilgiden biraz daha fazlası. Bir kalıbı kullanmadan önce yıllar geçebilir, ama kullandığınızda, kalıbı öğrenmenin zamanı değil.
Elie

Yani bir aceminin düzinelerce veya daha fazla kalıp öğrenmesi ve anlaması gerektiğini mi söylüyorsunuz? Bu arada masadan ne çıkıyor? Kalıplara karşı tartışmıyorum. Ayrıca bir JIT kalıbının özelliklerini öğrenmenin kötü bir şey olduğunu düşünmüyorum. Diğer şeylerden önce kalıpları öğrenmek IMO kullanışlı değil
Tim

1

Kalıplar, programcıların soyut tasarım hakkında konuşmak için kullandıkları üst düzey kelime dağarcığından oluşur. Soyut bir çözümü yeniden kullanıyorsanız, ona adıyla atıfta bulunmak faydalı olacaktır. Bir kalıp icat ederseniz, ona daha önce bir isim verilmediğinden emin olmak için biraz kontrol yapmak profesyoneldir. Adlandırılmışsa, açıklama yararlı olabilir.

Küçük bir parçayı bile kodladıktan sonra, daha önce kodladığınız şeye benzer bir şey yazdığınızı fark edeceksiniz. Bu bir kalıptır. Küçük bir desen olsa bile fark etmeye değer. Daha iyi bir model var mı? Daha büyük bir sorunu çözmek için birlikte iş birliği yapan bazı küçük kalıplar görüyor musunuz? Bir dahaki sefere, daha büyük bir problemi çözmek istediğinizde, tüm model aklınıza tek bir parça olarak gelir. Ayrıntılı kod satırlarını detaylandırmak mekanik hale gelir.

Kalıpları ne kadar çok fark ederseniz, programlama o kadar kolay olur ve diğer programcılar tarafından geliştirilen en büyük ve en iyi kalıpların bazılarını o kadar çok takdir edersiniz. MVC modelinde ustalaşmayı deneyin. Öyle ya da böyle, küçük tasarım kararlarında bile varyasyonlar her yerde ortaya çıkıyor.


1

Konsepti anladıktan sonra, Eclipse kaynak kodunu veya tasarımını gözden geçirin, bu kalıpların birçok gerçekten iyi örneğini (şaşırtıcı değil, Gamma tasarımcılardan biriydi).


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.