Bu proje, indirim hesaplama işlemlerinde Branching ve Rule Engine yaklaşımlarının Cyclomatic Complexity ve Cognitive Complexity metriklerine göre karşılaştırılmasını yapar.
Proje, kullanıcı üyelik türü, yaş ve bölge bilgilerine göre fiyat indirimleri hesaplayan iki farklı yaklaşımı karşılaştırır:
- Branching Yaklaşımı: Geleneksel if-elif-else yapıları kullanarak koşullu mantık
- Rule Engine Yaklaşımı: Kurallar ve aksiyonlar tanımlayarak esnek bir sistem
- ✅ İki farklı yaklaşımın sonuçlarını karşılaştırma
- ✅ Cyclomatic Complexity analizi
- ✅ Cognitive Complexity analizi
- ✅ Sonuç doğrulama ve tutarlılık kontrolü
- ✅ Detaylı complexity metrikleri ve karşılaştırma raporu
- Branching: 5
- Rule Engine: 4
- Branching: 8
- Rule Engine: 6
- Python 3.6+
- Hiçbir ek kütüphane gerekmez (sadece standart kütüphaneler kullanılır)
# Repository'yi klonlayın
git clone https://github.com/ErtugrulKra/PythonRuleEngine.git
# Proje dizinine gidin
cd PythonRuleEngine
# Kodu çalıştırın
python main.pyRuleEngine/
├── main.py # Ana uygulama dosyası
├── rule_engine.py # Rule Engine sınıfı
└── README.md # Bu dosya
python main.py======================================================================
COMPLEXITY KARŞILAŞTIRMASI
======================================================================
1. BRANCHING YÖNTEMİ COMPLEXITY ANALİZİ:
--------------------------------------------------
Fonksiyon: calculate_discount_branching
Cyclomatic Complexity: 5
Cognitive Complexity: 8
2. RULE ENGINE YÖNTEMİ COMPLEXITY ANALİZİ:
--------------------------------------------------
Engine Method:
Cyclomatic Complexity: 0
Cognitive Complexity: 0
Rules:
Cyclomatic Complexity: 4
Cognitive Complexity: 6
Toplam:
Cyclomatic Complexity: 4
Cognitive Complexity: 6
3. COMPLEXITY KARŞILAŞTIRMASI:
--------------------------------------------------
Cyclomatic Complexity:
Daha basit: Rule Engine
Fark: 1 puan
Cognitive Complexity:
Daha basit: Rule Engine
Fark: 2 puan
4. GENEL DEĞERLENDİRME:
--------------------------------------------------
✓ Rule Engine yöntemi her iki complexity metrikinde de daha basit
✓ Rule Engine yöntemi daha kolay anlaşılır ve bakımı yapılabilir
| Metrik | Branching | Rule Engine | Kazanan |
|---|---|---|---|
| Cyclomatic Complexity | 5 | 4 | Rule Engine |
| Cognitive Complexity | 8 | 6 | Rule Engine |
- ✅ Daha düşük complexity skorları
- ✅ Kuralların kolayca eklenmesi/çıkarılması
- ✅ Daha modüler ve esnek yapı
- ✅ Test edilebilirlik
- ✅ Daha basit ve anlaşılır kod
- ✅ Daha az overhead
- ✅ Doğrudan kontrol akışı
def calculate_discount_branching(user):
if user["membership"] == "gold":
if user["age"] > 18:
message = f"{user['membership'].title()} adult member"
final_price = user["base_price"] * 0.80 # %20 indirim
else:
message = f"{user['membership'].title()} young member"
final_price = user["base_price"] * 0.85 # %15 indirim
elif user["membership"] == "silver":
if user["region"] == "EU":
message = f"{user['membership'].title()} EU member"
final_price = user["base_price"] * 0.95 # %5 indirim
else:
message = "Regular member"
final_price = user["base_price"]
else:
message = "Regular member"
final_price = user["base_price"]
return {"message": message, "final_price": final_price}def setup_rule_engine():
engine = RuleEngine()
engine.add_rule(
lambda u: u["membership"] == "gold" and u["age"] > 18,
lambda u: {
"message": f"{u['membership'].title()} adult member",
"final_price": u["base_price"] * 0.80
}
)
engine.add_rule(
lambda u: True, # default
lambda u: {
"message": "Regular member",
"final_price": u["base_price"]
}
)
return engineProje, 10 farklı kullanıcı profili ile test edilmiştir:
users = [
{"age": 25, "membership": "gold", "region": "EU", "base_price": 100},
{"age": 17, "membership": "gold", "region": "US", "base_price": 120},
{"age": 30, "membership": "silver", "region": "EU", "base_price": 80},
# ... daha fazla test verisi
]- Kodun kaç farklı yoldan çalışabileceğini ölçer
- if, elif, else, for, while, try-except gibi dallanma noktalarını sayar
- Düşük değerler daha basit kod anlamına gelir
- Kodun anlaşılması için gereken zihinsel çabayı ölçer
- İç içe geçmiş yapıları ve mantıksal operatörleri dikkate alır
- Düşük değerler daha kolay anlaşılır kod anlamına gelir
- Bu repository'yi fork edin
- Yeni bir branch oluşturun (
git checkout -b feature/amazing-feature) - Değişikliklerinizi commit edin (
git commit -m 'Add some amazing feature') - Branch'inizi push edin (
git push origin feature/amazing-feature) - Bir Pull Request oluşturun
Bu proje MIT lisansı altında lisanslanmıştır. Detaylar için LICENSE dosyasına bakın.
Ertugrul Kara
- GitHub: @ErtugrulKra
Sorularınız için GitHub Issues kullanabilir veya @ErtugrulKra ile iletişime geçebilirsiniz.
⭐ Bu projeyi beğendiyseniz yıldız vermeyi unutmayın!