Tasarım kalıpları nasıl incelenir? [kapalı]


351

Tasarım desenleri hakkında 4-5 kadar kitap okudum ama yine de tasarım desenlerinde orta seviyeye yaklaştığımı düşünmüyorum?

Tasarım desenlerini nasıl incelemeliyim?

Tasarım kalıpları için iyi bir kitap var mı?

Bunun sadece tecrübe ile geleceğini biliyorum ama bunlarda ustalaşmanın bir yolu olmalı?


6
Tasarım desenini öğrenmenin en iyi yolu bir proje yapmaktır. Projede desenleri gördüğünüzde, bunları ne zaman kullanacağınızı bileceksiniz, burada bir modelle tasarım desenini adım adım öğreten bir makale codeproject.com/Articles/1009532/…
Shivprasad Koirala

1
Antipatterns'e de bir göz atın deviq.com/antipatterns
Geliştirici

Buradan öğrenebilirsiniz, play.google.com/store/apps/…
Keyur Thumar

Muhtemelen geç ama yine de birine yardımcı olabilir .. nerede kullanılabileceğini açıklanan temelleri ve senaryoları anlamak için geeksforgeeks.org/software-design-patterns deneyin . Her desenin temelini ve amacını anlamama yardımcı oldu
Zeetit

Ayrıca bakınız, Pluralsight: pluralsight.com/courses/patterns-library
ssmith

Yanıtlar:


206

En iyi yol onlarla kodlamaya başlamaktır. Tasarım örüntüleri sadece onları okumaktan uygulamak zor olan harika bir kavramdır. Çevrimiçi bulduğunuz bazı örnek uygulamaları ele alın ve onların etrafında oluşturun.

Harika bir kaynak Veri ve Nesne Fabrikası sayfasıdır. Desenlerin üzerinden geçer ve hem kavramsal hem de gerçek dünya örnekleri verir. Referans materyalleri de harika.


11
Kesinlikle! Ben her zaman yazılım "Bilgisayar Bilimi" altına düşüyor eğlendirildi. Donanım argümanını görebiliyorum, ancak yazılım çok kesin olmayan bir bilim için!
Joseph Ferris

Ne yazık ki bu kaynak artık mevcut değil :(.

5
@NielsW Sorun değil, belki sadece geçici bir durumdu.
uthomas

211

Üç kitap okudum ve OReilly'nin İlk Tasarım Desenlerini okuyana kadar kalıpları çok iyi anlamadım . Bu kitap gözlerimi açtı ve gerçekten iyi açıkladı.

alt text


14
İlk başta buna benzeyen "ciddi" bir kitaptan okumak biraz garip, ama okumaya devam ederken aslında bir değişim kavramlarını anladığımı fark ettim. Kesinlikle bir okumaya değer.
Tim Whitcomb

18
Kesinlikle bunun tasarım kalıplarını öğrenmek için en iyi kitap olduğunu düşünüyorum. GoF kitabı, onları daha iyi anladıktan sonra referans olarak kullanılmalıdır.
Kertenkele Bill

3 kitap okuduğunu söylemiştin. bunu da okudun mu? amazon.com/… öyleyse, ne düşünüyorsun?
sivabudh

11
2006 yılında Nantes, Fransa'da düzenlenen bir konferansta Erich Gamma (GoF'tan biri) ile tanıştım ve bu kitabın GoF kitabından daha fazla
satıldığını söyledi

1
Bu kitabı okuduktan sonra, OO mantıklı geldi. @SimpleFellow GoF kitabı donuk. Tasarım örüntüleri hakkında önceden bilgi sahibi olmanız, hiçbir zaman uyumanızı sağlar. Ancak iyi (olan ) bir kaynak kitap ve DDD ve EAA P ile birlikte herhangi profesyoneller kütüphanenin bir parçası olmalıdır.
mbx

93

Böyle eski soru için iki sentim

Bazı insanlar zaten bahsetti, pratik ve yeniden düzenleme. Desenler hakkında bilgi edinmek için doğru sıranın bu olduğuna inanıyorum:

  1. Test Odaklı Geliştirme (TDD)
  2. Yeniden düzenleme öğrenin
  3. Kalıpları öğren

Çoğu insan 1'i görmezden gelir, birçoğu 2 yapabileceğine inanır ve neredeyse herkes 3'e düz gider.

Benim için yazılım becerilerimi geliştirmenin anahtarı TDD'yi öğrenmekti. Uzun süre acı verici ve yavaş kodlama olabilir, ancak testlerinizi yazmak ilk önce kesinlikle kodunuz hakkında çok düşünmenizi sağlar. Bir sınıfın çok fazla kazan plakasına ihtiyacı varsa veya kolayca kırılırsa, kötü kokuları oldukça hızlı fark etmeye başlarsınız

TDD'nin ana yararı, kodunuzu yeniden düzenleme korkunuzu kaybetmeniz ve sizi oldukça bağımsız ve uyumlu sınıflar yazmaya zorlamanızdır. İyi bir test seti olmadan, kırık olmayan bir şeye dokunmak çok acı vericidir. Güvenlik ağı ile kodunuzda ciddi değişiklikler olacak. İşte o zaman pratikten öğrenmeye başlayabileceğiniz andır.

Şimdi, kalıplar hakkında kitaplar okumalısınız ve bence, bu çok çabalamak için tam bir zaman kaybı. Sadece benzer bir şey yaptığımı fark ettikten sonra kalıpları çok iyi anladım ya da mevcut koda uygulayabilirim. Güvenlik testleri ya da yeniden düzenleme alışkanlıkları olmadan, yeni bir projeye kadar beklerdim. Yeni bir projede kalıp kullanma sorunu, çalışma kodunu nasıl etkilediğini veya değiştirdiğini görmemenizdir. Kodumu bunlardan birine yeniden koyduğumda bir yazılım modelini anladım, asla kodumda bir tane tanıttığımda.


u TDD için bazı kitaplar tavsiye edebilir ve büyük ölçüde C ++
anand

2
C ++ 'a daraltıyorsanız, kaliteli içerik bulma konusunda birçok sorununuz olacaktır. Ayrıca C ++, test öğrenmek istediğiniz dil değildir, çünkü teknik olarak, sadece iyi test araçları oluşturmak çok zorlaştıran yansımadan yoksundur. Hala yapılabilir, ancak topluluklar, forumlar, tartışma ve TDD insan sayısı bu nedenle C ++ içinde bir azınlıktır. Onunla çok çalıştım, ancak güçlü yanlarına rağmen, test dostu bir dil değil.
SistematikFrank


35

Uygulama, uygulama, uygulama.

Çello çalmayı yıllarca okuyabilir ve yine de enstrümana bir yay koyamaz ve müzik gibi görünen bir şey yapamazsınız.

Tasarım kalıpları en iyi şekilde üst düzey bir sorun olarak kabul edilir; ancak bunları yararlı olarak tanımak için gerekli deneyime sahipseniz önemlidir. Yararlı olduklarının farkında olmanız iyi, ancak uygulanacakları veya başvurdukları durumlar görmediyseniz, gerçek değerlerini anlamak neredeyse imkansızdır.

Yararlı hale geldikleri yer, başkalarının kodundaki tasarım desenlerini tanıdığınız veya tasarım aşamasında bir desene iyi uyan bir sorunu tanıdığınız zamandır; ve sonra biçimsel örüntüyü inceleyin ve problemi inceleyin ve aralarındaki deltanın ne olduğunu ve hem örüntü hem de problem hakkında ne söylediğini belirleyin.

Gerçekten kodlama ile aynı; K&R, C için "İncil" olabilir, ancak onu birkaç kez örtbas etmek okumak pratik bir deneyim sağlamaz; deneyimin yerini tutamaz.


5
+1. Birçok aceminin tasarım desenlerine çok hızlı atladığını ve doğrudan fabrikalardan, tek tekler, gözlemciler, ziyaretçiler vb. Sonuç genellikle ağırdır, dilin en iyi şekilde kullanılmasını sağlamaz ve temel bir birleştirme / uyum açısından iyi tasarlanmış bile değildir (ikincisi özellikle tasarım desenleri kötü uygulandığında acı çeker). Tasarım modellerinin nerede uygun olduğuna karar vermek ve hatta belirli bir dilde en uygun şekilde nasıl uygulanacağına karar vermek daha fazla deneyim gerektirir.
11:47

25

Uygulama pratiği. Bence 4 ila 5 kitap, iyi bir pratik yapmadan aşırı bir okuma alıştırmasıdır. Bunu yapmanın en iyi yolu, inanıyorum ki, mevcut projelerinizi kalıpları kullanarak yeniden düzenlemeye başlamaktır . Ya da aktif olarak üzerinde çalıştığınız herhangi bir projeniz yoksa, sadece kendi yolunuzla yapın ve desenlere yeniden odaklanmayı deneyin .

Çözdükleri sorunlardan etkilenmediyseniz, onları tam olarak takdir edemezsiniz. Ve lütfen gümüş mermi olmadığını unutmayın - onları ezberlemenize ve anında uygulamak için zorlamanıza gerek yoktur. Benim görüşüm..


15

Kendinize şu soruları sorun:

Onlar ne yapar?

Neyi / çiftini ayırıyorlar?

Ne zaman kullanmalısın?

Ne zaman kullanmamalısınız?

Hangi eksik dil özelliği onları ortadan kaldırır?

Bunu kullanarak ne gibi teknik borç alıyorsunuz?

İşi yapmanın daha basit bir yolu var mı?


14
ve son olarak kendinize yukarıda bahsedilen tüm soruların cevaplarını nereden alacağınızı sorun
Jatin Dhoot

@JatinDhoot düşünerek ..
gtrak

8

Biri çözdüğü sorunları ve diğer (daha kötü) sorunları uygulayanları anlayana kadar bazı modellerin faydalarını anlamanın veya anlamanın biraz zor olduğunu gördüm.

GOF ve POSA kitapları dışında gerçekten okumadım, bu yüzden size başka tavsiyeler veremem. Gerçekten sadece sorun alanları hakkında bir anlayışa sahip olmanız gerekir ve bence daha az deneyimli geliştiricilerin kalıpların faydalarını takdir edemeyebilir. Bu onlara karşı hiç de hafif değil. Öncelikle kötü alternatiflerle mücadele etmek zorunda olduğunda iyi çözümleri kucaklamak, anlamak ve takdir etmek çok daha kolaydır.

İyi şanslar


Çözmek istedikleri sorunları anlamak için +1. Sorun, sorunları ilk elden görmek (kişisel önemi olan gerçek bir projede). Kitaplardaki çok fazla örnek problem basitleştirilmiştir. Head First Design Patterns kitabını sevmemin nedenlerinden biri, naif çözümlerle ilgili bazı sorunları ve bu çözümlerin ne kadar savunulmaz olduğunu göstermeleridir. Sonra deseni ve ne kadar temiz olduğunu sunarlar ... Örneğin, o kitaptaki Dekoratöre göz atın.
Fuhrmanator

8

Birçok iyi örnek verilmiştir. Bir tane eklemek istiyorum:

Onları yanlış uygula. Bunu kasıtlı olarak yapmanız gerekmez, bunları ilk Tasarım-Desen-uyumunuza uygulamaya çalıştığınızda gerçekleşir. Bu süre boyunca, karşılaşacağınız her sorun tam olarak bir tasarım modeline uyuyor gibi görünecektir. Çoğu zaman problemlerin hepsi bir nedenden dolayı aynı tasarım modeline uyuyor gibi görünmektedir (Singelton bunun için birincil adaydır).

Ve deseni uygulayacaksınız ve iyi olacak. Ve birkaç ay sonra, koddaki bir şeyi değiştirmeniz ve belirli bir deseni kullanmanın o kadar akıllı olmadığını görmeniz gerekecek, çünkü kendinizi bir köşeye kodladınız ve tekrar refactor olmanız gerekiyor.

Kabul edersek, bu gerçekten 21 gün içinde bunu yapacaksınız ve öğreneceksiniz bir cevap değildir, ancak benim tecrübelerime göre, size konuyla ilgili iyi bir fikir verme olasılığı en yüksektir.


7

Allan Shalloway'ın "Tasarım Desenleri Açıklaması" nı okudunuz.

Bu kitap diğer tasarım deseni kitaplarından çok farklıdır, çünkü bir desen kataloğu değildir, ancak öncelikle desenlerle kolayca eşleşen bir problem alanını ayrıştırmanın bir yolunu sunar.

Sorunlar iki bölüme ayrılabilir: yaygın olan şeyler ve değişen şeyler. Bu yapıldıktan sonra, ortak şeyleri bir arayüzle ve bir uygulamaya göre değişen şeyleri eşleştiririz. Özünde, birçok örüntü bu "örüntü" içine girer.

Örneğin, Strateji modelinde, ortak şeyler stratejinin bağlamı olarak, değişken kısımlar da somut stratejiler olarak ifade edilir.

Bu kitabı, benim için bir telefon rehberi okumakla aynı derecede heyecanlı olan diğer desen kitaplarının aksine kışkırtan düşünülmüş buldum.


6

7
Bu kitabı "göz açıcı" bir kitap olarak tavsiye etmem :)
Geo

73
Göz alıcı bir kitap olarak tavsiye ederim. Yatmadan önce bu tome birkaç sayfa ve uykusuzluk geçmişte olacak.
Dónal

2
Bu kitabı okurken günün ortasında uyuduğumdan sonra buraya geldim. 'tasarım kalıplarını anlama' araması yaptı. gönderiyi buldu. yukarıdaki yorumu buldum. günümü şenlendirdin. başkalarına katılıyorum, göz kamaştırıcı bir kitap
aimme


4

Birkaç tasarım modeli tartışma grubuna öncülük ediyorum ( sitemiz ) ve 5 veya 6 kalıp kitap okudum. İlk Tasarım Desenleri kitabından başlayıp bir tartışma grubuna katılmanızı veya bir tartışma grubuna başlamanızı öneririm. Head First kitabı ilk başta biraz Hasboro gibi görünebilir, ancak çoğu insan bir veya iki bölümü okuduktan sonra bunu sever.

Olağanüstü kaynağı kullanın - Joshua Kereivisky'nin kalıp düzeni ve tartışma grubunuza yardımcı olmak için Kalıpları Tasarlamak için Bir Öğrenme Kılavuzu . Deneyim dışında, siparişe önerdiğim bir değişiklik Stratejiyi ilk sıraya koymak. Günümüzün geliştiricilerinin çoğu, bir Fabrikanın iyi veya kötü bir enkarnasyonunu yaşamışlardır, bu nedenle Fabrika ile başlamak, model hakkında çok fazla konuşma ve karışıklığa yol açabilir.Bu, oldukça önemli olan kalıpların nasıl çalışılacağını ve öğrenileceğine odaklanma eğilimindedir. ilk buluşma.


3

HeadFirst DesignPattern'i öneririm. Kitabı okumak yeterli değildir, kavramları özümsedikten sonra zihninizde ortaya çıkan birçok sorunun cevabını bulmanız ve bu kalıplarda kullanılabilecek gerçek yaşam uygulamalarını bulmaya çalışmanız gerekir. Ben de aynısını yapıyorum ve bu sorular aptalca bile olsa sorular sormaya başladım.


2

Benim önerim, birkaçını uygulamak ve bunların bazı uygulamalarını analiz etmek olacaktır. Örneğin, .Net içinde, Veri Bağdaştırıcılarına bakarsanız bağdaştırıcı desenlerinin yanı sıra çerçeveye biraz kazı yaparsanız birkaç tane daha kullanır.


2

En iyi kitap hakkında bir fikrim yok, ama saflar Tasarım Desenleri: Yeniden Kullanılabilir Nesneye Dayalı Yazılım Öğeleri diyebilir

Kişisel favorime göre, O'Reilly tarafından yayınlanan Head First Design Patterns'i seviyorum . Bana hitap eden bir konuşma sesiyle yazılmış. Okuduğumda, kaynak kodumu aynı anda inceledim ve okuduğum şeye uygulandığını görmek için. Eğer öyleyse, yeniden düzenledim. Sorumluluk Zinciri'ni böyle öğrendim.

Uygulama - Uygulama - Uygulama.


2

Tasarım örüntüleri sadece bir araçtır - kütüphane işlevleri gibi. Orada olduklarını ve yaklaşık işlevlerini biliyorsanız, gerektiğinde onları bir kitaptan kazabilirsiniz.

Tasarım kalıpları hakkında hiçbir sihir yoktur ve iyi bir programcı herhangi bir kitap çıkmadan önce% 90'ını kendileri için bulmuştur. Çoğunlukla, kitapların çeşitli kalıplar için adları tanımlamakta en yararlı olduğunu düşünüyorum, böylece daha kolay tartışabiliriz.


2

Tasarım kalıplarını öğrenme şeklim çok korkunç yazılımlar yazmak. 12 yaşımdayken neyin iyi neyin kötü olduğu hakkında hiçbir fikrim yok. Sadece spagetti kod yığınları yazdım. Önümüzdeki 10 yıl boyunca hatalarımdan öğrendim. Neyin işe yarayıp neyin yaramadığını keşfettim. Ortak tasarım desenlerinin çoğunu bağımsız olarak icat ettim, bu yüzden tasarım desenlerinin ne olduğunu ilk duyduğumda, onlar hakkında bilgi edinmek için çok heyecanlandım, sonra zaten sezgisel olarak bildiğim şeyler için bir isim koleksiyonu olduğunu hayal kırıklığına uğrattım. (10 yıl içinde kendinize C ++ öğretme şakası aslında bir şaka değil)

Hikayenin ahlakı: çok sayıda kod yazın. Diğerlerinin söylediği gibi, pratik yapın, pratik yapın, pratik yapın. Mevcut tasarımınızın neden kötü olduğunu anlayana ve daha iyi bir yol aramaya başlayana kadar, çeşitli tasarım modellerinin nereye uygulanacağı konusunda iyi bir fikriniz olmayacağını düşünüyorum. Tasarım deseni kitapları, anlamadığınız bir soruna yapıştırılmış bir çözüm değil, diğer geliştiricilerle tartışmak için size rafine bir çözüm ve ortak bir terminoloji sağlamalıdır.


2

Tasarım kalıplarını okuyan ve bunları kodlayan pratik IMO'ya gerçekten yardımcı olmayacaktır. Bu kitapları okurken 1. Belirli bir tasarım modelinin çözdüğü temel soruna bakın, Yaratıcı Desenler ile başlamak en iyi seçenektir. 2. Geçmişte kod yazdığınızdan eminim, tasarım modellerinin bir çözüm sunmayı amaçladığı aynı sorunlarla karşılaşıp karşılaşmadığınızı analiz edin. 3. Faktör kodunu yeniden tasarlamaya / yeniden tasarlamaya çalışın veya belki de yeni bir başlangıç ​​yapın.

Kaynaklar hakkında bunları kontrol edebilirsiniz

  1. www.dofactory.com
  2. Tasarım Desenleri: Erich Gamma, Richard Helm, Ralph Johnson ve John M. Vlissides'in Yeniden Kullanılabilir Nesneye Dayalı Yazılım Öğeleri (Addison-Wesley Professional Computing Series)
  3. Kurumsal Uygulama Mimarisinin Kalıpları Martin Fowler

1 hızlı başlangıç, 2 derinlemesine çalışma olacaktır. 3 kurumsal yazılımda öğrendiklerinizi 2 açıklayacaktır veya düşünmenizi sağlamalıdır.

2 sentim ...


1

Tasarım kalıplarını incelemenin de zor olduğunu düşünürdüm. OOP ve orta ila büyük uygulama geliştirme ile ilgili bazı deneyimler hakkında daha fazla bilgi sahibi olmalısınız. Benim için tartışma yapmak için bir grup geliştirici olarak çalışıyorum. Desen çalışmasını tamamladıkları Desenleri Tasarlamak için Bir Öğrenme Kılavuzunu takip ediyoruz . C # ve JavaScript geliştiricileri bir araya geliyor. Benim için fantezi bir şey JavaScript C # geliştirici yazma kodları ve JavaScript geliştirici C # kodları için aynı şeyi yapmak. Bir toplantıdan ayrıldıktan sonra incelemek için evde birkaç kitap araştırıyorum ve okuyorum. Daha fazla anlamanın ve aklımda hatırlamanın daha iyi yolu, http://tech.wowkhmer.com/category/Design-Patterns.aspx adresindeki C # ve JavaScript örnekleriyle bloglama yapmaktır .

Her bir tasarım desenine gitmeden önce lütfen desenlerin adını anlayın. Ayrıca birisi kavramı biliyorsa, sadece programlamada değil, okuma dünyasında da sadece bir örnek veriniz.

Örneğin:

Fabrika Yöntemi:

Dünyayı okuyun: Sadece 5 $, 10 $ veya 20 $ para veriyorum ve nasıl ürettiği hakkında hiçbir şey bilmeden pizza üreteceğim, sadece küçük, orta veya büyük bir pizzayı para girişine bağlı olarak yiyebilirim ya da ne yapabilirim.

Programlama: İstemci sadece $ 5, $ 10 veya $ 20 parametre değerini fabrika yöntemine iletir ve Pizza nesnesini geri döndürür. Böylece istemci bu nesneyi nasıl işlediğini bilmeden kullanabilir.

Bunun size yardımcı olabileceğinden emin değilim. Bu, toplantıya katılan insanların bilgi düzeyine bağlıdır.


Cevaptaki ikinci bağlantı öldü.
Pang

1

Sanırım başka bir tasarım değişikliği nedeniyle kodunuzu 10. kez gözden geçirmenizden sonra saçınızı çıkardığınız bir geliştirici olarak karşılaştığınız bazı sorunları incelemeniz gerektiğini düşünüyorum. Muhtemelen çok fazla yeniden çalışma ve acı olduğunu düşündüğünüz projelerin bir listesi var.

Bu listeden Tasarım Desenlerinin çözmek istediği senaryoları türetebilirsiniz. Farklı veri kümelerinde aynı eylem dizisini gerçekleştirmek için ihtiyaç duyduğunuz bir zaman oldu mu? Bir uygulamanın gelecekteki yeteneklerini kullanabilmeniz gerekecek, ancak mevcut sınıflar için tüm mantığınızı yeniden işlemekten kaçınmak ister misiniz? Bu senaryolarla başlayın ve desen kataloğuna ve çözmeleri gereken sorunlarına geri dönün. GoF ile proje kütüphaneniz arasında bazı eşleşmeler görmeniz olasıdır.


1

Yeni başlayanlar için, Head First Design kalıpları, tüm kalıplara aşina olduğumuzda, gerçek zamanlı nesneleri bu kalıplarda görselleştirmeye çalışacaktır.

Kitap, gerçek dünyada uygulayana kadar, TASARIM DESENLERİNİN YÜKSEK OLMADIĞINDA, temel kavramları anlamanıza yardımcı olacaktır.

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.