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 + cbogibi.
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. |
| 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ı |
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.csvDosya seviyesi rapor, PyMetrics’in en geniş tablosudur. Aşağıdaki sıra CSV kolon sırasını takip eder.
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, 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, 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.
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,difficultyveeffortdeğerlerini mutlak doğru gibi değil, aynı proje veya aynı veri toplama hattı içindeki göreli sıralama gibi okuyun.
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=trueise 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, 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. |
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.csvSı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.
| 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.
| 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.csvFonksiyon 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.
| 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. |
| 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 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,difficultyveeffortbirlikte 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.
| 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ı. |
| 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 |
ast module documentation