Tasarım desenleri genellikle iyi veya kötü için bir güç mü? [kapalı]


33

Dilimlenmiş ekmekten bu yana tasarım desenlerinin en iyi şey olduğunu iddia ettiğini duydum. Ayrıca, tasarım modellerinin "İkinci Sistem Sendromu" nu, aşırı kullanıldıklarını ve kullanıcılarının gerçekte olduklarından daha iyi tasarımcılar olduklarını düşünmelerini sağladığını öne sürdüğünü savunduğumu duydum.

Eski kampa daha yakın düşme eğilimindeyim, ancak son zamanlarda neredeyse her bir etkileşimin gözlemci ilişkisiyle değiştirildiği ve her şeyin bir tekton olduğu tasarımları görüyorum.

Öyleyse, faydaları ve sorunları göz önünde bulundurarak, tasarım kalıpları genel olarak iyi veya kötü mü ve neden?

Yanıtlar:


53

Tasarım kalıpları bir dildir , program ya da sözleşme yazmanızı tavsiye etmez. Birincil kullanımları, bir bileşenin veya sistemin nasıl uygulandığının (ya da uygulanacağının) posteriori açıklamasıdır . Çok fazla ayrıntıya girmek yerine, dinleyicinin nasıl çalıştığını ve neyin önemli olduğunu anlaması için uygulamayı yeterince iyi tanımlayan birkaç kelime söyleyebilirsiniz.

Alex: Hey, config dosyaları nasıl oluşturulur?

Bob: Onlar yaşayan bir fabrika tarafından üretiliyorlar config.h.

Alex artık config dosyalarının oluşturulmasının önemsiz olmayan hazırlıklar içerdiğini biliyor, çünkü başka türlü yaratılmaları bir fabrikaya eklenmeyecek.

Bununla birlikte, eğer Bob bir desen kafalı sahte olsaydı ve burada ve orada sadece desen kullandıysa, Alex yapılandırma oluşturma hakkında hiçbir şey söyleyemezdi, çünkü Bob fabrikaları her yerde kullanıyordu. Bu aynı zamanda programda aşırı karmaşıklığa yol açacaktır.

Öyleyse önce programlayın, sonra kodunuzdaki desenleri görün, tam tersi değil. Bu şekilde etkili bir şekilde kullanılırlar.


11
Yine de +1, ama özellikle "o zaman nokta kalıpları" için - tam olarak ilk sırada kalıpları elde ettik, fakat tekrar eden problemleri arıyoruz .
Frank Shearar

16
Bir nedenden dolayı tasarım desenleri denir . Kodlama yaparken desenleri saptama konusunda yanlış bir şey olmamasına rağmen, kodlama başlamadan önce uygun kalıpları belirlemede yanlış bir şey yoktur. Sorunlar çekiç gibi davranmak ve her şeyin bir çivi olduğunu düşünmekle yatıyor.
George Marian,

11
Önemli olan, bürokratik kod kabiliyetine çok kolay şekilde neden olan "bu kod için hangi Tasarım Şablonunu kullanmalıyım" demek yerine , kodun nasıl çalışacağına dair kalıpları tespit etmektir . Özellikle de, bir dili hedefleyen DP’leri farklı bir kodlama metodolojisi ile yanlış kullandığınızda.
Peter Boughton

Güzel cevap Benim evlat edinme tanımım: herhangi bir teknik, yalnızca yapı zincirinde çalıştırılabilir, derlenebilir yapı olarak tanımlandıktan sonra kabul edilir. Bir yapı zincirinde tek bir gerçek öğretiye değecek kitap, blog ve sert dokuma el dalgası miktarı yoktur.

14

Tasarım desenleri harika . Doğru kullanıldığında, kodun daha bakımlı, okunması ve üzerinde çalışılması daha kolaydır. İyi bir programcı olmanın bir parçası, ne zaman ne zaman duracağınızı ve başka bir yeniden düzenleme işleminin faydalardan ağır basacağını bilmektir. Tasarım desenlerini tek başına kullanmak, birini iyi bir programcı yapmaz, ne zaman ve nerede kullanacağını bilmek. Tıpkı bu dünyadaki herhangi bir şeyde olduğu gibi tasarım desenleri aşırıya çekilebilir ve kötüye kullanılabilir. Her tasarım deseninin bir amacı olduğu ve kusursuz bir yapboz parçası gibi mükemmel bir şekilde düştüğü kodumdaki bu kusursuz dengeyi hala aradığımı (ve uzun bir süre alacağım) biliyorum.


10

Tasarım desenleri, doğru kullanıldığı takdirde harikadır.

Tasarım kalıpları fikrinin mimarlıktan kaynaklandığını hatırlamakta fayda var. Mimari çılgınca değişebilir. Ancak, herhangi bir binada mevcut olan birçok temel fikir vardır. Bu şekilde, desenleri tasarımın yapı taşları olarak düşünün. Her binanın olası tüm mimari kalıpları içermediğine dikkat etmek önemlidir.

Bir ev tasarladığını söyle. Ön kapıyı sokağa açmak yerine, eve girmeden önce korunaklı bir alan istiyorsunuz, yani bir antre. Bu alan belirli bir desene uyacaktır. Yani iki girişi, bazı duvarları ve muhtemelen bir çatısı olacak. Unutmayın, desen kapılar, pencereler veya kaç duvar olduğunu belirtmez. Çoğu uygulamada iki kapı, dört duvar ve belki de pencere olacaktır. Bununla birlikte, desen iki girişi olan kapalı bir alanı tarif eder. Biri antenin içine evin dışına, diğeri evin geri kalanına yol açar. Burada anahtar, bir antre istiyorsanız, bir alanı içine almalı ve o alana iki giriş sağlamalısınız.

Programlamada tasarım desenleriyle ilgili tipik problemler aşırı kullanım ve herhangi bir sorunu çözmek için gümüş mermi oldukları inancıdır. Onlar değil. Bunlar yararlı programlama fikirleri hakkında iletişim kurmanın ve düşünmenin yoludur. Belirli bir dilin sözdiziminin bitleri tuğla ve harç ise, kalıplar onları belirli ihtiyaçları karşılayacak şekilde düzenlemenin kullanışlı yollarını açıklar.


+1 harika bir açıklama, özellikle sistemi tasarlarken en iyi şekilde kullanıldıklarını not ederek. Ne yazık ki, bu kalıpların nerede ve nasıl kullanılacağına ilişkin bilgiler çoğunlukla, yalnızca uygulama sırasında tespit edildikleri önceki sistemleri yeniden düzenleme deneyiminden gelir. Bu yüzden benim sürüm küçük bir uzantısıdır: önce düşün, sonra kod yaz. Ardından sonucu analiz edin, gerekirse yeniden düzenleyin ve mümkün olduğunda yeniden düzenleyin. Bir dahaki sefere daha fazla desen kodlamadan önce açık olacak :-)
Lorand Kedves

7

Tasarım patentlerini, kesinlikle uyulması gereken değiştirilemez bir sözleşmeden daha fazla " tavsiye " olarak değerlendiriyorum. Niye ya? Tam olarak bahsettiğin nedenden dolayı. Her şeydeki bir tasarım desenini takip etmek, ilk önce bir desen kullanma amacını yitiren büyük bir kod karmaşasına yol açar.

Bu yüzden Java Practices gibi sitelerden nefret ediyorum . Bazı fikirlerin iyi olduğundan emin olun, ancak yazar bahsettiği her tasarım desenini izleyerek bütün bir program yazmaya (artı bir çerçeve) karar verdi. Yazar ayrıca, her makaleyi okuyucunun java uygulamalarının korkunç olduğunu ve veba gibi sakınılması gerektiğini düşünmesini sağlayacak şekilde çok korkutucu alıntılarla yazdı.

TL; DR: Tasarım patterleri kullanın. Sadece onları kötüye kullanma


Genelde tasarım kalıpları konusunda şüpheci ve alaycı biri oldum. Ben doğrudan fırsat oldu sanmıyorum istiyorum benim mesleki çalışmalarında bunları kullanmak. Muhtemelen bunun nedeni Java veya "hardcore" OO C ++ kullanmamamdır. İlginçtir. Richard Gabriel, tasarım desenlerinin yaratıcısının (bina mimarisinde Alexander) binalara tasarım desenlerini uygulamada bazı ciddi başarısızlıklar yaşadığını ve aslında Alexander'ın tasarım desenleriyle aradığı binaların kalitesini elde edemediğini belirtti.
Paul Nathan

2

Ayrıca SO'da bu konuyu gör. Başka bir POV tasarım desenlerinden, kullanılan metodolojinin eksikliklerini telafi etmek için boyler kodudur. Bu geçici çözümleri çok fazla kutlamanın hayranı değilim.


Ve bu kalıpları daha az gerekli kılan dilleri kullanmak yerine (Common Lisp ve Smalltalk akla sıçramaktadır), insanlar söz konusu kazan plakasını gerektiren dilleri kullanmaya devam etmektedir.
Frank Shearar

Benim düşüncelerim tam.
missingfaktor

1
Tasarım desenleri asla kazan levhası olarak düşünülmemelidir. Kazan plakası "çok az değişikliğe sahip veya hiç değişiklik göstermeyen birçok yere dahil edilmesi gereken kod bölümleri" olarak tanımlanmaktadır. Öte yandan, tasarım desenleri sadece kod parçaları değildir . Bazı tasarım problemlerini çözmek için kodun nasıl yapılandırılacağına dair geniş ilkelerdir. Özel bir uygulamaları yoktur. Tasarım desenlerinin uygulanması her zaman bir projenin gereksinimlerine göre değiştirilmelidir.
Kramii Reinstate Monica,

@Kramii: Örneğin, zorunlu programlama dillerinde bir "İşlev Nesnesi" / "Functor", işlevlerin birinci sınıf olduğu işlevsel dillerle karşılaştırıldığında boyler kodudur. Orada hiçbir şey kodlamanız gerekmez, bu dilde desteklenir. Bunun aksine, Haskell'de "IO Monad" adlı bir "Tasarım deseni" kullanmak zorundasınız, zorunlu dillerde ücretsiz olarak alabileceğiniz sıralı, zorunlu G / Ç'leri elde etmek için. Bağlandığım konuyu izlemenizi tavsiye ederim.
LennyProgrammers

1
@ Lenny222: Bağlantıyı okudum ve kalıpların bir dilin eksikliklerinin üstesinden geldiği noktasında anladım. Ancak, "kazan plakası" terimini kullanımınıza katılmıyorum. Kazan plakası tipik olarak aynı kodun tekrar tekrar uygulanmasını ifade eder - genellikle kopyala yapıştır koduna veya en azından şablonlanmış kod parçalarına eşdeğerdir. OTOH, tasarım desenlerinin uygulanması, gereksinimlere göre farklı şekillerde uygulanmalıdır.
Kramii Reinstate Monica

0

Ortadakileri tercih edeceğim. Posterin doğru bir şekilde işaret ettiği gibi, desenlerin anlaşılması sizi iyi bir geliştirici yapmaz. Öte yandan, bir kalıp anlayışı iyi bir geliştirici olmanıza yardımcı olacaktır.

Modellerin ilişkisini anlamak ve bir projede bir model görmek (tasarım aşamasındayken) sizi iyi bir geliştirici yapan şeydir.


0

Genellikle, tasarım desenlerinin programlama problemleri için hazır bir çözüm sağladığı söylenir. Ne tür problemler? "Nesne davranışını nasıl değiştirebilirim, ancak değişiklikleri sistemin geri kalanından nasıl ayırabilirim?"

GoF kalıpları, sistemin geri kalanından bu yalıtımı (kapsülleme) sağlamak için tanınır, ancak tasarım kalıplarının kullanımıyla sistemin hangi kısmına değişkenlik verildiğini bilmek zordur. Önerdikleri sınıflandırma şemasını uygulamak yerine (yaratıcı, davranışsal ve yapısal), kalıpların farklılıklarını belirledim ve kalıplarını sınıflandırmak için diğer iki şema ortaya koydum: yaşam döngüsü ve bileşen kapsülleme hiyerarşisi.

tasarım deseni kapsülleme hiyerarşisi

Kapsülleme hiyerarşisi için bu tablodan görebileceğiniz gibi, bir tasarım bileşeninin her seviyesine tasarım desenleri uygulanabilir. Ama mantıklı olur mu? Bileşenin önerilen enkapsülasyon seviyesinde davranışsal bir değişiklik sağlaması gerekecek mi ve bu seviye için uygun desen kullanıldı mı? Bu sorular doğru şekilde cevaplanmadıysa, tasarım desenleri büyük olasılıkla yanlış uygulanmıştır. Sadece bir arabanın kabinin içine düşey bir mil yerleştirilebilmesi, onu akıllıca bir fikir yapmaz.


0

Paraya benzetmeyi kullanan bir tasarım deseni, yüksek sermaye maliyeti olan ancak düşük işletme maliyetleri olan bir çözüm olarak düşünülmelidir. Tasarım desenleri, ekstra kodlama, detaylandırma ve oluşturdukları ekstra dolaylılıktan elde edilen kavramsal ağırlık bakımından bir servete mal oluyor. Ayrıca, tasarımınızın diğer yönlerini kilitleme eğilimi de vardır. Örneğin, şablon yöntemi kullanmak sizi yoğun bir OO tarzında programlamaya zorlar.

Bununla birlikte, bazı küçük şekillerde değişkenlik gösteren, yakından ilgili bazı sorunları çözmeniz gerekiyorsa veya kesinlikle gelecekte belirli bir şekilde yoğun bir şekilde bir kod parçasını değiştirmeniz gerekecekse, tasarım maliyeti buna değer olabilir çünkü tasarım desenler kodunuza esneklik katar. Yakından ilgili problemlerinizin ikincisine yapılan değişiklikler veya çözüm, kalıplarla, olmamaktan çok daha kolay olacaktır.


0

Her iki kamp da doğru - doğru kullanıldığında iyilik için güç, her yere sıçramışlarsa kötü için güç.


0

Tasarım desenleri sizi çizme yeteneğine sahip olabilir, ancak aynı genel olarak kodlama için de geçerlidir. Son araç kutusunu yazarak baştan çıkarmak çok kolaydır - YAGNI'yi dersten çıkarmanızı durdurmak, uygulamanın ne kadar yapıya ihtiyacı olduğunu hissetmek için aklınızda tutmalısınız. IMO, bu sadece bireye bağlıdır ve deneyimlerinin / değerlendirmelerinin bir işaretidir.


0

Sürekli olarak kodunuza uygulamaya çalıştığınız bir şey değil tasarım verilerini düşünüyorum. Benim için esas olarak geliştiriciler için ortak bir dil. Her şeyi tekrar tekrar açıklamaktan "Oluşturucu bir kalıp izleriz" demek daha kolaydır.

Şu anda Kurumsal Uygulama Mimarisi Modellerini şu anda yeniden okuyorum , çünkü bu kitaptaki kalıplardan birini izleyen birçok kodun üzerine yapıyorum. Modellerden birini takip etmek için kasıtlı olarak seçildiğini sanmıyorum, ancak “ bunun bir işlem betiğiolduğunu söyleyebiliyorsanız ve herkesin bunun ne anlama geldiğini net bir şekilde anlayabildiğine kesinlikle yardımcı olabilir .

Ancak, yeni bir işlevsellik veya yepyeni bir uygulama tasarlarken, hazırlanmış bir kalıp kataloğundan seçim yapabileceğiniz fikrini seviyorum. Belirli sorunların kanıtlanmış çözümleri varsa neden her şeyi yeniden icat ettin?

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.