Program Karmaşıklığı Nedir ? Nasıl Ölçülür ? McCabe Karmaşıklık Ölçütü Nedir ?





Program Karmaşıklığı 
  
 
 Karmaşıklık, yazılımın kalitesini düşürmenin temel bir nedeni olduğundan yazılımda istenmeyen bir özellik olarak kabul edilir. Karmaşık yazılımlardan kaçınmak için yazılımları test etmek üzere karmaşıklık ölçütleri büyük önem arz eder. 

 Yazılımın yaşam döngüsünde aşamalar arası geçişler olabildiğinden yazdığımız kodun sonradan anlaşılması çok önemlidir. Karmaşıklık yazılımın anlaşılmasını ve okumasını zorlaştırdığından ayrıca sonradan değiştirmenin zahmetli olabiliceği için genellikle yazılımda istenmeyen bir özelliktir. Yazılımın kalitesi yazılımın karmaşıklığıyla ters oranda artmaktadır. Kaliteli yazılım kolayca anlaşılabilir, kolayca bakımı yapılabilir, anlaşılabilir, iyi yapılandırılmış sistemlerdir.
 
        Karmaşıklık Analizi Nasıl Yapılır ?
 
 Yazılım karmaşıklığı ölçütleri neredeyse yazılım mühendisliği kadar eskidir. İlk geliştirilen Lines of Code (Kod Satırları) yönteminden sonra yazılımların karmaşıklığını ölçmek için bir çok yöntem geliştirilmiştir. Bu yöntemler en temelde ikiye ayrılır.

1.Quantitative Yöntemler (Nicel, Sayısal) 
    Bu yönteme ait karmaşıklık ölçütleri kodun sayısal olarak karateristik yapısını analiz ve hesaplayarak sonuca ulaşır.

1.1.Source Lines of Code ( SLOC)
SLOC en eski, yaygın olarak kullanılmıştır ve en basit yöntem olarak görülür. Ölçüm yapılırken programın kaynak kodlarının satır sayısı hesaplanır. Bu yöntem ilk olarak bir proje için insan gücünü yaklaşık hesaplamak için geliştirilmiştir. Aslında en temelde Lines of Code (Kod Satırları – LOC) olarak adlandırılan bu yöntem yorum satırları ve boş satırları da içermektedir. Efektif olarak adlandırılan ELOC (Effective Lines of Code) ise koddaki boş olan ve yorum satırlarını hesaplarken dahil etmez. 
Üretkenlik = LOC/Person months
Kalite = Kusurlar / LOC
Masraf = $ / LOC
Bazı LOC değerleri için öneriler:
-Bir dosyanın uzunluğu 4 ila 400 satır
-Fonksiyon uzunluğu 4 ile 40 satır
-Dosyanın içrerisinde en az % 30 en fazla % 75 yorum satırı olmaktadır.
 İlk zamanlarda çokça kullanılıp kabul görse de artık neredeyse ufak projeler hariç kulanılmayan bir sistemdir. Ayrıca bu hesaplamalar programlama dillerine göre farklılık göstereceği için hesaplamalarda yanılmalar olabilir. Bir dezavantajı ise yazılım son aşamaya gelmeden bir LOC hesaplanamaz. Yazılım yaşam döngüsünde önemli zorluklar çıkarabilir.

1.2.ABC Metric
 
ABC ismi 3 ifadeyi temsil etmektedir. Jerry Fitzpatrick tarafından 1997'de geliştirilen bu yöntem SLOC ve diğer yöntemlerin dezavantajlarını giderme amacıyla geliştirilmiştir.

Assignment - > Değişken atama işlemleri
Branch -> Fonksiyon çağrıları
Condition -> If – else gibi koşul ifadeleri
Bu değerlerin bir yazılım için elde ettiğimizi düşünürsek örneğin ABC = <5, 13, 4> için
    |ABC| = sqrt ((A*A) + (B*B) + (C*C)) 
 şeklinde bir hesaplama yapılır.

ABC <= 10 durumu sistemin çok iyi bir durumda olduğunu gösterir
ABC <= 20 olduğunda sistemin ideal olduğunu anlayabiliriz
ABC değeri artık 21 ila 60 arasında ise kod yeniden düzenlenmelidir. 61'den yüksek durumlar kabul edilemez olarak ifade edilir.

Avantajları olarak kolayca hesaplanabilir olması ve yazılımcının kod yazım tarzının bir anlam ifade etmemesi (bağımlı olmaması) olarak gösterilebilir. Diğer yandan ABC yöntemi her ne kadar programın boyutu hakkında bir fikir verse de gerçek ölçüsünü yansıtmaz. Program birkaç kod içerse de kodun bir külfeti olmadığından ABC değeri bize 0 olarak dönebilir.

 1.3.Halstead'ın Karmaşıklık Ölçütleri
 
    Maurice Halstead tarafından 1977'de geliştirilmiştir. SLOC yönteminin dezavantajlarını gidermek için tasarlanmıştır. Yöntemin temelinde yine bir hesaplama yatmaktadır.Hesaplama yaparken kullanacağımız değerler programdaki operatör ve operand sayılarıdır.

n1 = Programdaki operatör sayısı ( her operatör bir kere sayılıcak)
n2 = Programdaki operand sayısı (her operand bir kere sayılıcak)
N1 = Programdaki toplam operatör sayısı
N2 = Programdaki toplam operand sayısı

Örnekten de görüleceği üzere operand ve operatör sayıları fonksiyon tanımları için anlam ifade etmez. Hesaplarken onları görmezden geliriz.Ardında operatör ve operandlar tek tek sayılarak değerler hesaplanır. Bu 4 değer ile bir çok özellik anlamlandırılabilir. Bunlardan bir kaçı:
Program Sözlüğü : programdaki eşsiz olarak kullanılan operatör ve operand sayıları n = n1 + n2
Program uzunluğu : N = N1 + N2
Programın Hacmi : V=N*log2(n)
Programın Zorluğu : D = (n1/2)*(N2/n2)
Buna benzer birkaç daha özellik hesaplanabilir.

            

 Halsted'in bu geliştirdiği yöntem hesaplanması kolay ve derin bir analiz gerektirmediğinden basitçe uygulanabilir. Programın kalitesi kapsamlı olarak bir şekilde ölçülebilir. Bu yöntemin en büyük zorluklarından biriyse operand ve operatörleri birbirinden ayırmaktır. Ayrıca bu metod programın modüller arası iletişimi ve yapısı hakkında bilgi vermez.

 Quantitive Yöntemlere baktığımızda genellikle basitçe programın boyutunu hesaplayarak bunun üzerinden bir karmaşıklık ölçütü çıkarmaktayız. Ayrıca bu ölçüm teknikleri bize karmaşıklık hakkında her zaman tamamen garanti bir sonuç vermeyebilir. Örnek olursa bir fonkisyon gereksiz uzunlukta ve bir çok döngüye sahip olup kendisinden daha büyük uzunlukta olan bir fonksiyondan karmaşık olabilir. 
2.Yapısal Karmaşıklık Ölçme Yöntemleri 
 
 Açıktır ki sistemin karmaşıklığı ile boyutu arasındaki bağlantı basit bir durum değildir. Karmaşıklığı hesaplamak için farklı noktalardan programı incelemek gerekir. Yapısal karmaşıklık ölçme yöntemler 2 alt dala ayrılır (control flow graph ve data flow graph) ve genel olarak birkaç yöntem bilinmektedir.

2.1 McCabe Ölçütü 
 
 Bunlardan en bilineni Thomas McCabe tarafından geliştirilen Cyclomatic Complexity olarak da bilinen karmaşıklık ölçütünü inceleyeceğiz.McCabe karmaşıklık ölçütü en eski yöntemlerden biri olmakla birlikte gelecekte geliştirilecek yöntemlerde büyük katkısı olmuştur. Bu yöntem kontrol akışı graflarının bir örneği olarak gösterilir. Kontrol akışı grafları software modüllerinin mantıksal olarak ifade edilmesidir. Bu modül bir fonksiyona denk gelebilirken bir alt yordam olarak da ifade edilebilir. Modülün bir giriş ve bir çıkış noktası olmalıdır. Her akış grafı birçok düğüm (node) ve kenar (edge) içerir. Düğümler bir ya da birden fazla sıradan ardışık işlemi ifade etmektedir.
 
Bu verilen bilgilerden sonra selection sort için bu uygulamaları yaparsak:
Selection sort için çizilen grafın karmaşıklığını şu şekilde hesaplamak mümkün. 
CC = E – N + 2.P
E = kenar sayısı
N = düğüm sayısı
P = program sayısı ( tek program olduğu sürece bir alınmalıdır)
CC = 9 - 7 + 2.1 = 4 
Bize karmaşıklığı vericektir.

Kaynakça:
Ayman Madi, Oussama Kassem Zein and Seifedine Kadry
On the Improvement of Cyclomatic Complexity Metric 
   in International Journal of Software Engineering and Its Applications Vol. 7,No. 2, March, 2013
https://en.wikipedia.org/wiki/Programming_complexity




Yorumlar

Bu blogdaki popüler yayınlar

Execution failed for task ':flutter_blue:generateDebugProto'. > Could not resolve all files for configuration ':flutter_blue:protobufToolsLocator_protoc'.

Algoritma Karmaşıklığı Nedir ? Zaman ve Hafıza Karmaşıklığı Nedir ? Nasıl Hesaplanır ?