Tasarım Kalıplarına Giriş
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 51 / 70.
Tasarım desenleri, yazılım geliştirirken geliştiricilerin tekrar tekrar karşılaştığı yaygın sorunlara yönelik kanıtlanmış çözümlerdir. Her seferinde tekerleği yeniden icat etmek yerine, desenler bize kodu yapılandırmak için ortak bir kelime dağarcığı ve test edilmiş yaklaşımlar sunar.
Tasarım kalıplarını planlar olarak düşünün. Kopyalamanız için size tam olarak yazılmış kod vermezler; ancak belirli zorlukları çözmek için sınıfları ve nesneleri nasıl düzenleyeceğinizi açıklarlar. Birisi “burada Factory kalıbını kullanın” dediğinde, deneyimli geliştiriciler önerilen genel yapıyı hemen anlar.
Tasarım kalıpları üç ana kategoriye ayrılır:
| Kategori | Amaç | Örnekler |
|---|---|---|
| Yaratımsal | Nesnelerin nasıl oluşturulduğu | Singleton, Factory |
| Yapısal | Nesnelerin nasıl birleştirildiği | Adapter, Decorator |
| Davranışsal | Nesnelerin nasıl iletişim kurduğu | Observer, Strategy |
İnceleyeceğimiz desenler, halihazırda öğrendiğiniz OOP kavramları olan arayüzler, kalıtım, çok biçimlilik ve kompozisyon üzerine doğrudan inşa edilmiştir. Her bir desen; esneklik, sürdürülebilirlik veya yeniden kullanılabilirlik sağlamak için bu temel ilkelerden belirli şekillerde yararlanır.
Sonraki derslerde Singleton, Factory, Observer ve Strategy ile başlayarak birkaç temel kalıbı uygulayacaksın. Bu kalıpları anlamak, mevcut kod tabanlarındaki yaygın çözümleri tanımana ve kendi projelerinde daha iyi mimari kararlar vermene yardımcı olacak.
Görev
KolayBirden fazla dosyadaki tasarım kalıbı bilgilerini düzenleyen basit bir kalıp kataloğu sistemi oluşturalım. Bu, iyi kod organizasyonu pratiği yaparken kalıpların nasıl kategorilere ayrıldığını anlamana yardımcı olacak.
Farklı sorumlulukları ayırmak için üç dosya oluşturacaksın:
Pattern.cs: Tek bir tasarım kalıbını temsil edenPatternsınıfınıPatternsad alanında tanımla. Her kalıbın birName,Category(Creational, Structural veya Behavioral) ve birDescriptiondeğeri olmalıdır. Biçimlendirilmiş bir dize döndürenGetSummary()metodunu ekle:[{Category}] {Name}: {Description}PatternCatalog.cs: Bir kalıp koleksiyonunu yönetenPatternCatalogsınıfınıPatternsad alanında oluştur. Kataloğun kalıp ekleyebilmesi ve bu kategoriyle eşleşen tüm kalıpların listesini döndürenGetPatternsByCategory(string category)metoduna sahip olması gerekir. Ayrıca katalogdaki tüm kalıplar için özet dizelerinin listesini döndüren birGetAllSummaries()metodu ekle.Program.cs: Bir katalog oluşturarak ve girdiye dayalı kalıplarla doldurarak her şeyi bir araya getir. Ardından kategoriye göre filtrelenmiş kalıpları görüntüle.
Aşağıdaki girdileri alacaksın:
- Eklenecek kalıp sayısı
- Her kalıp için ad, kategori ve açıklamayı içeren üç satır
- Filtrelenecek kategori
Tüm kalıpları kataloğuna ekledikten sonra, filtre kategorisiyle eşleşen kalıpların özetlerini her satıra bir tane gelecek şekilde yazdır. Hiçbir kalıp eşleşmezse No patterns found yazdır.
Örneğin girdiler şöyleyse:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
CreationalÇıktı şöyle olmalıdır:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classBu görev, ilgili sınıfları ayrı dosyalarda düzenlemenin kod tabanını nasıl temiz ve sürdürülebilir tuttuğunu gösterir - yaklaşan derslerde gerçek tasarım kalıplarını uygulamaya başladığında daha da önemli hale gelecek bir ilke!
Kendin dene
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// Desen sayısını oku
int n = Convert.ToInt32(Console.ReadLine());
// Yeni bir PatternCatalog oluştur
PatternCatalog catalog = new PatternCatalog();
// TODO: Her bir desenin detaylarını (name, category, description) oku
// ve onları kataloğa ekle
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Bir Pattern oluştur ve onu kataloğa ekle
}
// Filtrelenecek kategoriyi oku
string filterCategory = Console.ReadLine();
// TODO: Filtre kategorisine göre desenleri al
// ve özetlerini yazdır
// Eğer hiçbir desen eşleşmezse, "No patterns found" yazdır
}
}
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 Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi