Düzce Üniversitesi 2019 .Net Core Üzerinde Efektif Kod Yazma
Selamlar,
13 Aralık Cuma günü Düzce Üniversitesinde, Design Patternler ile Rafactoring konularına değindim. Gelişi güzel yazılan kodların, ileride nasıl büyük bir maliyete yol açacağını, örnekler ile inceledik. Aslında esas amaç, anlaşılır, kolay test edilebilir ve minimum efor ile değiştirilebilir kodlar yazmak. Örneklerde, belli başlı bir çok design patterden bahsetmeye çalıştım.
Yukarıdaki örnekte görüldüğü gibi hiçbir pattern’e uymayan kodlar, ilerki dönemlerde yeni özellikler eklenmek istendiğinde çok zaman alacak ve belki de kodu değiştirilemez kılıcaktır. Bu yüzden kodlar üzerinde iyice düşünülmeli ve belki bir kaç pattern kullanılarak, anlaşılır, kolayca geliştirilebilir ve mümkün olduğunca küçük parçalar halinde yazılmalıdır.
Örneğin aşağıdaki kodda da görüldüğü gibi, Web ve Mobil servisleri için kullanılan kütüphaneler ortaktı. Bu durumda, farklı platformlar, birbirlerinin methodlarını görebiliyor ve erişebiliyorlardı. Düşünün ki, Web için yapılcak bir güncellemede, Mobile platformu da, güncelleniyor ve publish sırasında bekletiliyordu. Ayrıca Web ortamında geliştirme yapılırken, mobil için kullanılan ve web için bir anlam ifade etmeyen “GetMobileDeviceID()” gibi methodlar, görülebiliyordu. Çözüm Interface Segregation. Yani aşağıda görüldüğü gibi, platformlara göre servisleri ayırma. Bazen çok basit gibi görünen çözümler, kod kalitesine büyük katkı sağlayabilmektedir.
Aşağıdaki örnekde, bir çok farklı bussines tek bir method altında toplanmıştır. Bu yöntem, ne esnektir ne de genişletilmeye uygundur. Test yapmak bir yana dursun, hataları yakalamak bile başlı başına bir iştir. Yeni bir mail atma yöntemi dahi eklenmek istense, aşağıdaki koda göre önce Enum’ün güncellenmesi daha sonra da Switch Case silsilesine yeni koşulun eklenmesi gerekmektedir.
Çözüm : Tabi ki, Strategy Design Pattern’dir. Tüm bussine logicler, ayrı birer sınıf olarak ortak bir interfaceden türetilir. Hepsi kendine göre bussine’ı, ortak bir method altında gerçekleştirir. Böylece yeni bir işlem geldiği zaman, yeni bir sınıfın ortak belirlenen interfaceden yaratılması yeterlidir. Yeni yazılacak logic, Interface’de tanımlı ortak method altında yapılır. Böylece genişlemeye açık ama, değiştirilmeye kapalı bir sistem oluşturulmuş olunur.
Seminer boyunca bütün gayem, kodu yazmadan önce düşünmenin ve ileriye dönük planlama yapmanın, gelecekte kod üzerinde yapılabilecek değişiklik veya eklentilerde kazandıracağı zaman ve kolaylığı gösterebilmekti. Kod okunaklığı, sadelik ve işleri küçük parçalara bölmenin sadece anlaşılabilirlikde değil, aynı zamanda test, hatanın tespiti, bugfix ve rafactoring gibi daha birçok konuda faydası vardır.
Geldik bir seminerin daha sonuna, yeni bir seminerde görüşmek üzere hepinize hoşçakalın. Öncelikle bana bu fırsatı verdikleri için, Düzce Üniversitesi Yazılım Ve Enformatik Topluluğuna çok teşekkür ederim. Katılımcıların yoğun ilgisi, sunumdan sonraki bir birinden güzel soruları, ve parlak fikirlerinden dolayı hepsini teker teker kutlar, teşekkürü bir borç bilirim.
Merhabalar, elinize sağlık. Katıldığınız seminerlerin erişebileceğimiz videoları var mı? Bir de ufak bir sorum olacak, bir web projesini katmanlı mimariyle oluşturmak istediğimizde, viewmodelleri nerede ve nasıl doldurabiliriz? -Özellikle farklı tablolardan veri çekmemiz gerektiğinde-
Selam Eren,
Öncelikle teşekkürler. Seminer Videolarım malesef yok. ViewModdler aslında bir Adaptor’dır.Yani gelen datayı kendi yapınıza adapte edersiniz. Burdan ne çıkıyor ? Bussines katmanında ve tabi ki Repository’de bu iş yapılmamalıdır. Bu iş Servis kaymanında yazılmalıdır. Controller ya da Action’ınız bu servis katmanını çağırmalıdır. View Modelleri AutoMapper gibi bir kütüphaneden faydalanarak doldurabilirsiniz.
İyi çalışmalar.