Çarşamba, Ağustos 15, 2007

Nesne Yönelimli Programlama İlkeleri II

Sınıf tasarımı yaparken sorumluluk, bağımlılık ve uyumluluk konusunun önemini bir önceki yazımızda tartışmıştık. Bağımlılığı düşük sorumluluğu yüksek sınıflar tasarlamak için dikkat etmemiz gereken noktaları incelemeye devam ediyoruz. Programımızın çalışma zamanı boyunca nesnelerimiz birbirleri ile iletişim halinde çalışırlar. Bu iletişimi sağlarken nesnelerin özelliklerini ve metodlarını kullanırız. Bir sınıfın iki önemli parçası vardır. Arabirimi (Interface) ve Gerçeklemesi (Implementation). Sınıfımızın arabirimi diğer sınıfların kullanımına açık (public) özellikleri ve metodlarıdır. Gerçekleme kısmı ise sınıfımızın davranışının belirlendiği kısımdır yani ilgili arabirimin kodlandığı kısımdır.

class Köpek
{
public string Havla() { return "Hav Hav"; }
}

Köpek sınıfının arabirimi Havla() adında bir metod içerir. Bu arabirim "Hav Hav" metnini döndürecek şekilde gerçeklenmiştir. Eğer aynı mantığa sahip başka sınıfımız varsa ikisinin ortak arabirimi kullanmasını sağlamak iyi bir fikirdir.

class Kedi
{
public string Miyavla() { return "Miyavv"; }
}

Kedi ve Köpek sınıfı benzer özelliklere sahiptir. Bir ortak arabirim ekleyerek sınıf tasarımını geliştirebiliriz.

interface IHayvan
{
string SesÇıkar();
}

Bu arabirim sadece kullanılabilir metodları ve özellikleri gösterir. Bu arabirimi gerçekleyen her sınıfı arabirim üzerinden kullanmak mümkündür. Arabirimi isimlendirirken I harfi ile başlamak bir gelenektir.

class Kedi:IHayvan
{
public string SesÇıkar() { return "Miyaaav"; }
}


class Köpek:IHayvan
{
public string SesÇıkar() { return "Hav Hav"; }
}


Bir arabirim kullandığımız için havla() ve miyavla() metodlarının adını sesçıkar() olarak değiştirdik. Böylelikle benzer sınıflarımızın ortak arabirimi oldu. Başka bir sınıftan bu sınıfları kullanmamız gerekecektir.

class Veteriner
{
public void TedaviEt(Köpek köpek){};
}


Bu sınıfımız Köpek nesnesini geçtiğimiz bir TedaviEt() metoduna sahip. Aslında Köpek sınıfı IHayvan arabiriminin bir gerçeklemesi. Sınıfların arabirimler yerine direk gerçekleme üzerinden diğer sınıflara erişmesi yüksek bağımlılık yaratır. Bu durum bizi gelecekte şöyle bir hatalı sınıf tasarımına zorlar.

class Veteriner
{
public void TedaviEt(Köpek köpek){};

public void TedaviEt(Kedi kedi){};
}

Bu bağımlılığı azatmak için yapmamız gereken gerçeklemeyi kullanmak yerine arabirimi kullanmaktır.

class Veteriner
{
public void TedaviEt(IHayvan hayvan){};

}

Bu sayede gelecekte IHayvan arabirimini gerçekleyen her türlü sınıfı Veteriner sınıfına parametre olarak geçebilmemiz mümkün olur.

Diğer sınıflara Gerçeklemesi üzerinden değil Arabirimi üzerinden erişmemiz gerekir. Bu sayede bağımlılığı düşük sınıflar tasarlayabilmemiz mümkün olacaktır. Bu ilkeye GOF kitabındaki "Program to an Interface, not an Implementation" başlıklı yazıda değinilmiştir.

İlerideki yazılarımda bağımlılığı düşük, uyumluluğu yüksek sınıflar tasarlayabilmemiz için gerekli diğer ilkeleri incelemeye devam edeceğiz.

2 yorum:

efkan dedi ki...

Nesne yönelimli programlamayı bu kadar iyi anlatan başka bir yazı daha okumamıştım. Teşekkürler..

Adsız dedi ki...

paylaşım için teşekkürler. Devamını bekleriz.Çünkü sınıfı interface yi anlatan bir çok makale var ama bu şeklide optimizasyonu anlatan az.
Başarılar.