Merhabalar,
Bugün sizlere Design Patterns(Tasarım Desenleri) konusundan State Pattern'i(Durum Desenlerini) anlatmaya çalışacağım. Fakat öncelikle Bu Tasarım Desenleri nedir, ne işe yarar, yenilir mi, içilir mi ondan bahsetmek istiyorum.
Tasarım Desenleri, yazılım geliştirmede sürekli karşılaştığımız sorunları genel olarak ele alarak bu tarz sorunların aşılmasında hızlı, başarılı ve esnek çözümler sağlayan hazır kalıplardır.
Bu tasarımların hemen hemen her birini uygulayabileceğimiz alanlar olduğu gibi bir problemin çözümünde birden fazla kalıpların kullanıldığı da olmaktadır.
Tasarım Desenleri dediğimizde aklımıza genellikle GoF(Gang of Four) tasarım desenleri gelmektedir ki bunlar 3 grup altında 23 tane tasarım desenidir. Fakat bunların dışında da tasarım desenleri bulunmaktadır.
GoF Tasarım Desenleri Grupları:
1- Creational Patterns (Kurucu Desenler) (Şuradan Creational Patternsle alakalı yazıları bulabilirsiniz.)
2- Structural Patterns (Yapısal Desenler)
3- Behavioral Patterns (Davranışsal Desenler)
Benim size anlatacağım State Pattern 3. gruba yani Behavioral Patterns içerisine girmektedir.
State Pattern kullanım açısından çok sık kullandığımız bir pattern değildir fakat orta seviyelerde bir kullanım alanı vardır. Bu tasarımın önemli özelliklerinden bir tanesi duruma bağlı değişiklik gösteren kurgularda iç içe "if/else" ve "swicth" yapısını kullanmayı en aza düşürmektedir. Böylece "if/else" lerin içersinde boğuşmaktan kurtulabilirsiniz.
Bu kadar konuşmadan sonra bir örnekle olayın daha iyi anlaşılması sağlayalım:
Örnek:
Bir okul düşünün bu okula giren bütün öğrenciler ücretli olarak başlıyorlar fakat daha sonra gösterdikleri başarılara göre burs kazanıyorlar. Burada öğrencinin burs durumunda değişiklik oluyor. Şimdi bunu UML diagramla gösterelim:
Örnek UML Diagram:
Örnek C# Kodu :
/* IUcretDurumu.cs */
public interface IUcretDurumu
{
// interface içerisinde olan metodlarımız
//UcretHesapla() öğrencinin ücretinin hesaplanması için
void UcretHesapla();
// UcretOde() öğrencinin ödemesi gereken ücreti ödeyecek
void UcretOde();
}
/* Ucret.cs */
public class Ucret
{
public IUcretDurumu ucretDurumu;
// Ucret classının instance’ı alındığında default olarak Normal Ücreti
// hesaplayacak
public Ucret()
{
ucretDurumu = new NormalUcret();
}
public void UcretOde()
{
ucretDurumu.UcretOde();
}
public void UcretHesapla()
{
ucretDurumu.UcretHesapla();
}
// IucretDurumu türünden bir değişken alıp öğrencinin durumunu gelen değişkene // göre değiştirecek
public void durumDegistir(IUcretDurumu ucretDurumu)
{
this.ucretDurumu = ucretDurumu;
}
}
/*NormalUcret.cs*/
public class NormalUcret : IUcretDurumu
{
public void UcretHesapla()
{
Console.WriteLine("Normal Öğrencinin Ücreti Hesaplandı.");
}
public void UcretOde()
{
Console.WriteLine("Normal Ogrencinin Ucreti Ödendi.");
}
}
/*BursUcret.cs*/
public class BursUcret : IUcretDurumu
{
public void UcretHesapla()
{
Console.WriteLine("%50 Burslu Öğrencinin Ücreti Hesaplandı.");
}
public void UcretOde()
{
Console.WriteLine("%50 Burslu Ogrencinin Ucreti Ödendi.");
}
}
/*Ogrenci.cs*/
Public static void Main(string[] args)
{
// oluşturulan ücret varsayılan olarak 'normal' durumda.
Ucret ucret = new Ucret();
ucret.UcretHesapla();
ucret.UcretOde();
// Öğrenci Burs durumuna göre yeni burslu durumuna geçiriliyor.
ucret.durumDegistir(new BursUcret());
// Öğrencinin durumu değiştiği için ücrethesaplaması ve öcret ödemesi de değişecek
ucret.UcretHesapla();
ucret.UcretOde();
}
