ABC (Assignment Branch Condition) skoru: Kod Kalitesini Anlamak ve İyileştirmek
Geliştiriciler olarak, kodun kalitesi ve sürdürülebilirliği her zaman önceliğimizdir. Bu bağlamda, ABC (Assignment Branch Condition) skoru, kodun karmaşıklığını ölçen önemli bir metrik olarak karşımıza çıkıyor. Sık sık rubocop’dan:
Metrics/AbcSize: Assignment Branch Condition size for index is too high. [<2, 18, 1> 18.14/17]
gibi mesajlar alıyor olabilirsiniz 😅. Bu makalede, neden ABC skorunu önemsemeliyiz? Sorusu hakkında notlarımı ve bilgilerimi sizinle paylaşacağım ❤ . (Kod örnekleri Ruby ile yazılmıştır ❤)
ABC (Assignment Branch Condition) Skoru Nedir?
ABC skoru, bir metodu veya fonksiyonu oluşturan assignment, branch ve condition unsurlarının bir kombinasyonunu ölçen bir metriktir. Bir kod parçasının karmaşıklığını belirlemeye yardımcı olur ve biz geliştiricilere kodlarını daha anlaşılır ve bakımı daha kolay hale getirme fırsatı sunar.
ABC Skoru Nasıl Hesaplanır?
ABC skoru, aşağıdaki formülle hesaplanır:
√(assignments² + branches² + conditionals²)
Bu formül, bir metodun karmaşıklığını daha iyi anlamamıza yardımcı olur.
Assignment: Örneğin, a = 5
ifadesinde 5
değeri a
değişkenine atanmıştır.
Branch: Programın belirli bir noktasından başka bir noktasına geçiş. Bu, genellikle bir fonksiyon çağrısı, sınıf metodu çağrısı veya yeni bir nesne oluşturma gibi durumları kapsar.
Condition: Örneğin, if
, else
, case
, default
, try
, catch
, ?
, ||
, &&
operatörü.
Kod Kalitesini Artırmak İçin ABC Skorundan Nasıl Faydalanılır?
- Metodları Bölümleme: ABC skorunu azaltmak için uzun metodları daha küçük ve anlaşılır parçalara bölebilirsiniz.
- Tek Sorumluluk Prensibi (Single Responsibility Principle): Her metodun sadece bir işlevi olmalıdır. ABC skoru, metodun ne kadar karmaşık olduğunu belirleyerek bu prensibe uygunluğu değerlendirmenizi sağlar.
- Branch ve Condition Sayısını Azaltma: Gereksiz branch ve koşulları azaltmak, kodu daha anlaşılır hale getirebilir ve ABC skorunu düşürebilir.
Örnek:
class Ball
attr_reader :color
attr_reader :center
attr_reader :radius
attr_reader :dir
attr_reader :x, :y
attr_reader :w, :h
attr_accessor :worldWidth
attr_accessor :worldHeight
...
# Draw the ball into this device context
def draw(dc)
dc.setForeground(color)
dc.fillArc(x, y, w, h, 0, 64 * 90)
dc.fillArc(x, y, w, h, 64 * 90, 64 * 180)
dc.fillArc(x, y, w, h, 64 * 180, 64 * 270)
dc.fillArc(x, y, w, h, 64 * 270, 64 * 360)
end
...
Yukarıdaki örnekte rubocop’tan şu çıktıyı alırız:
"Assignment Branch Condition size for draw is too high. [29/15]"
Peki 29'u nasıl hesapladık?
Kodda gördüğümüz gibi herhangi bir Assignment veya Condition bulunmuyor. Sadece Branch bulunuyor. Bunlar:
1 x #setForeground
1 x #color
4 x #fillArc
4 x #x
4 x #y
4 x #w
4 x #h
7 x #*
√(0² + 29² + 0²) = 29
class Ball
# ... other attributes and methods ...
# Draw the ball into this device context
def draw(dc)
dc.setForeground(color)
draw_arc(dc, 0, 64 * 90)
draw_arc(dc, 64 * 90, 64 * 180)
draw_arc(dc, 64 * 180, 64 * 270)
draw_arc(dc, 64 * 270, 64 * 360)
end
private
def draw_arc(dc, start_angle, end_angle)
dc.fillArc(x, y, w, h, start_angle, end_angle)
end
end
Kodumuzu yukaridaki gibi refactor edebilir ve daha sürdürülebilir hale getirebiliriz.
Sonuç
ABC skoru kullanarak kod kalitesini artırabilir, bakımı kolaylaştırabilir ve proje süreçlerini daha etkili hale getirebiliriz. Bu metrik, kod karmaşıklığını ölçmede güçlü bir araçtır ve sürdürülebilir bir kod tabanı oluşturmamıza yardımcı olabilir.
Kaynaklar:
https://redgreenrepeat.com/2017/01/20/understanding-assignment-branch-condition/