py-metrics

PyMetrics Metrik Sözlüğü

Bu belge PyMetrics’in ürettiği metrikleri Türkçe ve uygulamadaki gerçek çıktı sırasıyla açıklar. Amaç, CSV raporlarında ve arayüzde görülen sayıların ne işe yaradığını, nereden geldiğini, nasıl hesaplandığını ve nasıl okunması gerektiğini tek bir referans dosyasında toplamaktır.

Nasıl okunmalı?

Metrikler tek başına hüküm değildir; işaret fişeğidir. Yüksek veya düşük bir değer çoğu zaman “bu kod kötü” değil, “buraya önce bak” demelidir. En sağlıklı yorumlar genelde metrik ailelerini birlikte okuyunca çıkar: cc_max + revisions, volume + mi_score, wmc + lcom, fan_out + cbo gibi.

Üretilen Raporlar

PyMetrics bir analiz sonunda dört CSV dosyası ve hepsini içeren bir ZIP üretir.

Dosya Seviye Ne anlatır?
metrics_file.csv Dosya Her Python dosyasının boyut, karmaşıklık, Halstead, Git geçmişi, Pylint ve import metrikleri.
metrics_class.csv Sınıf Her sınıf için nesne yönelimli CK metrikleri ve sınıf içi karmaşıklık özetleri.
metrics_function.csv Fonksiyon/metot Her fonksiyon veya metot için satır aralığı, cyclomatic complexity ve Halstead metrikleri.
metrics_summary.csv Proje Dosya, sınıf ve fonksiyon metriklerinden türetilmiş depo geneli özetler.

Kök Kaynaklar

Metrik ailesi Kimden / nereden geliyor? PyMetrics’teki kaynak
Satır ve ham boyut metrikleri Tek bir mucidi yoktur; yazılım ölçümünün en eski ve en temel metriklerindendir. PyMetrics hesaplama için Radon’un raw analizini kullanır. backend/app/services/radon_service.py
Cyclomatic Complexity Thomas J. McCabe, 1976. Kontrol akışı grafiğindeki bağımsız yol sayısını ölçer. Radon cc_visit, cc_rank
Maintainability Index Paul Oman ve Jack Hagemeister’in 1992 çalışmasıyla yaygınlaşan, daha sonra Coleman ve arkadaşlarının 1994 çalışmaları ve Visual Studio/SEI türevleriyle kullanılan bileşik endeks. Radon mi_visit
Halstead Software Science Maurice H. Halstead, 1977. Programı operatörler ve operandlar üzerinden ölçer. Radon h_visit
CK nesne yönelimli metrikleri Shyam R. Chidamber ve Chris F. Kemerer, 1994. İlk çekirdek set: WMC, DIT, NOC, CBO, RFC, LCOM. PyMetrics AST yürüyücüsü
Git süreç metrikleri Mining Software Repositories alanındaki süreç/churn ölçümlerine dayanır; tek bir mucide indirgenmez. PyDriller + Git geçmişi
Pylint metrikleri Pylint/PyCQA ekosisteminin mesaj kategorileri ve skorlaması. pylint --output-format=json
Import ve AST türevleri Python ast modülüyle PyMetrics’in yerel sınıflandırma mantığı. PyMetrics AST import sınıflandırıcısı

Ortak Kolonlar

Bu kolonlar metrik değil, her satırın hangi analizden geldiğini anlatan bağlam kolonlarıdır. Dosya, sınıf, fonksiyon ve özet raporlarında farklı alt kümelerle görünürler.

Kolon Nerede var? Anlamı
repo_url Tüm CSV’ler Analiz edilen GitHub deposunun URL’si.
repo_name Tüm CSV’ler URL’den çıkarılan depo adı.
commit_hash Tüm CSV’ler Analiz edilen commit SHA’sı. Branch/tag verilse bile sonuçta checkout edilen commit’i sabitler.
analysis_date Tüm CSV’ler Analizin oluşturulma zamanı.
granularity Dosya/sınıf/fonksiyon CSV’leri Satırın seviyesini belirtir: file, class, function.
file_path Dosya/sınıf/fonksiyon CSV’leri Worker makinedeki mutlak dosya yolu. Paylaşılabilir veri setlerinde genelde relative_path daha kullanışlıdır.
relative_path Dosya/sınıf/fonksiyon CSV’leri Depo köküne göre göreli dosya yolu. Karşılaştırma ve filtreleme için ana kolonlardan biridir.
class_name Sınıf/fonksiyon CSV’leri Sınıf satırında ilgili sınıfın adı; fonksiyon satırında metot ise ait olduğu sınıf, top-level fonksiyon ise boş olabilir.
function_name Fonksiyon CSV’si Fonksiyon veya metot adı.
start_line, end_line Fonksiyon CSV’si Fonksiyon/metot bloğunun dosya içindeki başlangıç ve bitiş satırı.

metrics_file.csv

Dosya seviyesi rapor, PyMetrics’in en geniş tablosudur. Aşağıdaki sıra CSV kolon sırasını takip eder.

Ham Boyut ve Yorum Metrikleri

Bu grup Radon’un ham metriklerinden gelir. Kod kalitesini doğrudan yargılamak için değil, diğer metrikleri ölçeklemek ve dosya büyüklüğünü anlamak için kullanılır.

Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
loc Fiziksel kod hacmini verir. İnceleme kapsamı ve dosya büyüklüğü için ilk bağlamdır. Radon analyze(source).loc. Toplam satır sayısıdır; boş ve yorum satırları da bu ölçeğin parçasıdır. Tek başına kalite göstergesi değildir. Büyük dosya riskli olabilir ama bazen veri şeması, sabitler veya basit yapılandırma da büyük görünür.
sloc Gerçek kaynak satırı yoğunluğunu gösterir. Source Lines of Code: yorum ve boş satırlardan arındırılmış kaynak satırı yaklaşımı. loc yüksek ama sloc makulse dosya bol açıklama veya boşluk içeriyor olabilir. sloc yüksekse bakım yüzeyi büyür.
lloc Biçimlendirmeden daha az etkilenen mantıksal satır sayısıdır. Logical Lines of Code: Python ifadelerini mantıksal birim olarak sayar. Çok satırlı ifadeler yüzünden fiziksel satır sayısı şişiyorsa daha adil bir karşılaştırma sağlar.
cloc Yorum yoğunluğunu anlamak için kullanılır. Radon’un comment line sayısı. Python’da her çok satırlı string gerçek yorum sayılmaz; Radon ayrımı kendi kurallarına göre yapar. Karmaşık dosyada cloc çok düşükse öğrenme ve refactor maliyeti artabilir. Çok yüksekse yorumların güncelliği ayrıca kontrol edilmelidir.
blank Format ve okunabilirlik bağlamı verir. Boş veya sadece whitespace içeren satır sayısı. Kalite sinyali değildir; loc, sloc, lloc farkını açıklamaya yardım eder.
comments_ratio Dosyanın ne kadarının yorum olduğunu gösterir. PyMetrics’te cloc / loc; loc yoksa 0.0. Değer 0 ile 1 arasında okunur. 0.12 yaklaşık yüzde 12 yorum oranı demektir. En iyi kullanım cc_max, volume, mi_score ile birlikte okumaktır.

Cyclomatic Complexity ve Yapısal Sayımlar

Cyclomatic Complexity, Thomas J. McCabe’in 1976’da tanıttığı kontrol akışı karmaşıklığı ölçüsüdür. Bir bloktaki bağımsız yürütme yollarını saymaya çalışır. Radon pratikte if, elif, döngüler, except, with, assert, comprehension ve boolean operatörler gibi karar noktalarıyla bu sayıyı artırır.

Basit okuma: cyclomatic complexity ~= karar noktası sayısı + 1
Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
cc_mean Dosyadaki fonksiyon/metotların ortalama dallanma karmaşıklığı. Radon’un bulduğu fonksiyon/metot CC değerlerinin aritmetik ortalaması. Ortalama düşük olsa bile cc_max yüksekse tek bir sorunlu fonksiyon olabilir.
cc_max Dosyadaki en karmaşık fonksiyon/metodu bulmaya yarar. Fonksiyon/metot CC değerlerinin maksimumu. Refactor ve test önceliği için en güçlü dosya seviyesi CC sinyallerinden biridir.
cc_min En basit fonksiyon/metot karmaşıklığını gösterir. Fonksiyon/metot CC değerlerinin minimumu. Genelde destekleyici bağlamdır; tek başına aksiyon üretmez.
cc_sum Dosyanın toplam kontrol akışı yükünü verir. Fonksiyon/metot CC değerlerinin toplamı. Çok sayıda orta karmaşıklıkta fonksiyon içeren dosyalar cc_sum ile görünür hale gelir.
cc_rank Ortalama karmaşıklığı harf notuna çevirir. PyMetrics dosya seviyesinde cc_mean değerini Radon cc_rank ile derecelendirir. A iyi, F çok riskli olarak okunur; ama rank bir özet olduğu için alt metriklere bakılmalıdır.
num_functions Top-level fonksiyon sayısını verir. Radon bloklarından sınıfa bağlı olmayan Function sayısı. Modülün işlevsel yoğunluğunu gösterir. Çok fonksiyon her zaman kötü değildir; sorumluluk dağılımıyla birlikte okunur.
num_classes Dosyadaki sınıf sayısı. Radon bloklarından Class sayısı. CK metriklerinin yorumlanması için bağlam sağlar.
num_methods Sınıflara bağlı metot sayısı. Radon sınıf/metot bloklarından metot sayımı. Yüksek değer sınıf yoğunluğu veya geniş API yüzeyi gösterebilir.

Radon’un CC harf aralıkları:

CC değeri Rank Risk okuması
1-5 A Düşük risk, basit blok.
6-10 B Düşük risk, genelde iyi yapılandırılmış blok.
11-20 C Orta risk, test senaryoları artar.
21-30 D Yüksekçe risk, refactor adayı olabilir.
31-40 E Yüksek risk, alarm sinyali.
41+ F Çok yüksek risk, hata ve test maliyeti artar.

Maintainability Index

Maintainability Index, boyut, cyclomatic complexity, Halstead volume ve yorum sinyalini tek bir skora sıkıştıran bileşik bir metriktir. Kökeni Oman ve Hagemeister’in maintainability çalışmalarına dayanır; Radon bu ailenin kendi türevini uygular.

Radon’un kullandığı genel form:

MI = max(0, 100 * (171 - 5.2 ln(V) - 0.23 G - 16.2 ln(L)
                  + 50 sin(sqrt(2.4 C))) / 171)

Burada V Halstead volume, G toplam cyclomatic complexity, L SLOC ve C yorum yüzdesidir.

Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
mi_score Bakım yapılabilirliği tek skorla özetler. PyMetrics radon.metrics.mi_visit(source, multi=True) çağırır ve skoru iki ondalığa yuvarlar. Yüksek daha iyidir. Düşük skor gördüğünüzde sebebi anlamak için loc/sloc, cc_*, volume ve comments_ratio değerlerine geri dönün.
mi_rank MI skorunu kaba harf sınıfına indirger. PyMetrics kodunda A >= 20, B >= 10, aksi C. Bu rank Radon/Visual Studio ölçeklerinden daha kaba bir triage etiketidir; karar mekanizması olarak tek başına kullanılmamalıdır.

MI hakkında dikkat

Maintainability Index pratik dashboardlarda faydalıdır ama deneysel ve tartışmalı bir metriktir. “Bu dosya bakılamaz” demek yerine “neden düşük çıkmış?” sorusunu başlatmak için kullanın.

Halstead Software Science

Maurice H. Halstead’in 1977’de önerdiği bu aile, programı operatörler ve operandlar üzerinden ölçer. PyMetrics hem dosya seviyesinde hem fonksiyon seviyesinde aynı kolon adlarını kullanır.

Kolon Ne işe yarar? Formül / hesaplama Nasıl okunur?
h1 Farklı operatör çeşitliliğini gösterir. Distinct operators: Radon’un AST üzerinden bulduğu benzersiz operatör sayısı. Daha yüksek değer daha geniş işlem çeşitliliği demektir.
h2 Farklı operand/kavram çeşitliliğini gösterir. Distinct operands: benzersiz değişken, literal veya operand sayısı. Çok yüksekse fonksiyon/dosya çok fazla kavramı aynı yerde taşıyor olabilir.
n1 Operatör tekrar yoğunluğunu gösterir. Total operators: operatörlerin toplam geçiş sayısı. h1 ile birlikte okunur; az çeşit ama çok tekrar farklı bir kod kokusu olabilir.
n2 Operand tekrar yoğunluğunu gösterir. Total operands: operandların toplam geçiş sayısı. Veri/kavram yoğunluğunu anlamaya yardım eder.
vocabulary Halstead sözlüğü. h1 + h2. Kodun sembolik kelime haznesi büyüdükçe anlama maliyeti artabilir.
length Halstead uzunluğu. n1 + n2. Fiziksel satırdan bağımsız token benzeri büyüklük sinyalidir.
calculated_length Teorik program uzunluğu. h1 * log2(h1) + h2 * log2(h2). Daha çok araştırma ve tutarlılık bağlamında kullanılır; tek başına karar metriği değildir.
volume Kodun bilgi hacmini tahmin eder. length * log2(vocabulary). Yüksek volume daha fazla bilişsel yük anlamına gelebilir ve MI formülüne doğrudan girer.
difficulty Kodun anlama/yazma zorluğu için göreli sinyal. (h1 / 2) * (n2 / h2). Aynı dil ve aynı araç zinciri içinde karşılaştırılmalıdır.
effort Zorluk ve hacmi birleştirir. difficulty * volume. Göreli bakım eforu göstergesidir; gerçek insan-saat tahmini gibi okunmamalıdır.
time Halstead’in tarihsel efor-zaman dönüşümü. effort / 18 saniye. Literatür uyumluluğu için saklanır; gerçek geliştirme süresi değildir.
bugs_halstead Tarihsel hata tahmini. volume / 3000. Kesin bug sayısı değildir. Risk sıralaması veya model girdisi olarak dikkatli kullanılmalıdır.

Halstead’i iyi kullanma yolu

volume, difficulty ve effort değerlerini mutlak doğru gibi değil, aynı proje veya aynı veri toplama hattı içindeki göreli sıralama gibi okuyun.

Git Geçmişi ve Süreç Metrikleri

Bu grup statik kodun bugün nasıl göründüğünü değil, dosyanın geçmişte ne kadar değiştiğini anlatır. PyMetrics bu değerleri PyDriller ile Git geçmişinden çıkarır.

Shallow clone etkisi

CLONE_SHALLOW=true ise depo geçmişi indirilmez. Bu durumda Git geçmişi metrikleri boş kalabilir. Süreç metrikleri gerekiyorsa tam geçmiş gerekir.

Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
age_days Dosyanın depodaki yaşını verir. Dosyayı ilk kez etkileyen commit tarihinden analiz zamanına kadar geçen gün. Yeni dosya yüksek churn ile birlikte riskli olabilir; çok eski ama sürekli değişen dosya da hotspot olabilir.
revisions Dosyanın kaç commit’te değiştiğini gösterir. PyDriller commit gezisinde dosyaya dokunan commit sayısı. cc_max veya wmc yüksekse, yüksek revisions bakım aciliyetini artırır.
authors Dosyaya dokunan farklı kişi sayısı. Commit author adlarının benzersiz sayısı. Çok yazar geniş sahiplik veya koordinasyon maliyeti gösterebilir. Kimlik değil sayı ihraç edilir.
avg_loc_added Ortalama eklenen satır churn’ü. Dosyaya dokunan commit’lerdeki toplam eklenen satır / revisions. Yüksek değer dosyanın sık büyüdüğünü veya yeniden yazıldığını gösterebilir.
avg_loc_deleted Ortalama silinen satır churn’ü. Dosyaya dokunan commit’lerdeki toplam silinen satır / revisions. avg_loc_added ile birlikte yüksekse dosya kararsız veya aktif refactor altında olabilir.

Pylint Metrikleri

Pylint metrikleri, kodun linter tarafından nasıl görüldüğünü anlatır. PyMetrics tekrar üretilebilirlik için proje rcfile’ını devre dışı bırakır, import-error ve no-name-in-module mesajlarını kapatır, sonucu JSON olarak okur ve skoru 0-10 aralığında saklar.

Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
pylint_score Genel lint skorudur. Pylint’in “rated at X/10” skorundan iki ondalığa yuvarlanır. Yüksek daha iyidir. Ancak skorun neden düştüğünü anlamak için kategori sayıları incelenmelidir.
pylint_errors Hata seviyesindeki bulgular. JSON mesajlarında type == "error" sayısı. En aksiyon alınabilir Pylint kovasıdır; olası doğruluk problemlerine bakılır.
pylint_warnings Uyarı seviyesindeki bulgular. JSON mesajlarında type == "warning" sayısı. Riskli örüntüler veya muhtemel problemler için triage sinyalidir.
pylint_conventions Stil ve konvansiyon bulguları. JSON mesajlarında type == "convention" sayısı. Kod standardı ve okunabilirlik borcu olarak okunur; genelde error kadar kritik değildir.
pylint_refactors Refactor önerileri. JSON mesajlarında type == "refactor" sayısı. Sadeleştirme ve tasarım iyileştirme adaylarını gösterebilir.

Import ve Bağımlılık Metrikleri

Bu grup Python AST’sindeki import ve from ... import ... düğümlerinden üretilir. Amaç dosyanın bağımlılık yüzeyini ve dış/iç bağlantı yoğunluğunu yakalamaktır.

Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
imports_count Toplam import yoğunluğunu verir. import a, b içinde her alias sayılır; from x import a, b tek ImportFrom düğümü olarak sayılır. Çok import entegrasyon/orchestrasyon kodu anlamına gelebilir; her zaman kötü değildir.
stdlib_imports Standart kütüphane bağımlılıklarını ayırır. Top-level modül adı sys.stdlib_module_names içinde ise standart kütüphane sayılır. Genelde üçüncü parti bağımlılıktan daha düşük operasyonel risk taşır.
third_party_imports Harici paket yüzeyini gösterir. Standart kütüphane ve proje içi sayılmayan importlar. Yüksek değer dependency yönetimi, sürümleme veya supply-chain yüzeyi anlamına gelebilir.
internal_imports Proje içi bağımlılığı gösterir. Proje kökündeki paketler ve top-level .py modülleriyle eşleşen importlar. Mimari bağlılık ve modül sınırları için fan_out ile birlikte okunur.
fan_out Dosyanın kaç farklı modüle baktığını özetler. Benzersiz top-level import modül adı sayısı. Yüksek fan-out bazen doğal bir koordinatör dosyadır, bazen aşırı coupling işaretidir. Dosyanın rolüyle birlikte yorumlanır.

metrics_class.csv

Sınıf seviyesi rapor, PyMetrics’in AST tabanlı CK uyarlamasıdır. Analiz iki geçişlidir: önce tüm sınıflar proje çapında kayıt edilir, sonra her sınıf için kalıtım, metotlar, alanlar ve çağrılar hesaplanır.

CK ve PyMetrics Sınıf Metrikleri

Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
wmc Sınıfın test ve bakım ağırlığını gösterir. Weighted Methods per Class: sınıftaki metotların cyclomatic complexity toplamı. CC yoksa metot başına 1 varsayılır. Yüksek WMC, sınıfın fazla davranış taşıdığını ve test yüzeyinin büyüdüğünü gösterebilir.
dit Kalıtım derinliğini ölçer. Depth of Inheritance Tree: proje içinde çözülebilen parent zinciri sayılır; proje dışı parent object, Exception, BaseException değilse derinlik 1 kabul edilebilir. Derin kalıtım gizli davranış ve debug maliyeti yaratabilir. Framework sınıflarında bağlam önemlidir.
noc Bir sınıfın kaç doğrudan çocuğu olduğunu gösterir. Number of Children: proje içinde bu sınıftan doğrudan türeyen sınıf sayısı. Yüksek NOC, base class değişikliklerinin çok yere yayılabileceğini gösterir.
cbo Sınıfın proje içi coupling yüzeyini ölçer. Coupling Between Objects: metot gövdelerinde referans verilen benzersiz proje sınıfı sayısı. Yüksek CBO değişiklik dalgası ve test bağımlılığı riskini artırabilir.
rfc Sınıfa gelen bir mesajın tetikleyebileceği davranış alanını tahmin eder. Response For a Class: sınıfın kendi metot sayısı + metot gövdelerinden yapılan benzersiz dış çağrılar. self.method() kendi metodu kabul edilir. Yüksek RFC, davranış yüzeyinin geniş olduğunu ve test kapsamının büyüyebileceğini gösterir.
lcom Metotların aynı instance state’i paylaşıp paylaşmadığını ölçer. Henderson-Sellers LCOM varyantı: alan başına alanı kullanan metot sayılarından türetilir; 1 veya daha az metot ya da alan yoksa 0.0. Yüksek LCOM, sınıfın birbirinden kopuk sorumluluklar taşıdığını ve bölünmeye aday olabileceğini gösterir.
nom Sınıf metot sayısını verir. Class body içindeki FunctionDef ve AsyncFunctionDef sayısı. WMC için bağlamdır. Çok metot tek başına kötü değildir ama sorumluluk genişliği sinyalidir.
nof Instance alan sayısını verir. Metotlarda self.<alan> biçiminde görülen benzersiz attribute adları. PyMetrics bunu AST üzerinden sezgisel sayar. Çok alan sınıf invariantlarının ve state yönetiminin zorlaşabileceğini gösterir.
nosf Statik/class-level alan sayısı. Sınıf gövdesindeki doğrudan Assign veya AnnAssign hedefleri. Sınıf düzeyi paylaşılan state veya sabit yoğunluğu için bağlamdır.
nosm Statik metot sayısı. @staticmethod dekoratörüyle tanımlanan metotlar. Çok statik metot, sınıfın utility container gibi kullanıldığını düşündürebilir.
norm Parent metotlarının kaçının override edildiğini gösterir. Number of Overridden Methods: proje içinde çözülebilen parent metot adlarıyla kesişen kendi metot adları sayılır. Override davranışı güçlüdür; parent-child davranış bağlılığını artırır.
noc_methods Public metot yüzeyini verir. Adı _ ile başlamayan metot sayısı. Dış API genişliğini gösterir. Yüksek değer kullanıcı/test yüzeyinin büyüdüğünü anlatır.
loc_class Sınıfın dosyadaki kaynak yayılımını gösterir. end_lineno - lineno + 1. wmc, nom ve lcom ile birlikte büyük sınıf adaylarını bulmaya yarar.

LCOM için PyMetrics’teki form:

m = metot sayısı
f = instance alan sayısı
mu(Aj) = Aj alanını kullanan metot sayısı

LCOM = ((sum(mu(Aj)) / f) - m) / (1 - m)

Sonuç negatifse PyMetrics 0.0 altına düşürmez.

Sınıf Seviyesi CC Özetleri

Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
cc_mean Sınıf metotlarının ortalama karmaşıklığı. Sınıftaki metot CC değerlerinin ortalaması. Sınıf davranışının genel dallanma yoğunluğunu gösterir.
cc_max Sınıftaki en karmaşık metodu bulur. Sınıf metot CC değerlerinin maksimumu. Sınıf içinde refactor’a önce hangi metottan başlanabileceğini gösterir.
cc_sum Sınıfın toplam dallanma yükü. Sınıf metot CC değerlerinin toplamı. wmc ile çoğu durumda aynı fikri taşır; sınıf seviyesinde toplam test yükünü anlatır.

metrics_function.csv

Fonksiyon seviyesi rapor, en doğrudan aksiyon alınabilir rapordur. Çünkü karmaşıklık ve Halstead değerleri doğrudan değiştirilecek fonksiyon/metot bloğuna bağlıdır.

Fonksiyon Kimliği

Kolon Anlamı Nasıl okunur?
class_name Fonksiyon bir metotsa sınıf adı; top-level fonksiyonsa boş olabilir. Aynı isimli metotları sınıf bağlamında ayırmaya yarar.
function_name Fonksiyon/metot adı. Refactor, test veya inceleme hedefini verir.
start_line, end_line Fonksiyon/metot satır aralığı. Kod inceleme ve editör navigasyonu için kullanılır.

Fonksiyon CC Metrikleri

Kolon Ne işe yarar? Nasıl hesaplanır? Nasıl okunur?
cc Tek fonksiyon/metot için bağımsız yürütme yolu sayısını özetler. Radon cc_visit ile ilgili bloktan alınan complexity değeri. En iyi refactor sinyallerinden biridir. cc yükseldikçe test senaryosu sayısı ve zihinsel dallanma artar.
cc_rank Fonksiyon CC değerini A-F harfine çevirir. Radon cc_rank(cc). C ve sonrası inceleme; D/E/F ise çoğu ekipte refactor veya test güçlendirme adayıdır.

Fonksiyon Halstead Metrikleri

Fonksiyon CSV’sindeki h1, h2, n1, n2, vocabulary, length, calculated_length, volume, difficulty, effort, time, bugs_halstead kolonları dosya seviyesindeki Halstead kolonlarıyla aynı anlama ve formüllere sahiptir. Fark, kapsamın tüm dosya değil tek fonksiyon/metot olmasıdır.

Pratik önceliklendirme

Fonksiyon düzeyinde önce cc, cc_rank, volume, difficulty ve effort birlikte okunabilir. Yüksek CC ama düşük volume genelde dallanma sadeleştirmesidir; yüksek volume/difficulty ama orta CC ise isimlendirme, kavram sayısı veya sorumluluk ayrımı problemi olabilir.

metrics_summary.csv

Özet rapor proje seviyesinde tek satır üretir. Bu kolonlar dosya, sınıf ve fonksiyon tablolarındaki değerlerin toplamı, ortalaması veya maksimumudur.

Kolon Kaynak Nasıl hesaplanır / okunur?
total_files Analiz sonucu Başarıyla işlenen Python dosyası sayısı.
total_classes Sınıf satırları Üretilen sınıf metrik satırı sayısı.
total_functions Fonksiyon satırları Üretilen fonksiyon/metot metrik satırı sayısı.
avg_loc Dosya loc Dosya başına ortalama toplam satır. Proje büyüklüğünü modül ölçeğinde anlatır.
avg_sloc Dosya sloc Dosya başına ortalama kaynak satırı.
avg_lloc Dosya lloc Dosya başına ortalama mantıksal satır.
avg_cc_mean Dosya cc_mean Dosyaların ortalama CC ortalaması. Proje geneli dallanma yoğunluğunun kaba sinyalidir.
max_cc_max Dosya cc_max Projedeki en karmaşık fonksiyon/metot değerini dosya özetleri üzerinden yakalar.
avg_mi_score Dosya mi_score Ortalama maintainability skoru. Dashboard KPI olarak yararlı, ama tek başına karar değil.
avg_halstead_volume Dosya volume Dosya başına ortalama Halstead volume. Bilişsel yük trendi için kullanılır.
avg_halstead_effort Dosya effort Dosya başına ortalama Halstead effort. Göreli efor sinyalidir.
avg_pylint_score Dosya pylint_score Ortalama lint skoru. PYLINT_ENABLED=false ise anlamlı olmayabilir.
total_pylint_errors Dosya pylint_errors Proje genelindeki error kategorisi Pylint mesajlarının toplamı.
avg_wmc Sınıf wmc Sınıf başına ortalama weighted method complexity.
avg_dit Sınıf dit Ortalama kalıtım derinliği.
avg_cbo Sınıf cbo Ortalama sınıf coupling’i.
avg_rfc Sınıf rfc Ortalama davranış cevap yüzeyi.
avg_lcom Sınıf lcom Ortalama cohesion eksikliği.
avg_revisions Dosya revisions Dosya başına ortalama geçmiş değişiklik sayısı. Shallow clone’da düşük/boş olabilir.
avg_authors Dosya authors Dosya başına ortalama farklı yazar sayısı.

PyMetrics özet ortalamalarını None olmayan değerlerden hesaplar. Hiç değer yoksa ortalama 0.0, maksimum 0 döner. Bu yüzden kapalı Pylint veya shallow Git geçmişi gibi durumlarda özet metriklerin bağlamı mutlaka kontrol edilmelidir.

Birlikte Okuma Örnekleri

Sinyal kombinasyonu Muhtemel anlam İlk bakılacak yer
Yüksek cc_max + yüksek revisions Sık değişen ve dallanması zor bir fonksiyon var. metrics_function.csv içinde en yüksek cc satırı.
Düşük mi_score + yüksek volume Dosya çok fazla bilgi/kavram taşıyor olabilir. Halstead volume, difficulty, effort; sonra dosya sorumlulukları.
Yüksek wmc + yüksek lcom Büyük ve düşük cohesion’lu sınıf; bölme adayı olabilir. Sınıf metotları, paylaşılan instance alanları.
Yüksek fan_out + yüksek cbo Hem modül hem sınıf düzeyinde geniş bağımlılık yüzeyi. Importlar, servis/orchestrator rolü, katman ihlalleri.
Yüksek pylint_errors + düşük cc Mantık karmaşık olmayabilir ama linter gerçek hata buluyor olabilir. Pylint error mesajları.
Yüksek authors + yüksek avg_loc_added/deleted Sahipliği geniş ve sık yazılıp silinen dosya. Kod sahipliği, review geçmişi, modül sınırları.

Kısa Formül Özeti

Metrik Formül
comments_ratio cloc / loc
cc_mean sum(function_cc) / count(function_cc)
cc_sum sum(function_cc)
vocabulary h1 + h2
length n1 + n2
calculated_length h1 * log2(h1) + h2 * log2(h2)
volume length * log2(vocabulary)
difficulty (h1 / 2) * (n2 / h2)
effort difficulty * volume
time effort / 18
bugs_halstead volume / 3000
wmc sum(method_cc)
noc_methods count(method.name does not start with "_")
loc_class class.end_lineno - class.lineno + 1
avg_loc_added total_added_lines / revisions
avg_loc_deleted total_deleted_lines / revisions

Kaynaklar