Makale Özeti

Biz Türkler bir projeye başlarken çok fazla planlama yapmayı sevmeyiz. Aceleciyiz ve analiz yapmayı pek sevmeyiz. Abi projeye başlayalım da nasıl olsa gerisi gelir deriz Ama proje ilerledikçe ihtiyaçlar artar yada değişir işte o zaman kod içinde boğulur gideriz. ( 40 yıllık yazılımcıyım gibi yazdım ama bunlar çevremden duyduğum şeyler ) Bu durumla karşılaşmamak için projenin temelini oluştururken biraz esnek düşünüp ilerde değişebilecek ihtiyaçlara uygun alt yapı sağlamalıyız.

Makale

Biz Türkler bir projeye başlarken çok fazla planlama yapmayı sevmeyiz. Aceleciyiz ve analiz yapmayı pek sevmeyiz. Abi projeye başlayalım da nasıl olsa gerisi gelir deriz :) Ama proje ilerledikçe ihtiyaçlar artar yada değişir işte o zaman kod içinde boğulur gideriz. ( 40 yıllık yazılımcıyım gibi yazdım ama bunlar çevremden duyduğum şeyler :)  ) Bu durumla karşılaşmamak için  projenin temelini oluştururken biraz esnek düşünüp ilerde değişebilecek ihtiyaçlara uygun alt yapı sağlamalıyız.

Bu noktada sınıflarımızı gevşek bağlı ( loosely coupled ) ilkesine uygun olarak tasarlamalıyız.

Çok basit bir senaryo üzerinden anlatmaya çalışacam. Mvc projesi üzerinden size bunu anlatmaya çalışacağım. 3 tane sınıfımız var. Bunlar aşağıda tanımlı.

 

01 public class KislikAyakkabi
02     {
03         public string YuruyusYap()
04         {
05             return "Soğuk havada yürüyüş";
06         }
07     }
08  
09 public class YazlikAyakkabi
10     {
11         public string YuruyusYap()
12         {
13             return "Sıcak havada yürüyüş";
14         }
15     }
16  
17 public class Insan
18     {
19         KislikAyakkabi _ayakkabi;
20         public Insan(KislikAyakkabi ayakkabi)
21         {
22             _ayakkabi = ayakkabi;
23         }
24  
25         public string Mesaj()
26         {
27             return _ayakkabi.YuruyusYap();
28         }
29     }

 

Malum kış ayındayız. Dışarı botlarımla çıkmam gerek. Yoksa ayaklarım üşür :) Insan sınıfı kurucu metodunda KislikAyakkabi tipinden bir nesne alıyor gördüğünüz gibi. Şimdi bu sınıfı kullanalım. Aşağıdaki index metodunda insan sınıfını oluşturduk ve bir mesaj verdirdik.

 

1 public class HomeController : Controller
2     {
3         public string Index()
4         {
5             Insan insan = new Insan(new KislikAyakkabi());
6             return insan.Mesaj();
7         }
8     }

 

Ekran görüntüsü şekildeki gibi oldu.

1

Şimdilik her şey yolunda. Fakat yaz ayları gelince dışarı botla çıkarsam millet bana neder ? Ayrıca ayaklarım pişmez mi :)

O zaman kolayı var. Insan sınıfını hemen değiştirim ve yaz modasına uygun düzenlerim.

 

01 public class Insan
02     {
03         YazlikAyakkabi _ayakkabi;
04         public Insan(YazlikAyakkabi ayakkabi)
05         {
06             _ayakkabi = ayakkabi;
07         }
08  
09         public string Mesaj()
10         {
11             return _ayakkabi.YuruyusYap();
12         }
13     }

 

Hemen projeyi derlerim ve çalıştırmaya başlarım. O da ne ? İlk hatamı aldım !!!
hata1

Tamam tamam sorun yok. Böyle bir kurucu metot yokmuş. Gözümden kaçmış. Hemen değiştiriyorum ve index metodu şöyle oluyor.

 

1 public string Index()
2         {
3             Insan insan = new Insan(new YazlikAyakkabi());
4             return insan.Mesaj();
5         }

 

Ekran görüntümüz değişti.
2

Sorunu çabucak hallettik ve sistemi çalışır hala getirdik. Ama kendimize bir soralım !!! Eğer index metodunun içindeki kodlar sistemde başka yerde de tanımlı olsa ne yapardık ? Diyelim 100 yerde tanımlı. O zaman gidip o 100 tanımlı yerde de değişiklik yapmamız lazımki sistem hatasız derlenip çalışsın dimi. Yaz ayında adama zorla bot giydirmeye çalışmışız . Bu hiç hoş olmadı.

O zaman sistemde bir değişikliğe gidelim.
IAyakkabi adında bir interface tanımlayalım. İçindede YuruyusYap metodu olacak.
KislikAyakkabi ve YazlikAyakkabi sınıfları bu interface’i uygulayacak.

 

01 public interface IAyakkabi
02     {
03         string YuruyusYap();
04     }
05  
06 public class KislikAyakkabi : IAyakkabi
07     {
08         public string YuruyusYap()
09         {
10             return "Soğuk havada yürüyüş";
11         }
12     }
13  
14 public class YazlikAyakkabi : IAyakkabi
15     {
16         public string YuruyusYap()
17         {
18             return "Sıcak havada yürüyüş";
19         }
20     }
21  
22 public class Insan
23     {
24         IAyakkabi _ayakkabi;
25         public Insan(IAyakkabi ayakkabi)
26         {
27             _ayakkabi = ayakkabi;
28         }
29  
30         public string Mesaj()
31         {
32             return _ayakkabi.YuruyusYap();
33         }
34     }

 

Önceden sadece KislikAyakkabi ya da YazlikAyakkabi sınıfına bağlı olan insan sınıfı artık belli bir tipe bağlı değil.
Aradaki sıkı sıkıya olan bağımlılıkları ( Dependency ) kaldırdık. IAyakkabi interface’ini uygulayan tüm sınıfları kabul edecek. Bu şekilde uygulamamız genişletilmeye açık hale gelecek. Şunuda söylemek istiyorum. Insan sınıfı içindeki _ayakkabi parametresine değer atamak için farklı yollar kullanılabilir. Kurucu metotla ( Constructor Injection ) yada özellik atayarak ( Property Injection ) bunu yapabiliriz. Biz kurucu metotla bu işi yaptık.

Lafda kalmasın genişletelim hemen. SonbaharAyakkabi sınıfınu oluştur. IAyakkabi dan implement et. Uygulamak zorunda olduğun YuruyusYap metodunu doldur. Index metodu içinde sadece yeni oluşturduğun tipi parametre olarak gönder.

 

01 public class SonbaharAyakkabi : IAyakkabi
02     {
03         public string YuruyusYap()
04         {
05             return " Sonbaharda benle yürü havan olsun :) ";
06         }
07     }
08  
09 public string Index()
10         {
11             Insan insan = new Insan(new SonbaharAyakkabi());
12             return insan.Mesaj();
13         }

 

3

İyi çalışmalar