Doğru Tasarım Desenini Seçme


32

Tasarım kalıplarını kullanmanın önemini her zaman tanıdım. Diğer geliştiricilerin en uygun olanı seçmeye nasıl gittiğini merak ediyorum. Karar vermenize yardımcı olacak bir dizi özellik (akış şeması gibi) kullanıyor musunuz?

Örneğin:

Nesneler birbiriyle ilişkiliyse, ancak somut sınıf belirtmek istemiyoruz, Özet

Örnekleme türetilmiş sınıflara bırakıldığında, Fabrika’yı düşünün

Toplama nesnesinin öğelerine sırayla erişmeniz gerekiyor, yineleyiciyi deneyin.

Veya benzeri?



En önemlisi, en uygun ve bütüncül örüntüyü tanıma, nihayetinde bunu diğer geliştiricilere iletme becerisi olduğunu düşünüyorum. Mantıklı geliyorsa?
Carl Sagan

Ben pdr ile katılıyorum. Yapmam gerekeni düşünüyorum ve kalıbın adını hatırlamak bana Sınıf adını vermeme yardımcı oluyor, böylece diğerleri de ne yaptığını biliyor.
Amy Blankenship

4
Aslında. Bu basitçe "Doğru tasarımı nasıl seçersiniz?" Haline getirilebilir. İlk olarak, doğru tasarım yok , sadece yanlış olanları var. Bunun ötesinde, yığın deneyimi ile gelir (yanlış olanları seçmek).
Telastyn

Yanıtlar:


109

Günümüzün kodlama dünyasında kilit bir yanılgı, kalıpların yapı taşları olduğudur. Bir almak AbstractFactoryburada ve bir Flyweightbelki var ve Singletonoraya ve XML ve presto birbirine bağlayın, çalışan bir uygulama var.

Onlar değil.

Hmm, bu yeterince büyük değildi.

Desenler yapı taşları değildir

Bu daha iyi.

Bir şablon, bir sorunun olduğunu tespit ettiğinizde kullandığınız bir şeydir - şablonun sağladığı ya da config dosyasında küçük bir dil oluştururken karşılaştığınız esnekliğe ihtiyacınız var ve "bekleyin Bir an, dur, bu yazdığım kendi tercümandır - bu bilinen ve çözülmüş bir problemdir, bir tercüman deseni kullanın . "

Ama orada not alın, kodunuzda keşfettiğiniz bir şey, başladığınız bir şey değil. Java yaratıcıları başlangıçta "Ah, Tamsayıya Bir Uç Ağırlık koyacağız" demediler, fakat daha çok bir uç ağırlık tarafından çözülebilecek bir performans sorunu fark ettiler .

Ve böylece, doğru modeli bulmak için kullandığınız "akış şeması" yoktur. Model, tekrar tekrar karşılaşılan belirli bir problem tipi için bir çözümdür ve anahtar kısımları bir Paternde damıtılır.

Desene başlamak, bir çözüme sahip olmak ve bir problem aramak gibi. Bu kötü bir şey: aşırı mühendislik ve tasarımda nihayetinde esneksizliğe yol açıyor.

Kod yazarken, bir Fabrika yazdığınızı fark ettiğinizde, "ah ha! Bu yazacağım bir fabrika" diyebilir ve bir sonraki parçayı hızlıca yazmak için Fabrika şablonunu bilme bilginizi kullanabilirsiniz. Fabrika modelini yeniden keşfetmeye çalışmadan kod verin. Ama "Burada bir sınıfım var, bunun için esnek olması için bir fabrika yazacağım" ile başlamıyorsunuz - çünkü olmayacak.

İşte Erich Gamma ( Gamma, Helm, Johnson ve Vissides ) ile yapılan röportajdan bir alıntı : Tasarım Desenlerinin Kullanımı :

Tüm kalıpları kullanmaya çalışmak kötü bir şey çünkü kimsenin ihtiyaç duymadığı esnekliğe sahip spekülatif tasarımlar gibi sentetik tasarımlara sahip olacaksınız. Bugünlerde yazılım çok karmaşık. Başka ne yapması gerektiğini speküle edemeyiz. Gereksinim duyduğu şeye odaklanmamız gerekiyor. Bu yüzden kalıplara yeniden bakmayı seviyorum. İnsanlar, belirli bir sorun ya da kod kokusu olduğunda, insanlar bugünlerde dedikleri gibi, bir çözüm bulmak için kalıp araçlarına gidebileceklerini öğrenmelidir.


"Ne kullanılacağı, ne zaman" için en iyi yardım muhtemelen yazılım tasarım deseni için Wikipedia sayfasıdır - "Sınıflandırma ve liste" bölümü, her bir kalıbın içinde bulunduğu kategoriyi ve ne yaptığını tanımlar. Akış çizelgesi yok; Buradaki açıklama muhtemelen "ne zaman kullanılacağı" için kısa bir kod parçası olarak bulabileceğiniz en iyisidir.

Programlamanın farklı alanlarında farklı desenler bulacağınızı unutmayın. Web tasarımı kendi kalıplarını oluştururken, JEE (web tasarımı değil) başka bir kalıp setine sahiptir. Finansal programlama kalıpları, bağımsız uygulama UI tasarımı için olanlardan tamamen farklıdır.

Her türlü girişimin bunları listelemek için Yani bütün doğal olarak tamamlanmamıştır. Birini bulursun, nasıl kullanılacağını bul ve sonunda sonunda ikinci doğa olur ve ne zaman ve ne zaman kullanılacağını düşünmene gerek kalmaz (birisi onu açıklamanı isteyene kadar).


11
+1 "bir sorun arayan çözüm" Kalıpları bilmek, çözdükleri bir problemi çözmeniz gerektiğinde ortaya çıktıklarında doğal keşfini atlamanıza izin verecektir. Bunları öğrenmek, muhtemelen diğer insanların kodlarını okumak veya başka bir programlama dilini öğrenmek gibi kodlama ve tasarım becerilerinizi geliştirmenize yardımcı olacaktır. Ancak, kesinlikle aktif olarak kodunuza "kalıpları yerleştirmeye" çalışmamalısınız.
gregmac

1
Geliştiricilere, öncelikle tasarım ilkelerine aşina olmak için kalıplara bakmaya başlamalarını öneririm. Her desen, tasarım ilkelerinin bazılarının bir gösterimidir ('SOLID' ilkeleri seti yalnızca bir örnektir).
ryscl

2
Belki bir dekoratör ve bir cepheye sahip bir cepheye sahip olursunuz ;-) Başka bir deyişle, tasarım kalıplarının amacı bize ne inşa ettiğimizi tartışırken bir isim, ortak bir dil vermektir. Zor kazanılmış geliştirme bilgisi yığını için kısaca.
EBarr

2
Buradaki satırlar arasında okuma, bir tasarım deseni seçmenin adımları: 1. Çalıştığınız herhangi bir kodu her zaman eleştirel olarak düşünün. 2. Belirli bir kodu temel bir soruna soyutlayın 3. Bu sorunun bilinen bir çözümü var mı (tasarım deseni) )? 4. Evet, bu çözümü özelliklerime nasıl uygularım? 5. Özel probleminize bir çözüm oluşturmak için jenerik çözümü soyut probleme uyarlayın.
Chris

@ Gerçekten bunu özetleyen Chris. Yazmayı ile yanlış bir şey de var olmadan desenleri ve daha sonra üstlenmeden tasarım ihtiyacı varsa uygun kalıbı içine kod.

18

Kendime soruyorum:

  1. Hangi sorunu çözmeye çalışıyorum?
  2. Hangi yazılım tasarım deseni (varsa) aynı sorunu en yakın bir şekilde çözer veya sorunumu çözme yolunda mantıklı bir yol sağlar?
  3. Desenin sağladığı ek soyutlamaya (ve karmaşıklığa) ihtiyacım var mı, yoksa kendi sorunum için aşırı mühendislik mi yapıyorsun? Problem, model olmadan daha basit ve daha verimli bir şekilde çözülebilir mi?

Bir yazılım modelini seçme süreci, bir veri yapısı seçme sürecine benzemez, ancak bir veri yapısı seçerken , probleminizin performansını ve hafıza özelliklerini değerlendirebilir ve bu özelliklere en çok uyan veri yapısını seçersiniz.


Tabii ki, bu bir plan veya akış şeması yerine deneyim ve uzmanlık hakkında bir şey ve ben size katılıyorum. Ancak, en azından fabrika gibi en önemli ve en sık kullanılan desenlerde olduğu gibi, kategorize edilmiş, gelişmiş bir kopya kağıdı gibi bazı kaynaklar kullanılmalıdır. hangi bir kalıp kullansan iyi edersin. İnternette böyle bir kaynak biliyor musunuz ?!
Pmpr

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.