Yazılım Tasarım Kalitesi Nedir? Yazılım Kalitesi Nedir? Farkları Nelerdir?Beğen
Öncelikle kalite nedir onu tanımlayalım. Bir ürün, hizmetin belirlenen veya olabilecek ihtiyaçları karşılama kabiliyetine dayanan özelliklerin toplamıdır şeklinde basitçe tanımlanır kalite. Peki bu tanım yeterli midir? Bence hayır. Kalite bakıldığında sezgisel olarak anlaşılabilen ama tanımlanması güç bir kavramdır. Yine de biz tanımlayabildiğimiz kadarı ile yazılım kalitesi ve tasarım kalitesi nedir ele alalım.
Yazılım kalitesi bir yazılımın dıştan göründüğü şekliyle ihtiyaçları karşılama kabiliyeti ve özelliklerinin toplamıdır. Yazılımın çalışma, cevap verme süreleri, kullanıcı açısından kullanım kolaylığı, görsel özellikleri, hata verme sıklığı vs. gibi kavramları dışarıdan gözlemlenen unsurlara örnek verebiliriz. Yazılım Tasarım Kalitesi ise yazılım iç özelliklerini temsil eder. Kolay anlaşılır, kolay gerçeklenebilir, kolay değiştirilebilir, kolay test edilebilir bir tasarım yüksek kaliteli bir tasarımdır. Geliştirme, test, hata giderme, bakım maliyetlerini minimuma indiren bir tasarım, yazılım tasarım kalitesinin yüksek olduğunu gösterir. Yazılım tasarım kalitesi, yazılım kalitesini büyük oranda etkilemektedir ancak tasarım kalitesi yüksek, kalitesi düşük bir yazılım veya bunun tersi de mümkündür. Soyut kavram olan yazılım yerine somut bir kavram üzerinden benzetme yapalım;
Elimizde 2 otomobil var. A ve B model araçlar diyelim. Kullanıcı gözüyle baktığımızda, ikisi de 100 km/s hıza 3.5 sn. gibi sürelerde çıkıyor. Aerodinamik özellikleri, virajlardaki tutunmaları, ısı ve ses yalıtımı vb. özellikleri birbirine çok yakın ve eşdeğer olsun. Bizim için bu 2 araç da kaliteli araçlardır. Peki bu araçların bir kaza sonucunda sağ ön tekerinin jantının eğildiğini ve değişmesi gerektiğini varsayalım. A model aracın sağ ön jantını değiştirebilmek için tüm jantların sökülmesi ve hatta değiştirilmesi gerekiyor. Çünkü bu şekilde yekpare tasarlanmış. B model araçta ise sadece bir kriko ile çok kısa sürede kolayca sadece sağ ön jant değiştirilebiliyor. İşte tasarım kalitesi farkı burada ortaya çıkıyor. Ne zaman ki bir onarım, modifikasyon, bakım ihtiyacı ortaya çıkarsa tasarım kalitesi ile de o esnada tanışmış oluruz. Formula yarış araçları tasarım kalitesine güzel bir örnek teşkil eder. Araçlar sadece pistteki performansları ile değil, pite girdiklerinde pit ekibi tarafından yenilenme performansları ile de yarışı kazanır veya kaybederler. Saniyeler içinde tekerler değiştirilir, depo doldurulur, arıza varsa giderilir.
Yazılım Tasarımı Kalitesi de direkt olarak yazılımı geliştiren ve test eden kişileri ilgilendiren ve etkileyen bir unsurdur. Nesneye dayalı (OOP) bir yazılımın tasarım kalitesini belirleyen iç nitelikler şunlardır:
- Anlaşılırlık (Understandability): Geliştirme ekibine yeni katılanların yazılımı ve tasarımı çabuk kavrayabilmesi.
- Modülerlik (Modularity): Yazılımın birbirinden bağımsız parçalar halinde geliştirilebilmesi, değiştirilebilmesi, bu parçaların bağımsız bir şekilde test edilebilmesi
- Tekrar Kullanılabilirlik (Reusabilty): Yazılım içindeki parçaların, modüllerin tekrar kullanılabilir şekilde olması.
- Test Edilebilirlik (Testability): Hata oluştuğunda hatanın nedeninin kolay bulunabilmesi (troubleshoot) ve hatanın kolay çözülebilmesi (fix)
- Güvenilirlik (Reliability): Hata oluşma ihtimalinin az olması, hataların erken aşamada tespit edilmesi.
- Sürdürülebilirlik (Maintainability): Değişim ve dönüşüm kolaylığı. Esneklik.
Bu nitelikleri maksimum seviyeye çıkarmak için kullanılan başlıca prensip veya kavramlar şunlardır:
- Seperation of Concerns: Yazılımın her iş için farklı bölümlere ayrılmasıdır. Çok katmanlı veya MVC gibi mimariler örnektir.
- Model-View Seperation: İş nesneleri (domain objects) ile kullanıcı ara yüz (UI) nesnelerinin birbirinden ayrılmasıdır.
- Low Coupling: Sınıflar arası bağımlılığın minimuma indirilmesi amaçlanır. Bir sınıftaki değişikliğin diğer sınıfları minimum seviyede etkilemesidir.
- High Cohesion: Yüksek uyum anlamına gelir. Sınıfların sadece kendi ile ilgili görevlere odaklandığı, gereğinden fazla iş yüklenmediği tasarımlarda yüksek uyum ortaya çıkar.
- Encapsulation: Nesne veya sınıfların alanlarına direk erişimin engellendiği, erişimin engellenmesi veya veri okuma/yazma işlemlerinin kontrol altında tutulmasıdır.
- Favor Object Composition Over Inheritance: Sınıfların miras alma yollu (IS-A) değil sahip olma, birleşim (HAS-A) şeklinde tasarlanmasının tercih edilmesidir.
- Design to interface: Sınıfların soyut ara yüzler üzerine gerçekleştirilmesi ve sınıfların da somut sınıflara değil soyut ara yüzlere bağlı olarak tasarlanmasıdır.
- The Law of Demeter: Sınıfların birbirleri ile ilgili mümkün en az bilgiye sahip olmasını amaçlar. Sadece ikili sınıf ilişkilerini hedefler.
- Design Patterns (GoF): Adapter, Factory, Composite gibi tasarım desenlerinin kullanımıdır.
- Enterprise Design Patterns: Transparent Proxy, Repository, Unit of Work gibi desenlerin kullanımıdır.
Bu kavramların dışında da mimari ve tasarım kalitesini artırmaya yaklaşık kavramlar mevcuttur ve zamanla yenileri de ortaya çıkacaktır. Tasarım Kalitesi her yazılım için olmazsa olmaz değildir. Performansın çok önemli olduğu gerçek zamanlı uygulamalarda (savunma sanayi yazılımları, gömülü sistemler, çevrimiçi çok oyunculu oyunlar, multimedya yayınları, veri analizi uygulamaları vb.) maliyetler üstlenilerek tasarım kalitesinden ödün verilebilir. Örneğin; Oyun yazılımlarında nesneye dayalı bir tasarım yerine prosedürel bir tasarım performans için daha gerekli olabilir. Başka bir örnek olarak; bir roketin yönünü tayin eden bir yazılımda C gibi daha alt seviye diller tercih edilir ve gerektiğinde makine dili (assembly) seviyesinde de geliştirme, modifikasyon yapılabilir. Bu yapılarda tasarım kalitesi arka plandadır.
Tasarım Kalitesi daha çok nesneye dayalı yazılımlar için değerlendirilebilir. Ölçümü zordur ve belli metrikler ölçülerek ve bu metrikleri kullanan belli formüller, modeller oluşturularak tasarım kalitesi ölçümü yapılmaktadır. bu ölçümler, bir yazılımın diğer bir yazılımla tasarım kalitesi olarak kıyaslanmasını değil, kendisi ile kronolojik olarak kıyaslanmasını hedefler. Kullanılan bu metriklere birkaç örnek verecek olursak; "sınıf başına düşen metot sayısı (methods per class)", "Türetim ağacı derinliği (depth of inheritance tree)", "çocuk sayısı (number of children)", "bağımlı olunan sınıf sayısı (coupling between objects)" vb. gibi. Bunun gibi metrikler kullanılarak, kalite ölçüm modelleri oluşturulabilir ve tasarım kalitesi zayıf olan sınıflar tespit edilerek, daha iyi bir tasarıma yönlendirilebilir.
Sonuç olarak; en iyi kod hiç yazılmamış koddur. Aynı işi yapan iki yazılım için daha az sayıda kod satırı içeren yazılımı geliştirmek daha zor olandır ve daha iyi bir tasarım gerektirir. Aksine klon kodların ortaya çıktığı, kod içinde zamanla kötü kokuların?! oluştuğu (code smells), zaman geçtikçe geliştirme ve test maliyetlerinin ivmeli bir şekilde arttığı yazılımlar geliştirmek başlangıçta kolaydır ama zamanla yönetimi, değiştirilmesi daha zor bir hale gelir.