Yazılım geliştirirken karşılaştığımız problemler ya da karşılamamız gereken ihtiyaçlar ne kadar farklı olsada, bir noktada bu problem ve ihtiyaçlara bakış açısı ortak hale geliyor. Belli kalite özelliklerini korumak ve katma değer katan çözümler oluşturabilmek için bu ortak nokta da prensipler ile karşılaşıyoruz. Bir kaç önceki yazımda ortaya atılan bu prensiplerden bahsetmeye başlamıştım. Şimdi bir kaç tanesinden daha bahsetmek istiyorum.

DRY – Don’t Repeat Yourself

Geliştirdiğimiz yazılımlarda, -hatta biraz daha derine girim; sınıflarda/metodlarda asıl katma değeri oluştururuz. Yani temelinde, bir metod içerisindeki yazdığımız algoritma ya da oluşturduğumuz obje modeli karşılamamız gereken ihtiyacın ya da çözülmesi gereken problemin cevabıdır. Çözmeye çalıştığımız problemler büyüdükçe ve karmaşık hale geldikçe, daha önce kullanmış olduğumuz cevapları tekrar kullanmaya başlarız. Bu noktada DRY prensibi dur der. Kendini tekrarlama diye karşımıza çıkar.

Geliştirdiğimiz yazılımlarda, çözüm olarak oluşturduğumuz yapıların yazılım içerisinde tek bir tane olması gereklidir.  Bunun önüne geçemezsek, bir problem için, aynı çözümün birden fazla versiyonu kodun içerisinde kendine yer bulur… Gelişir, gelişir, büyür ve kodun bakımını zorlaştırır. E-mail validasyonu yapan bir yapı ile aynı validasyonun daha farklı bir string operasyonu ile yapılıyor olması, yazılım içinde de tutarsızlığa yol açar. Sonra uğraş dur…

Kod yazarken, daha önce benzer bir çözüme benzediğini düşüyorsanız, o çözümü re-use edilebilecek hale getirmek en uygunu olacaktır.  DRY prensibini uygulamak için code-generation araçları ve kod dökümantasyonu oluşturan araçlardan faydalanmak kolaylık sağlayacaktır. Referans kitabı olarak arasıra danıştığım, David Thomas-Andrew Hunt ikilisinin yazdığı, The Pragmatic Programmer kitabını DRY prensibi ile ilgili olarak şiddetle tavsiye ederim. Uygulanabilirliği konusunda güzel ip uçları içermekte.

SoC – Seperation Of Concerns

separation of concernsSoC, yazılımdaki elemanların kendilerine özel olmasını, sorumluluklarının kendilerine ait olup, başka elemanlar ile paylaşmamasını söyler. Sorumlulukların ayrı olmasının gerekliliği bu prensibin altını çizdiği temel noktadır.  Yazılımı geliştirirken, “sınır” diyebileceğimiz kavramlar bu sorumlulukları bir birinden ayıran en net ifadeler olabilir. En basitinden, layer ve tier kavramları ile belli sorumlulukları bir birinden ayırırız. Birazcık daha içeri girersek, yazılım bileşenlerimizin namespace’leri de, sorumlulukları ayırmak için kullanabileceğimiz sınırlardır diyebiliriz.

Genelde bu sorumlulukları belirlerken, çok küçük parçalara kadar inmeye çalışırız. Çok küçük parçalardan daha önemli olan sorumluluk kümelerinin net ve ayrı olabilmesidir. Einstein’nın bir lafı vardır çok hoşuma giden,  “Make everything as simple as possible, but not simpler.” Her şeyi basit yap ama daha basit yapma…Benzer şekilde sorumlulukları küçük parçalara ayır ama daha da küçültme şeklinde bu konu için yorumlayabilirim. Sorumluluk kümelerini iyi oluşturamazsak, ayrık ayrık bir sürü parça sistemde kaybolur gider. Bu da çok iyi bir şey değil.

Yazılım içindeki bileşenlerin bir birine bağlılık derecesi(coupling) ve bileşenler içerisindeki sorumluluk ilişksi(cohesion), SoC prensibi için önemli iki kavramdır. Bileşenlerin bağlılık derecesinin düşük olması ve bir bileşen içindeki sorumluluk ilişkisinin yüksek olması her zaman tercih edilmelidir. Yani low-coupling, high-cohesion olmazsa olmaz… Bu sayede bağlılık derecesi düşük olursa, sorumlulukar bileşen başına dağılmış olacağından yazılımın kontrolü bizim elimizde daha kolay olacaktır.  Bileşenler içerisindeki sorumluluklarında bir birlerine yakın olması, re-usebility’i ortaya çıkaracaktır.

SoC prensibi, geliştirdiğimiz yazılımları genişletebilir yapabilmenin de en önemli noktasıdır. Sorumlulukları ve bağlılıkları iyi ayırabilmeyi söylediğinden dolayı, yazılımlarımızın esnek ve genişleyebilecek alt yapıda olmasına ön ayak olur.

Bu iki önemli prensip de yazılım geliştirmede oldukça önemli konuların altını çiziyor. Pratik olarak zaman zaman dikkat etmesi zor olsa da, gerçekleştirildiği takdirde oldukça faydalı sonuç vereceklerdir.