24 Ocak 2013 Perşembe

Kodun tekrar kullanılabilirliği (Code Reusability)

Giriş
Tekrar kullanılabilir kod yazmanın özü harcadığınız eforu çoğaltmak yerine ondan kaçınmanızdan geçer. Sıfırdan bileşenler yazmak yerine , bir programcı var olan kod parçasını düzenleyerek kendisine uyarlamalıdır. Tekrar kullanılabilir kod gözle görülür bir oranda performans artışı getirecektir. Böylece kullanılabilirliğin tanımı iki veya daha fazla program arasında harcanılan eforu azaltmamızda saklıdır.

Tekrar kullanılabilirliğin çeşitleri 

Motivasyon ve yürütme ile ilgili kavramlarda tekrar kullanılabilirlik:

Fırsatçılık: Projeye başlamaya hazır olduğunuzda; ekip arkadaşınız tekrar kullanabileceği bir kod parcasının olduğunun farkına varmalıdır.

Planlama: Stratejik olarak bir ekibin ilerideki projeler için tekrar kullanabileceği bir component tasarlaması.

Fırsatları değerlendirmek açısından yeniden kullanılabilirlik:

Dahili yeniden kullanım: Ekibiniz kendi componentlerini kullanır. Ekip olarak proje için kritik bir bileşeni kontrol etmek isteyebilirsiniz çünkü bu siz ve ekibiniz için bir şirket kararı olabilir.

Harici yeniden kullanım:  Ekibiniz third-party component lisansını tercih edebilir. Third-party componentini lisanslama tipik bir şekilde ekibin geliştirmek için mal olacağı fiyatın yüzde 1 ile 20 arasında bir tutara mal olur. Ebiniz tabikide componenti bulmak, öğrenmek ve uygulamanıza entegre edebilmek için geçecek zamanı göze alıp karar vermelidir.

Form veya yeniden kullanım yapısı ile ilgili olarak kod yapısı:

Referanslı: İstemci kodu yeniden kullanılabilir kod ile ilgili bir referans içerir. Böylece farklı yaşam döngüsü ve versiyonlara sahip olabilir.

Çatallı:  İstemci kodu, tekrar kullanılabilir kodun özel veya yerel bir kopyasını içerir. Böylelikle tek bir yaşam döngüsü ve versiyonu paylaşırlar.

---------------------------------------------------------------------------------------------------------------------------------
Tekrar kullanılabilir kod biraz farklı amaçlara hizmet edebilir. Burada zaman temel kavramdır dolayısıyla program için de bu söz konusudur. Yine eforumuzu arttırmaktan kaçarsak, benzer durumda yazdığımız programlarda ciddi bir gelişme olacaktır. 


Programlamada verimliliğinin sırrının kodun tekrar kullanılabilir olmasından doğduğunu düşünüyorum. Bunun için karşıma çıkan sonuç kütüphane kavramıydı. C' de yazarken Standard C Library 'deki çoğu fonksiyonu farklı şekillerde birleştirerek çeşitli işlevleri yerine getiren programlar yazmamız isteniyordu. Tabiki derslerde söylenenlerde de fonksiyonlar oluşturarak bu tarz kütüphaneler' ler oluşturabileceğimizdi. Herkesin ortak kullanacağı fonksiyonları zaten bir kütüphane olarak toplamışlar ve bize düşen ise yazdığımız kodları fonksiyonlara ayırarak onları daha sonra tekrar tekrar kullanabilmemiz olduğunu düşünüyorum. Bu noktada isterseniz kendi kütüphaneniz olarak ta düşünebilirsiniz, önemli olan ayrılan fonksiyonların ileride bir işimize yardımcı olabilmesi. 

Tekrar kullanılabilir kodlar yazmak sadece programlamada bir kodu tekrar icat etmeden yazabilmenin bir parçasıdır ve kritik bir noktaya da değinmek istiyorum: varolan kodu tekrar kullanmaya cesaret ettiren ve ilişkili kod bölümlerini bulan en etkili araçlar, eğer kod bölümleri çok özel durumlar dışında tekrar kullanılabilir olarak yazılmamışsa geçersiz kalacaktır.

Kodları tekrar yazmak beraberinde birçok negatif sonucu da getirebilmektedir. İkinci kez yazışınızda hata yapma oranınız bulunur .....




Daima kod yazarken aklımıza bir fikir gelmesi gerekiyor, o da "Acaba bunu daha sonra kullanabilir miyim ?" sorusudur. Eğer cevabınız "evet" veya "olabilir" ise hemen fonksiyona çevirip ait olduğu dosya grubuna eklemeliyiz. 

Peki ait olduğu grup derken neyi kastediyorum ? Oluşturduğunuz fonksiyonlar en başlarda birbirlerinden bağımsız bir şekilde görünmektedir (açıkçası başlarda benim için böyleydi) daha sonra elinizdeki fonksiyonlar arttıkça birbirleriyle arasında bir ilişkisinin olduğu kanısına vardıkÖrnek olarak: Sıralama Algoritmaları (Sorting Algorithms) aslında az önce anlattığım gibi bir grubu ifade ediyor ve sıralama işlevini yapan çeşitli fonksiyonları kapsıyor. Bizler de yazdığımız çeşitli algoritmada gruplama yaptığımız zaman onları tekrar yazma zahmetine girmemiş oluyoruz. Buna harcayacağımız zamanı fonksiyonlarımızı alıp birleştirmeye verdiğimizde programımızı hızlıca ve sistemli bir şekilde ortaya çıkarabiliriz.




Bunun yanında Fonksiyon Oluşturma' da dikkat edilmesi gereken noktalar bulunuyor. Bulabildiklerimi ve benim yaşadığım hatalardan aldığım dersleri sizlerle paylaşacağım.

İlk olarak yukarıda da bahsettiğim gibi "Acaba bunu daha sonra kullanabilir miyim ?" sorusu geliyor. Daha sonra bu soru olumlu bir cevapla bitiyorsa gerekli kısmı fonksiyona dönüştürmeliyiz. Bunu yaparken de ilk hedefimiz bu kod parçasını ilerde tekrar tekrar kullanmak olmalı. Yani büyük bir kısım kodu seçersiniz ama ileride kullanamazsınız bu da hiçbir işimize yaramaz. Burada fonksiyonu oluştururken dikkat edilmesi gereken ve genel olarak kullanılan birkaç kural var:


  1. Fonksiyon en çok 30 - 35 satırdan oluşmalı. Bir kişi ekrana baktığında tüm kodu ekrana sığmış bir halde görebilmeli.
  2. Fonksiyonda argüman olarak kullanılan değişkenler 3'ü geçmemeli.
  3. Fonksiyona anlaşılması zor olacak yerlere gerekli açıklamalar eklenmeli.
  4. Fonksiyonu oluşturduktan sonra test etmelisiniz.
Test etme aşamasında ise yazdığınız kod parçasının çalıştığından emin olup onu tekrar kullabilmeniz içindir. Burada kod parçasını tes etmeniz için farklı test adında bir header oluşturulur. C için bahsetmeh gerekirse test.h oluşturulur ve kod parçası bağımsız bir şekilde test edilir. 

İlk duyduğum zaman ben çok şaşırmıştım ama bu ortalama değerler gerçekten işlerinize çok yardımcı oluyor. Fonksiyonunuzu ne kadar çok kullanılırsanız işiniz o kadar kolaylaşıyor.

Kaynaklar:

  1. http://www.labri.fr/perso/casteran/distribC/reuse.pdf
  2. http://link.springer.com/chapter/10.1007/978-3-642-31063-8_8
  3. http://www.mcs.vuw.ac.nz/comp/Publications/archive/CS-TR-93/CS-TR-93-12.pdf
  4. http://hoskinator.blogspot.com/2006/06/10-tips-on-writing-reusable-code.html
  5. http://asg.unige.ch/site/papers/Dami91a.pdf
  6. http://en.wikipedia.org/wiki/Code_reuse
  7. http://en.wikipedia.org/wiki/Separation_of_concerns
  8. http://www.cs.toronto.edu/~yijun/ece450h/handouts/lecture8x4.pdf
  9. https://docs.google.com/viewer?a=v&q=cache:uubjrGeL7xwJ:citeseerx.ist.psu.edu/viewdoc/download%3Fdoi%3D10.1.1.83.7716%26rep%3Drep1%26type%3Dpdf+&hl=tr&gl=tr&pid=bl&srcid=ADGEESgy42vY1Wd2RpfyPrDux0cljsae6352LLFurVxjZ4jfzVuqtLR6399kyDFIu9AYXgtO8wcKUav0xZBfDYecvlcja7J_QLetk7xmxv3NYdOuBRh6e31Tw2r9O-oaAT7K31iEc3f2&sig=AHIEtbRn01c5aPmdNFSCh4aSPragNS-aew
  10. http://www.cs.toronto.edu/pub/eric/CAiSE05.pdf







Hiç yorum yok:

Yorum Gönder