5 dk okuma

Kod Karmaşasını Çözmenin Anahtarı: Cyclomatic Complexity

9 Ekim 202118:20

Cyclomatic Complexity Nedir?

Her yazılımcı geliştirme yaparken, temiz, okunabilir ve sürdürülebilir bir kod üretmek ister. Ancak, zamanla projeler büyüdükçe, kod tabanı karmaşık hale gelebilir. Bir noktada, kodun anlaşılması ve değiştirilmesi zor bir hal alır. İşte burada Cyclomatic Complexity devreye girer.

Belki de ismini daha önce duymuş olabilirsiniz veya tamamen yeni bir kavram olabilir. Her ne olursa olsun, kodlarımızın karmaşıklığını anlamak için oldukça önemli bir metrik olan Cyclomatic Complexity'nin ne olduğunu ve neden önemli olduğunu keşfedeceğiz.

Cyclomatic Complexity, bir programın veya fonksiyonun karmaşıklığını ölçen bir metrik olarak tanımlanır. Bu metrik, kodun yapısını ve içerdiği akış kontrolü ifadelerini analiz eder. Cyclomatic Complexity sayısı, bir programın içerdiği bağımsız yol sayısını temsil eder. Bu yollar, programın if koşulları, döngüler, döngü çıkışları (bkz: break) gibi kontrol akışı ifadeleri tarafından belirlenir.

Cyclomatic Complexity Formülü

M = E – N + 2P

M = Cyclomatic Complexity

E = kontrol akış grafiğindeki kenar sayısı

N = kontrol akış grafiğindeki düğüm sayısı

P = bağlantılı bileşenlerin sayısı

Formülün anlamı ise şu şekildedir:

Cyclomatic Complexity (M), kontrol akış grafiğindeki kenar sayısı (E) ile düğüm sayısı (N) arasındaki farka (E - N) ve bağlantılı bileşenlerin sayısının iki katına (2P) eşittir.

Geeksforgeeks
["Cyclomatic Complexity", Geeksforgeeks](https://www.geeksforgeeks.org/cyclomatic-complexity/)

Yukarıdaki kod için hesaplanan Cyclomatic Complexity, kontrol akış grafiğinden elde edilir. Grafik yedi şekil (node) ve yedi çizgi (kenar/edge) gösteriyor. Dolayısıyla, Cyclomatic Complexity 7-7+2 = 2 olacaktır.

Cyclomatic Complexity'nin önemi nedir?

Bu metrik, yazılımın test edilebilirliğini ve bakımını kolaylaştırır. Karmaşık bir kod tabanı üzerinde çalışırken, tüm olası yolları test etmek zor olabilir. Cyclomatic Complexity, bir fonksiyonun içerdiği yolları sayarak, test senaryolarını belirlememize yardımcı olur. Aynı zamanda, karmaşık kodların anlaşılmasını kolaylaştırır ve kod tabanını daha sürdürülebilir hale getirir. Daha düşük bir Cyclomatic Complexity değeri, daha basit ve anlaşılır bir kod tabanına işaret eder.

Tabii ki, Cyclomatic Complexity tek başına kod kalitesini belirlemek için yeterli bir metrik değildir. Diğer metrikler, kodun okunabilirliği, modülerliği ve performansı gibi diğer yönleri de dikkate almak önemlidir. Ancak, Cyclomatic Complexity'nin karmaşıklık düzeyini değerlendirmede faydalı bir araç olduğunu unutmamalıyız.

Cyclomatic Complexity'nin nasıl hesaplandığını basit bir fonksiyon ile örneklendirelim (Java):

java
1public class NumberChecker {
2  public static void main(String[] args) {
3    int number = 10;
4    isEven(number);
5  }
6
7  public static void isEven(int number) {
8    if (number % 2 == 0) {
9      System.out.println("Even");
10    } else {
11      System.out.println("Odd");
12    }
13  }
14}

Yukarıda, NumberChecker classında "isEven" fonksiyonu var. Bu metot, bir sayının çift veya tek olduğunu kontrol eder ve sonucunu ekrana basar. Bu fonksiyonun Cyclomatic Complexity değerini hesaplamak için, içerdiği kontrol akışı ifadelerini saymamız gerekiyor. Bu durumda, fonksiyonun sadece bir adet if-else ifadesi bulunuyor. Dolayısıyla, Cyclomatic Complexity değeri 1 olacaktır.

Başka bir örnek daha verecek olursam (Java):

java
1public void calculateGrade(int score) {
2  if (score >= 90) {
3    System.out.println("A");
4  } else if (score >= 80) {
5    System.out.println("B");
6  } else if (score >= 70) {
7    System.out.println("C");
8  } else if (score >= 60) {
9    System.out.println("D");
10  } else {
11    System.out.println("F");
12  }
13}

Bu örnekte de basit bir "calculateGrade" fonksiyonumuz var, girdi olarak puan alıyor ve bu puana karşılık gelen harf notunu ekrana yazdırıyor. Bu örnekte, score adlı bir değişkenin değerine göre öğrencinin aldığı notu belirliyoruz.

İlk if ifadesi, score'un 90 veya daha büyük olup olmadığını kontrol eder. Eğer bu koşul sağlanırsa, "A" notunu ekrana basar. Eğer sağlanmazsa, bir sonraki else if ifadesine geçer ve score'un 80 veya daha büyük olup olmadığını kontrol eder. Bu şekilde devam eder ve her bir else if ifadesi, bir sonraki not aralığını kontrol eder. Son olarak, hiçbir koşul sağlanmazsa else bloğu çalışır ve "F" notunu ekrana basar.

Bir önceki örnekte olduğu gibi, Cyclomatic Complexity değerini hesaplamak için, metodun içindeki koşul/kontrol ifadelerini saymamız gerekiyor. Bu örnekte toplam 6 adet kontrol akışı yolu (control flow) bulunuyor: 5 adet if ve else if ifadesi ve 1 adet else ifadesi mevcut. Bu durumda, Cyclomatic Complexity değeri 6 olacaktır.

Sonuç

Sonuç olarak, Cyclomatic Complexity, bir programın veya fonksiyonun karmaşıklığını ölçen önemli bir metriktir. Kodun yapısını ve içerdiği kontrol akışı ifadelerini analiz ederek bağımsız yol sayısını belirler. Bu metrik, kodun test edilebilirliğini artırır, anlaşılabilirliğini ve sürdürülebilirliğini iyileştirir. Daha düşük bir Cyclomatic Complexity değeri, daha basit ve anlaşılır bir kod tabanına işaret eder. Ancak, Cyclomatic Complexity tek başına yeterli değildir ve diğer kod kalitesi metrikleriyle birlikte değerlendirilmelidir. Karmaşık kod tabanları üzerinde çalışırken, Cyclomatic Complexity hesaplama yöntemini anlamak ve bu metriği kullanmak, daha iyi bir yazılım geliştirme pratiği için önemlidir.


Referanslar

Bu yazıyı paylaş

Link kopyalandı!
Mustafa Kürşad Başer

Mustafa Kürşad Başer

Yazılım Mühendisi — Dijital Zanaatkâr

Karmaşık sorunlara zarif çözümler üretmekten keyif alan, tutkulu bir yazılım mühendisi. Kodlamanın ötesinde, teknoloji, sanat ve insan bilincinin kesişim noktalarını keşfetmekle derinden ilgileniyor.

© 2025 Mustafa Kürşad BAŞER. Tüm hakları saklıdır.

Çerez Tercihleri

Size daha iyi bir deneyim sunabilmek için çerezleri kullanıyoruz. Analitik ve reklam amaçlı çerezler hakkında detaylı bilgi için ayarları özelleştirebilirsiniz.