Menu
Coddy logo textTech

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.

challenge icon

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 eden PatternCategory adı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 PatternCategory sınıfından türeyen üç sınıf oluşturun:

    • CreationalCategory"Creational" adını ve "Object creation mechanisms" amacını döndürür
    • StructuralCategory"Structural" adını ve "Class and object composition" amacını döndürür
    • BehavioralCategory"Behavioral" adını ve "Object interaction and responsibility" amacını döndürür
  • PatternClassifier.h: Verilen bir desenin hangi kategoriye ait olduğunu tanımlayabilen bir PatternClassifier sınıfı oluşturun.

    Sınıflandırıcınız, bir desen adını (string) alan ve uygun PatternCategory nesnesine bir işaretçi döndüren bir classify metoduna 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, nullptr döndürün.

  • main.cpp: Tek bir girdi okuyun—bir tasarım deseninin adı.

    Bir PatternClassifier oluş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 mechanisms

Observer girdisi ile:

Observer is a Behavioral pattern
Purpose: Object interaction and responsibility

Proxy girdisi ile:

Unknown pattern: Proxy

Bu 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;
}
quiz iconKendini test et

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