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 monthsKalite = Kusurlar /
LOC
Masraf = $ / LOC
-Bir dosyanın uzunluğu 4 ila 400 satır
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, 2013https://en.wikipedia.org/wiki/Programming_complexity



Yorumlar
Yorum Gönder