Tasarım Kalıplarına Giriş
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 90 / 104.
Tasarım desenleri, yazılım tasarımında ortaya çıkan yaygın sorunlara yönelik kanıtlanmış, yeniden kullanılabilir çözümlerdir. Bunlar doğrudan kopyaladığınız kodlar değil; belirli zorlukları zarif bir şekilde çözmek için sınıfların ve nesnelerin nasıl yapılandırılacağını açıklayan şablonlar veya taslaklardır.
Bu kavram, 23 temel deseni kataloglayan 1994 tarihli kitaplarında "Gang of Four" (GoF) tarafından popüler hale getirilmiştir. Bu desenler genellikle üç kategoriye ayrılır:
| Kategori | Amaç | Örnekler |
|---|---|---|
| Oluşturucu (Creational) | Nesne oluşturma mekanizmaları | Singleton, Factory, Builder |
| Yapısal (Structural) | Sınıf ve nesne bileşimi | Adapter, Decorator, Composite |
| Davranışsal (Behavioral) | Nesne etkileşimi ve sorumluluğu | Observer, Strategy, Command |
Neden tasarım desenlerini öğrenmelisiniz? Geliştiriciler arasında ortak bir kelime dağarcığı sağlarlar - "burada bir Factory kullan" demek, karmaşık bir fikri anında iletir. Ayrıca çözümleri yeniden icat etmekten kaçınmanıza yardımcı olurlar ve kodunuzu daha esnek ve bakımı kolay hale getirirler.
C++'da tasarım desenleri, halihazırda öğrendiğiniz OOP özelliklerinden yararlanır: kalıtım, çok biçimlilik, soyut sınıflar ve şablonlar. Gelecek derslerde, birkaç temel deseni uygulayacak ve her birinin ne zaman iş için doğru araç olduğunu anlayacaksınız.
Görev
KolayÜç tasarım deseni kategorisi hakkındaki anlayışınızı gösteren basit bir desen sınıflandırıcı oluşturalım. Bir desen adını alan ve bu desenin hangi kategoriye (Creational, Structural veya Behavioral) ait olduğunu, o kategorinin amacının kısa bir açıklamasıyla birlikte belirleyen bir sistem oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
PatternCategory.h: Bir tasarım deseni kategorisini temsil edenPatternCategoryadında soyut bir temel sınıf tanımlayın. Şunlara sahip olmalıdır:- Kategori adını bir dize (string) olarak döndüren saf sanal bir
getName()metodu - Bu kategorideki desenlerin ne yaptığının açıklamasını döndüren saf sanal bir
getPurpose()metodu - Sanal bir yıkıcı (destructor)
Ardından
PatternCategorysınıfından türeyen üç sınıf oluşturun:CreationalCategory—"Creational"adını ve"Object creation mechanisms"amacını döndürürStructuralCategory—"Structural"adını ve"Class and object composition"amacını döndürürBehavioralCategory—"Behavioral"adını ve"Object interaction and responsibility"amacını döndürür
- Kategori adını bir dize (string) olarak döndüren saf sanal bir
PatternClassifier.h: Verilen bir desenin hangi kategoriye ait olduğunu tanımlayabilen birPatternClassifiersınıfı oluşturun.Sınıflandırıcınız, bir desen adını (string) alan ve uygun
PatternCategorynesnesine bir işaretçi döndüren birclassifymetoduna sahip olmalıdır. Bellek yönetimi için akıllı işaretçiler (std::unique_ptr) kullanın.Sınıflandırıcı şu desenleri tanımalıdır:
- Creational:
Singleton,Factory,Builder - Structural:
Adapter,Decorator,Composite - Behavioral:
Observer,Strategy,Command
Eğer desen adı tanınmıyorsa,
nullptrdöndürün.- Creational:
main.cpp: Tek bir girdi okuyun—bir tasarım deseninin adı.Bir
PatternClassifieroluşturun ve girdi desenini sınıflandırmak için kullanın. Eğer desen tanınırsa, şunu yazdırın:[PatternName] is a [CategoryName] pattern Purpose: [CategoryPurpose]Eğer desen tanınmazsa, şunu yazdırın:
Unknown pattern: [PatternName]
Örneğin, Singleton girdisi ile:
Singleton is a Creational pattern
Purpose: Object creation mechanismsObserver girdisi ile:
Observer is a Behavioral pattern
Purpose: Object interaction and responsibilityProxy girdisi ile:
Unknown pattern: ProxyBu zorluk, kalıtım, polimorfizm ve akıllı işaretçiler gibi daha önce ustalaştığınız kavramları uygularken tasarım desenlerinin üç kategorisini pekiştirir. Çok dosyalı yapı, gerçek projelerin ilgili sınıfları nasıl organize ettiğini yansıtır.
Kopya kağıdı
Tasarım desenleri, yaygın yazılım tasarımı problemlerine yönelik yeniden kullanılabilir çözümlerdir. Doğrudan kopyalanacak kodlar değil, sınıfları ve nesneleri yapılandırmak için şablonlar olarak hizmet ederler.
Tasarım desenleri üç ana kategoride gruplandırılır:
| Kategori | Amaç | Örnekler |
|---|---|---|
| Kurucu (Creational) | Nesne oluşturma mekanizmaları | Singleton, Factory, Builder |
| Yapısal (Structural) | Sınıf ve nesne kompozisyonu | Adapter, Decorator, Composite |
| Davranışsal (Behavioral) | Nesne etkileşimi ve sorumluluğu | Observer, Strategy, Command |
Tasarım desenlerinin faydaları:
- Geliştiriciler arasında ortak bir kelime dağarcığı sağlarlar
- Yaygın problemlere yönelik çözümleri yeniden icat etmekten kaçınmayı sağlarlar
- Kodu daha esnek ve bakımı kolay hale getirirler
C++'da tasarım desenleri; kalıtım, polimorfizm, soyut sınıflar ve şablonlar (templates) dahil olmak üzere OOP özelliklerinden yararlanır.
Kendin dene
#include <iostream>
#include <string>
#include "PatternClassifier.h"
int main() {
// Desen ismini oku
std::string patternName;
std::cin >> patternName;
// TODO: Bir PatternClassifier örneği oluşturun
// TODO: Giriş desenini sınıflandırmak için sınıflandırıcıyı kullanın
// TODO: Eğer desen tanınırsa, şunu yazdırın:
// "[PatternName] is a [CategoryName] pattern"
// "Purpose: [CategoryPurpose]"
// TODO: Eğer desen tanınmazsa (nullptr), şunu yazdırın:
// "Unknown pattern: [PatternName]"
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner