Yazılım Tasarım Desenlerini kullanmayacaksam ne olur? [kapalı]


17

Yazılım Tasarım Desenlerini kullanmayacaksam ne gibi sorunlarla karşılaşabilirim? Bana tasarıma standart nesne yönelimli teknikler kullanarak yaklaşmanın sorunlarını anlatır mısınız?


24
Oldukça az sayıda Yazılım Tasarım Deseni oldukça açıktır. Onları kullanmadığınızdan emin olmak için hepsini çok iyi bilmelisiniz - muhtemelen onları da kullanabileceğiniz kadar iyi!
James McLeod

18
@ JamesMcLeod için bir yan nokta olarak, birçok "Tasarım Deseni" çok açıktır ve herkesin zaten yapacağı şeyler. O zaman neden onlara isimler veriyoruz? İletişim amacıyla. "X modelini kullanıyorum", çözümünüzü diğer sonun "Oh evet! Bunu ben de yaptım, değişkenlerimi aradım ..." diye umutla açıklamaktan çok daha fazla anlamsal yoğunluğa sahip.
Phoshi

7
@AJMansfield Gördüğüm en kötü kodlardan bazıları tasarım desenleri için aşırı isteklilik içeriyordu.
Erik Reppen

5
Tasarım desenlerinin aşırı kullanımı için suçu tekrarlayın, bunu yapan kişiye atfedilmelidir. Benim bakış açımdan, temel sorun tasarım kalıplarının kendisinde değil, aşırı genelleme (kısmen mimari gözetim eksikliğinden dolayı) ve aşırı mühendislik (bazen mühendis komiteleri tarafından).
rwong

5
"Tasarım Desenleri" bir teknik değil, bir sözlüktür.
Kaz Dragon

Yanıtlar:


76

Konuyu kaçırıyorsun.

Tasarım Kalıpları, tıpkı dünyada yapısal kalıplar gibi, yazılım tasarımı yaparken de doğal olarak mevcuttur. Bir şeylerin adını bilmeseniz bile, sonunda belirli fiziksel yapıların belirli sorunlara uygun olduğunu göreceksiniz. Ahşap / metal çubukların / vb. Üçgen şeklinin çok kararlı bir yapı olduğunu ancak sadece bir uçakta olduğunu göreceksiniz. Kare tuğlaların yuvarlak olanlara göre bazı avantajları olduğunu göreceksiniz ...

Benzer şekilde, bazı yazılım yapıları bir şekilde benzersiz veya optimaldir. Sonunda onları bulacak ve isimlerini biliyor olursanız olun onları kullanacaksınız . Tasarım modellerinin özü budur - deneyimli programcıların zaten bildikleri ve kullandıkları bu yapıların adlarıdır . Programcılara çok daha düzgün ve özlü iletişim kurma yeteneği verir. Ayrıca programcıların kalıp kavramını daha bilinçli düşünmelerini sağlar.

Bu yüzden iki önemli noktaya değinmeye çalışıyorum:

  1. Sen olamaz değil tasarım desenleri kullanın.
  2. Kullandığınız şeylerin adlarını bilmeyerek, bir ekipte çalışmakta zorlanacaksınız.

12
+1: Kesinlikle doğru. Tasarım desenleri bilinmeden veya popüler olmadan önce OO geliştirmeye başladım. Evet biz de bir şeyler icat gibi sen Strateji deseni gibi görünüyor parlak ışık sıralamada gözlerini kısarak baktı, fabrikalar, tekiz ve bir şey. Nokta şimdi ben fabrikalar Tamam ama, Singletons kötü yapıldı daha iyi yapılabilirdi ve ne anlarım tasarım desenleri biliyor olmasıdır olabilir bir Strateji desen çok daha iyi aslında eğer olurdu olmuştur olmuştu bir Strateji deseni.
İkili Worrier

3
... Tasarım desenlerini öğrenmek ve bunları doğru şekilde nasıl kullanacağınızı öğrenmek size çok zaman kazandırır, tekerleği yeniden icat etme olasılığınız daha düşüktür, kendinizi kötü tasarıma ve kötü çözümlere doğru bir yolda ilerletmenize engel olur. Emmek ve desenleri öğrenmek, sizin için çalıştıklarında onları kullanmak ve işe yaramazsa onları kullanmayın.
İkili Worrier

1
Ve bu, örüntüler hakkındaki görüşlerimi özetliyor. Yaptıklarınızı diğer insanlarla paylaşmak için harika araçlardır. Bunları asla tam olarak inşa edemezsiniz çünkü her sorun farklıdır. Ama bunlar bir öz, bir yön ve takip edilecek kaba bir kurallar dizisidir ve başkalarına ne halt yaptığınızı açıklamayı kolaylaştırır.
Matt D

Fiziksel yapılarla karşılaştırma için +1. Zaten bir “kafes” in çatının yükünü desteklemek için iyi bir yapı olduğunu biliyorsanız, bir evin inşa edilmesine yardımcı olacağını, deneyip çökmemesi umuduyla değil.
kdgregory

39

Geçmişi hatırlayamayanlar, onu tekrarlamaya mahkumdur.

Tasarımınızın ortaya çıkardığı sorunlar dışında herhangi bir sorunla karşılaşmayacaksınız. Ve zamanla desenleri farkında olmadan kullanmaya başlayacaksınız, sadece kendiniz anlamaya zaman harcadınız. Kalıpları önceden bilmek, tasarımda fark edilmelerini kolaylaştırır ve birkaç kişi tarafından kanıtlandıkları büyük avantajı taşır.

Bugün geliştirilmekte olan her şey büyük ölçüde önceki bilgilere dayanmaktadır, onu görmezden gelmenin hiçbir anlamı yoktur. Yüzlerce yıl önce katedral inşa eden insanların karşılaştığı sorunları bilmeden bugün bir gökdelen inşa ettiğinizi düşünün.


10
"Her alıntı eşit ve zıt bir alıntıya sahiptir." "Eğer gerçekten geleceği hak edecek olursak, geçmişi gözyaşı dökmeliyiz." (Tamam biri Hitler olduğunu görmezden gelmek en iyisi ....)
Russell

20

Yazılım Tasarım Desenlerini kullanmayacaksam ne gibi sorunlarla karşılaşabilirim?

Herhangi bir yazılım yazamamanız gerekir.

Değişkenler bir tasarım modelidir.

Yöntemler bir tasarım modelidir.

Operatörler - toplama, çıkarma, vb. - bir tasarım modelidir.

İfadeler bir tasarım modelidir.

Değerler bir tasarım modelidir.

Referanslar bir tasarım modelidir.

İfadeler bir tasarım modelidir.

Sınıflar bir tasarım modelidir.

...

Programlamada her zaman yaptığınız her şey bir tasarım modelidir . Çoğunlukla örüntü sizin düşüncelerinizle o kadar iç içe ki, onu bir tasarım örüntüsü olarak düşünmeyi bıraktınız. "Tekton paterni" gibi öğrenmeniz gereken şeyler, kullandığınız herhangi bir dile henüz (henüz) pişmemiş olan kalıplardır.

Bana tasarıma standart nesne yönelimli teknikler kullanarak yaklaşmanın sorunlarını anlatır mısınız?

Hayır. Bu sorunun ne anlama geldiğini bilmiyorum. Tasarım desenleri olan onları kılan da - "standart nesne yönelimli teknikler" desen tasarım . Bir tasarım modeli, özellikle ( zorunlu olmasa da ) belirli bir problemi, özellikle nesne yönelimli bir dilde çözmek için standart bir tekniktir .


1
The things that you have to learn like "the singleton pattern" and so on are simply patterns that haven't (yet) been baked into whatever language you're using.- Bu (neredeyse) bir tasarım modelinin tanımıdır - dilin kendisinde bir sınırlamanın üstesinden gelmek için kullanılan, başkalarıyla iletişim kurmak kolay olan esnek / kolay yeniden kullanılabilir bir kod yapısı. Dilin bir parçası olduğunda, artık bir tasarım deseni değildir.
Izkata

1
@Izkata: Yani pozisyonunuz, diyelim ki C # 'da gözlemci düzeni imkansız, çünkü C # gözlemci kalıbı olaya olaylar şeklinde dile yerleştirilmiş mi? Bu aptalca. Bir kalıpla ilgili dile özgü bit, kalıbı dilde uygulamanın kanonik yoludur. Elbette tasarım kalıpları onları doğrudan destekleyen dillerde kullanılabilir; onları doğrudan desteklemenin bütün mesele bu!
Eric Lippert

Ben asla ben ima etmeye çalışıyordu, imkansızdır diye gereksiz . Örneğin Java'nın olayları yoktur, bu nedenle onları simüle etmek için tasarım desenini kullanır.
Izkata

@Izkata: O zaman kafam karıştı. Bir desen bir kez dilin parçası olduğunda, artık bir desen olmadığını söylediniz. Peki "gözlemci desen" Java bir desen ama C # bir desen değil mi?
Eric Lippert

1
Ya da başka bir deyişle, tasarım deseni, bir programcının İngilizce'de tarif edilenden daha fazla yaptığı bir şeydir. Tanıma tamamen katıldığımdan emin değilim, ancak söylediklerinizi doğru bir şekilde yansıtıyor ve en azından desen olarak sayılan hiçbir öznel yargılamanın yararına sahip olmadığını düşünüyorum. Bu, programcıların ne yaptığını analiz etmenin bir özelliğidir ve elbette bir programcının analiz edilemeyecek bir şekilde hareket etmesi mümkün değildir :-)
Steve Jessop

4

Bir tasarım deseninin noktasını anlamak, onu harf için kullanmaktan daha önemlidir. Bazı kalıplar, IMO, aptalca, en azından alışkın olduğum dil paradigmalarında. Tasarım kalıplarını körü körüne ve gerçekten anlamadan kullanan bir programcı olan IMO, şeyleri kendileri düşünmek isteyenlerden daha kötü bir programcıdır. Ancak fikirleri tanıyan ve daha sonra değerli olup olmadıklarına karar verebilecek biri muhtemelen ikisinden de daha güçlü bir programcı olacaktır.

Bununla birlikte, sinek ağırlığının ne olduğu hakkında hiçbir fikrim yok ve itiraf etmekten utanmıyorum. (çok yardımcı olan başka bir wikipedia girişi için yorumlara bakın)

Vikipedi'nin tasarım kalıplarına girişini öneriyorum. Çok özlü ve net bir şekilde yazılmıştır. Bir kişinin belirli bir tasarım deseni ile neden rahatsız olup olmayacağı hakkında bir fikir edinmek için çok yararlıdır. Şahsen en basit olanları en kullanışlı olanı bulma eğilimindeyim ve herhangi bir modelin belirli bir uygulamasını ihtiyaçlarıma göre değiştirmeyi iki kez düşünmüyorum.

Bunlar fikir, plan değil. Bazı dillerde hiç de iyi bir fikir değiller. Diğerlerinde, haklı olarak, bir dilin daha az karmaşıklık yoluyla daha iyi telafi edilebilecek tasarım zayıflıklarının üstesinden gelmek için bir ipucu olarak görülüyorlar. Ne olursa olsun, kendi tercih ettiğiniz çözümlere karar vermeden önce bunları incelemek ve üstesinden gelmeleri gereken zorlukları anlamaya çalışmak zarar vermez.

Ne tür sorunlarla karşılaşacaksınız? Zaten hepsini anlayan bir programlama dehası değilseniz fırsatları kaçırıp, problemlere ihtiyaç duyduğunuzdan daha fazla zaman harcayabilirsiniz. Popüler programlama fikirlerine eleştirel göz kulak olmak önemlidir, ancak insanların çözdüklerini düşündüklerinin ne olduğunu anlamak asla acıtmaz, çünkü bu sizin tercih ettiğiniz çözümlere / yaklaşımlarınıza daha fazla açıklık kazandıracaktır.


2
volan (volan değil). Vikipedi makalesinin ilk paragrafını (ve yalnızca ilk paragrafını) okuyun ve ardından Integer.valueOf (int) 'e bakın ve bunun kaç kez ortak değerler için yeni tamsayılar oluşturmayı önlediğini düşünün.

2
@MichaelT Ve lanet olsun. Bu, gördüğüm her şeyden çok daha iyi bir cehennemi ortaya çıkardı. Teşekkürler.
Erik Reppen

Tasarım deseni yönergelerinin çoğunda gördüğüm sorun, büyük bir proje görünümü vermeye çalışıyor olmalarıdır (GoF kitabı, küçük bir görev değil, bir kelime işlemci yazmakla ilgilidir). Ancak bazen çok daha küçük (neredeyse 'önemsiz') şeylere uygulanabilirler. 7 satır kod, herkesin sürekli olarak kullandığı bir şeyde sinek ağırlığını temiz bir şekilde tanımlayabilir. Anlamak büyük projelerden veya örneklerden çok daha kolay.

1
@MichaelT Benim için, bir şey hakkında biraz netlik kazanmanın, bu fikrin, prototip palet mirasının ve kapanmalarının genellikle bunu çözmek için kullanıldığı birincil dilim olan JavaScript'te hemen kullanılmamasına rağmen genel olarak kod yazmanın yararlı olduğuna iyi bir örnek. sorun. Bu a-ha anına sahip olmak bana hala alakalı bazı fikirler verdi.
Erik Reppen

2

Karşılaşacağınız temel sorun , tekerleği yeniden keşfedeceğinizdir . Bunlara kalıp denir, çünkü sıklıkla ve tahmin edilebilir bir şekilde ortaya çıkarlar.


0

Tasarım desenlerini takip etseniz bile kötü bir tasarıma sahip olabilirsiniz. Tasarım desenleri doğaldır ve tasarımınızda bir miktar lezzet kullanırsınız. Herhangi bir paterni kullanmamak için çok uğraşmanız gerekecek. Tasarım kalıplarını kınamak için bir neden yok, daha önemli olan ihtiyaçlarınız için doğru kalıpları seçmek


-1

Tasarım kalıplarını fark etmeden her zaman kullanıyorsunuz. Popüler dillerdeki birçok standart kütüphane tasarım desenleri göz önünde bulundurularak tasarlanmıştır. Java örneğiFileReaderDekoratör tasarım deseni kullanılarak tasarlanan kütüphanesi buna . Şimdi kendi kodunuz hakkında konuşursanız, tasarım desenlerini kullanmak zorunda değilsiniz (çoğu durumda). Bir tasarım deseni, "sık karşılaşılan bir soruna yeniden kullanılabilir bir çözümdür" , yani daha temiz daha sürdürülebilir bir kod yazmanıza yardımcı olacaktır, bu nedenle spagetti koduyla bitirmekten ne kadar kaçınmak istediğiniz size bağlıdı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.