Yeniden kullanım tüm mühendislik dallarında kendine önemli yerler edinmiştir. Bu sayede daha kısa zamanda daha çok üretim yapıp, daha verimli çalışabilmek mümkün olmaktadır. Yazılımın yeniden kullanılabilirliği, YK (Software Reuse), varolan yazılım varlıklarının - kod, gereksinimler, tasarımlar, test durumları vs. - yeni yazılımların üretilmesinde kullanılması olarak tanımlanmaktadır. YK, bir çok faydayı da beraberinde getirmektedir. Bunlar şu şeklide sıralanabilir:
Artan güvenilirlik: Sürekli test edilen bileşenlerin kullanılması sayesinde yazılımlar hatalardan arınmaktadır. Düşük süreç riski: Bilindik bileşenler tekrar kullanıldıkları için, projeler zamanında teslim edilebilmektedir. Kaynakların verimli kullanılması: Yeniden kullanılan yazılım varlıkları olduğunda, insanları yeniden kullanma oranı düşmektedir. Bu sayede yetişmiş insan gücü daha verimli ve yaratıcı bir şekilde kullanılabilmektedir.
Yazılım mühendisliğindeki tüm güncel yaklaşımlar, YK’nın artırılmasını hedeflemektedir. Yeniden kullanım tarihine baktığımızda, ilk olarak fonksiyonlar bazında yeniden kullanım göze çarpmaktadır. Bu YK’nın en basit tekniğidir. Bu tip YK’da mühendislerin bilgisine bağımlılık fazla olduğundan çok verimlilik sağlanamamaktadır. Bir sonraki YK aşaması kütüphanelerdir. Kütüphaneler, kullanıcılarına bir tür arayüz sunabilmektedirler ve bu sayede YK’da kolaylık sağlarlar. Ancak kütüphanelerin yapılandırılabilirlikleri düşüktür ve kütüphane kullanarak geliştirilen uygulamalar, bu kütüphanelere çok bağımlı kalmaktadırlar. İskeletle (Çatı, Framework), YK konusunda bir adım öndedirler. İskeletlerde, kütüphanelerdekinin aksine kontrolün terse dönmesi kavramı mevcuttur. Kütüphaneler kullanılırken, yazılımcı hakimiyeti elinde tutmaktadır. İskeletlerde ise durum farklıdır. İskeleti kullanan, ondan bir istekte bulunur ve iskelet kendi içinde çesitli mekanizmaları - olaylar (events) - tetikleyerek bu istekleri gerçekleştirir.
Yukarıda bahsettiğimiz üç tip YK da esasen kodun yeniden kullanımıdır. Bu kod nesne yönelimli (object oriented), bileşen yönelimli (component oriented) veya sadece yordamsal (procedural) olabilmektedir. Burada, tahmin edilebileceği gibi yordamsal kod çok alt seviye ve YK adına kullanışsız kalmaktadır. Nesne yönelimli YK, devrim niteliği taşımaktadır. Miras (inheritance) sayesinde çok yoğun YK sağlanabilmektedir.
Şekilde görülen miras ilişkisinde Sınıf2 Sınıf1’in özelliklerine sahip olmaktadır. Bu sayede Sınıf1’in tüm özellikleri Sınıf2 için kullanılabilir olacaktır. Ancak bu yaklaşımın da hataya ve YK’nın esnekliğine zarar verecek gelişmelere açıklığı vardır. Sınıf1’de yapılan bir değişiklik Sınıf2’ye doğrudan yansıyacağından istenmeyen sonuçlara sebep olabilir. Nesne tabanlı iskeletlerde (Object oriented framework) bu sıkıntıya sıkça rastlanmaktadır ve bu sorun kırılgan miras yapılı sınıf problemi olarak bilinmektedir (Fragile base class problem). İskeletlerin değişen versiyonları ile birlikte iskelete bağımlı uygulamaların çalışmasında ciddi sorunlar olabilmektedir. Nesneye yönelim paradigmasından sonra bileşen yönelimli yaklaşımların literatürde yer edinmesi ile bileşen tabanlı iskeletler ortaya çıkmaya başlamıştır. Bileşen teknolojisi YK için büyük öneme sahiptir. Bileşenler tanımlı arayüzleri, ki bu arayüzler sadece bileşenlerin sağladığı veya sunduğu servisleri tanımlamakla kalmayıp; performans, zamanlama, servis kalitesi (Quality of Service, QoS) gibi farklı gerekleri barındırabilme özelliğine sahiplerdir. Aşağıdaki şekilde göründüğü üzere, bileşen tabanlı iskeletin değişkenliklerden yoksun kısımlarında tanımlı arayüzlere seçilebilir bileşenlerin yerleşmesi vasıtasıyla uygulamalar oluşturulabilmektedir.
Buradaki en önemli nokta, yeniden kullanım için miras değil bileşim (composition) kullanılmasıdır. Bilindiği üzere miras, derleme zamanında sabitlenmektedir. Ancak bileşim, çalışma zamanında da değiştirilebilir. Bu sayede bileşen tabanlı iskeletler nesne tabanlı iskeletlere göre çok büyük esneklik kazanabilmektedir.
YK’da kod seviyesinden daha yukarıda kavramsal seviyede YK bulunmaktadır. Bu tip YK 1994 yılında GoF (Gang of Four) olarak adlandırılan dört mühendisin yazdığı klasik bir yapıtla dünyaya tanıtılmıştır. Yazılım tasarım kalıpları olarak adlandırılan bu YK yönetimi, bir problem hakkındaki soyut çözüm bilgisini yeniden kullanmayı hedeflemektedir. Tasarım kalıpları tasarımlarda tekrar kullanılabilecek kod bilgisi içermemektedir; ancak tasarımların daha temiz, daha yeniden kullanılabilir olmasını sağlayacak bilgi içeriği barındırmaktadırlar. Tasarım kalıplarının bir üst seviyesinde ise mimari tasarım kalıpları bulunmaktadır ve bunlar büyük sistemlerin genel hatlarını belirleyen kalıplardır. Örneğin alışıldığı üzere iletişim altyapılarını destekleyen yazılımların katmanlı mimariye, derleyici tarzı yazılımların ise borular ve filtreler (pipes and filters) mimarisine sahip olması beklenir.
2000’li yıllardan sonra YK adına en farklı fikir, yazılım ürün hatları kavramı ile gelmiştir. Bu yaklaşım ile yazılımda sadece kod veya mimarinin yeniden kullanılması değil; bunlarla birlikte, gereksinimlerin, bileşenlerin, özelliklerin, test durumlarının da yeniden kullanılması ve yazılım geliştirme süreçlerinin bu yaklaşıma göre modifiye edilmesi öğütlenmektedir. Ürün hattı kavramında esas olan, ortak özellikleri fark edilebilen bir ürün ailesi seçmek ve bu ailenin ortak ve değişken özelliklerini modellemektir. Bu sayede ürün geliştirenlerin önünde ortak referans bir mimari ve bu mimaride değişiklik yaparak yeni ürünler ortaya çıkartma potansiyeline sahip bir değişkenlik modeli bulunmaktadır. Bunun mümkün olabilmesi için bu ailenin hangi alana yayılacağı belirlenmelidir. Alan kapsamının belirlenmesi ürün hattının başarılı sonuç vermesi açısından kritik öneme sahiptir. İnsanların git gite kişiye özel olmalarını bekledikleri, yoğun ürün talepleri her geçen gün artmaktadır. Bu istekleri zamanında ve az maliyetli olarak karşılamak ancak tüm yazılım varlıklarının yeniden kullanabilirliğini savunan yazılım ürün hattı yaklaşımları ile mümkün olabilecektir.
Kaynaklar:
[William B. Frakes and Kyo Kang 2005] Software Reuse Research: Status and Future, IEEE Transactıons On Software Engıneerıng, 2005
[Pohl et al. 2005] K. Pohl, G. Böckle, and F. v. d. Linden; Software Product Line Engineering: Foundations, Principles, and Techniques, Springer, Berlin Heidelberg New York, 2005.
[Clements and Northrop 2001] P. Clements and L. Northrop; Software Product Lines: Practices and Patterns, Addison-Wesley, Reading, Massachusetts, 2001.