1.1 Kalıplara giriş

Daha önce bahsedildiği gibi, bir programcı bir program üzerinde çalışmaya onun modelini tasarlayarak başlar: programın üzerinde çalışacağı varlıkların bir listesini derleyerek. Ve programda ne kadar çok varlık varsa, program o kadar karmaşıktır.

Bu nedenle programın karmaşıklığını azaltmak için nesnelerin etkileşimlerini standartlaştırmaya çalışırlar. Tasarım kalıplarının veya tasarım kalıplarının programcıya çok yardımcı olduğu yer burasıdır . İngiliz tasarım deseninden .

Önemli! Rusça'da tasarım kelimesi genellikle grafik tasarım anlamına gelir, İngilizce'de ise durum böyle değildir. İngilizce tasarım kelimesi anlam olarak “design” ve/veya “device” kelimesine daha yakındır. Örneğin bir motorun tasarımı görünüşü değil, iç yapısıdır.

Bu nedenle, bir tasarım deseni tam olarak bir tasarım deseni/desenidir. Tasarım kelimesini “görünüş” anlamında kullanmayı tamamen bırakmanızı tavsiye ederim. Siz geleceğin Yazılım Mühendisisiniz ve sizin için tasarım tam olarak tasarımdır.

Peki nedir bu tasarım deseni? Her şeyden önce, bir tasarım deseni standart bir problemin standart çözümüdür . İyi, etkili ve zamana göre test edilmiş bir çözüm.

Diyelim ki sizden bir bisiklet tasarlamanız istendi, onu iki tekerlekli, üç hatta beş tekerlekli yapabilirsiniz. Bu arada, tasarımın şafağında öyleydi. Ancak zamana göre test edilmiş yaklaşım iki tekerlektir. Ancak mevcut bariz yaklaşım acı ve hatalardan geçti:

Tipik olarak, bir şablon doğrudan koda dönüştürülebilen eksiksiz bir çözüm değildir, yalnızca çeşitli durumlarda kullanılabilecek bir soruna iyi bir çözüm örneğidir.

Nesne yönelimli kalıplar , hangi nihai sınıfların veya uygulama nesnelerinin kullanılacağını belirtmeden, sınıflar veya nesneler arasındaki ilişkileri ve etkileşimleri gösterir .

1.2 Tasarım modellerinin tarihi

70'lerde programcılar, tüm geliştirme ekipleri tarafından üzerinde çalışılması gereken büyük programlar geliştirme ihtiyacıyla karşı karşıya kaldılar. İşi organize etmek için çeşitli yöntemler denendi, ancak gelişmeyi en çok inşaat sektörü etkiledi.

Büyük bir insan grubunun çalışmalarını organize etmek için inşaat endüstrisinden uygulamalar ve yaklaşımlar kullanıldı. Bu arada, montaj (inşa), Yazılım Geliştirici (kurucu) ve mimarlık kavramı gibi terimler programlamaya oradan geldi.

Ve tahmin edebileceğiniz gibi, tasarım deseni fikri de inşaat endüstrisinden alınmıştır. Model kavramı ilk olarak Christopher Alexander tarafından The Pattern Language'de tanımlanmıştır. şehirler Bina. Yapı". Bu kitapta kent tasarım süreçlerini anlatmak için özel bir dil olan örüntüler kullanılmıştır.

İnşaattaki kalıplar, zamana göre test edilmiş tipik kararları tanımlıyordu: pencerelerin yüksekliği ne kadar olmalı, binada kaç kat olmalı, mikro bölgede ağaçlar ve çimler için ne kadar alan tahsis edilmelidir.

Bu nedenle, 1994 yılında “Nesne Yönelimli Tasarım Teknikleri” kitabının çıkması şaşırtıcı değildir. Nesne yönelimli tasarımın çeşitli problemlerini çözen 23 kalıp içeren Tasarım Kalıpları”.

Kitap 4 yazar tarafından yazılmıştır: Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides. Kitabın adı kimsenin hatırlaması için çok uzundu. Bu nedenle, kısa süre sonra herkes ona "dörtlü çetenin kitabı", yani "dörtlü çetenin kitabı" ve hatta "GoF kitabı" demeye başladı.

Ve o zamandan beri başka tasarım kalıpları keşfedildi. "Patern" yaklaşımı, programlamanın tüm alanlarında popüler hale geldi, bu nedenle artık nesne tasarımı dışında her türden modeli bulabilirsiniz.

Önemli! Desenler, bazı süper orijinal çözümler değil, aksine, aynı soruna sıkça rastlanan tipik çözümlerdir. Kanıtlanmış iyi çözümler.

1.3 Model listesi

Birçok programcı tüm yaşamları boyunca tek bir kalıp öğrenmemiştir, ancak bu onları kullanmaktan alıkoymaz. Daha önce söylediğimiz gibi, kalıplar zaman içinde test edilmiş iyi çözümlerdir ve programcı aptal değilse, o zaman deneyimle bu tür çözümleri kendisi bulur.

Ama neden onlarca deneme yanılma yoluyla en uygun çözümlere ulaşılıyor, zaten bu yoldan gitmiş ve deneyimlerinin ve yaşam bilgeliğinin özüyle kitaplar yazmış insanlar varken?

İngiliz anahtarıyla çivi çakabilirsiniz, ama neden? Çok denerseniz bir matkap bile kullanabilirsiniz. Ancak enstrümana iyi bir şekilde bilinçli sahip olmak, tam olarak bir profesyoneli amatörden ayıran şeydir. Ve profesyonel, tatbikatın ana özelliğinin bunda olmadığını bilir. Öyleyse neden kalıpları bilmeniz gerekiyor?

  • Kanıtlanmış çözümler. Tekerleği yeniden icat etmek yerine kullanıma hazır çözümleri kullanarak daha az zaman harcarsınız. Bazı kararları kendiniz düşünebilirsiniz, ancak birçoğu sizin için bir keşif olabilir.
  • Kod standardizasyonu. Tasarım yaparken, tipik birleşik çözümler kullanarak daha az yanlış hesaplama yaparsınız, çünkü içlerindeki tüm gizli sorunlar uzun süredir bulunur.
  • Genel programlama sözlüğü. Diğer programcılara ne kadar harika bir tasarım bulduğunuzu ve bunun için hangi derslerin gerekli olduğunu açıklamak için bir saat harcamak yerine kalıbın adını söylüyorsunuz.

Desenler nelerdir?

Modeller, tasarlanan sistemin karmaşıklık, ayrıntı ve kapsam düzeyine göre farklılık gösterir. İnşaat ile bir benzetme yaparak, trafik ışığı koyarak bir kavşağın güvenliğini artırabilir veya kavşağı alt geçitlerle bütün bir arabalı kavşakla değiştirebilirsiniz.

En alt düzey ve basit kalıplar deyimlerdir. Yalnızca bir programlama dili çerçevesinde uygulanabilir olduklarından evrensel değildirler.

En çok yönlü olanı, hemen hemen her dilde uygulanabilen mimari kalıplardır. Tek tek öğelerini değil, tüm programı tasarlamaları gerekir.

Ancak asıl önemli olan, kalıpların amaç açısından farklı olmasıdır. Tanışacağımız kalıplar üç ana gruba ayrılabilir:

  • Oluşturma kalıpları, programa gereksiz bağımlılıklar getirmeden nesnelerin esnek bir şekilde oluşturulmasını sağlar.
  • Yapısal modeller, nesneler arasında ilişki kurmanın farklı yollarını gösterir.
  • Davranış kalıpları, nesneler arasındaki verimli iletişimi sağlar.

1.4 UML'ye Giriş

Gang of Four kitabında açıklanan aynı 23 kalıba bakarak başlayalım. Hem kalıpların kendisi hem de isimleri, acemi bir programcı için bile tanıdık şeylerdir. Sizi onlarla tanıştıracağım, ancak kalıplarla ilgili o kitabı okumanızı şiddetle tavsiye ederim.

Tasarım kalıpları belirli bir programlama diline bağlı değildir, bu nedenle onları tanımlamak için genellikle UML kullanılır. 20 yıl önce çok popülerdi ama şimdi bile bazen kullanılıyor. Ve bu arada, modellerin açıklaması, UML kullanımının standart olduğu yerdir.

UML ile farklı varlıklar arasındaki ilişkileri tanımlayabilirsiniz. Bizim durumumuzda bunlar nesneler ve sınıflardır.

Sınıflar arasındaki ilişkiler dört tür okla tanımlanır:

kompozisyon (kompozisyon) - "parçaların" "bütün" den ayrı olarak var olamayacağı bir toplama alt türü.
toplama - "parça"nın "bütün"den ayrı olarak var olabileceği "parça" - "bütün" ilişkisini tanımlar. Eşkenar dörtgen "bütün" taraftan belirtilir.
bağımlılık - bir varlıktaki (bağımsız) bir değişiklik, başka bir varlığın (bağımlı) durumunu veya davranışını etkileyebilir. Okun yanında bağımsız bir varlık gösterilir.
genelleme - kalıtım ilişkisi veya bir arayüzün uygulanması. Okun yanında üst sınıf veya arabirim bulunur.

Aslında burada her şey çok basit. Son ok aslında bir sınıfın başka bir sınıftan miras alındığı anlamına gelir. Ve birinci ve ikinci oklar, bir nesnenin ikinci nesneye bir bağlantı depolamasıdır. Ve hepsi bu.

Bağlantı elması siyahsa, bağlantı zayıftır: nesneler birbirleri olmadan da var olabilirler. Elmas beyazsa, sınıf HttpRequestve onun alt sınıfı gibi nesneler güçlü bir şekilde ilişkilidir HttpRequest.Builder.

1.5 Model listesi

Desen türleri farklı renk ve harflerle gösterilecektir:

B- davranışsal (davranışsal);

C- üreten (yaratıcı);

S- yapısal (yapısal).

Ve son olarak, 23 tasarım modelinin bir listesi:

C- Soyut Fabrika

S- Adaptör

S- Köprü

C- Oluşturucu

B- Sorumluluk Zinciri

B- Takım

S- Bağlayıcı

S- Dekoratör

S– Cephe

C- fabrika yöntemi

S- fırsatçı

B- Tercüman

B- Yineleyici

B- aracı

B- Kaleci

C- Prototip

S- vekil

B— gözlemci

C— Yalnız

B- Durum

B— Strateji

B— Şablon yöntemi

B— ziyaretçi