“Varlıklar gerekliliğin ötesinde çarpılmamalıdır”
- Occam Jilet
Kod mümkün olduğu kadar basit olmalıdır. Hatalar karmaşıklık arasında gizlenmeyi sever, çünkü orada fark etmeleri zor. Peki kodu basit yapan ne?
Küçük birimler (dosyalar, fonksiyonlar, sınıflar) iyi bir fikirdir . Küçük birimlerin anlaşılması kolaydır çünkü bir kerede anlamanız gereken daha az şey vardır. Normal insanlar bir seferde sadece ~ 7 kavramlarını oynatabilir. Ancak boyut yalnızca kod satırlarında ölçülmez . Kodu “golf ederek” (kısa değişken isimleri seçerek, “akıllı” kısayollar alarak, tek bir satıra mümkün olduğunca çok kod yazarak) mümkün olduğunca az kod yazabiliyorum, ancak sonuç basit değil. Bu tür kodları anlamaya çalışmak okumadan çok tersine mühendislik gibidir.
Bir fonksiyonu kısaltmanın bir yolu, çeşitli yardımcı fonksiyonları çıkarmaktır. Bağımsız bir karmaşıklık parçasını çıkardığında bu iyi bir fikir olabilir . İzolasyonda, bu karmaşıklık parçasının yönetilmesi (ve test edilmesi!) İlgisiz bir soruna gömüldüğünden çok daha kolaydır.
Ancak her işlev çağrısı bir sahiptir bilişsel yükü : Sadece kod anlamak gerekmez içinde kod benim şimdiki parça, ben de o kod ile nasıl etkileşime girdiğini anlamak zorunda dışarıdan . Çıkardığın işlevin, işleve, işlediğinden daha fazla karmaşıklık getirdiğini söylemek doğru olur . Patronunuzun kastettiği “ küçük işlevler [bir acıdır” çünkü kodun ne yaptığını görmek için her bir küçük işleve geçmeye zorlar. ”
Bazen, uzun sıkıcı fonksiyonlar , yüzlerce satır uzunluğunda olsalar bile, anlaşılması inanılmaz derecede basit olabilir . Bu, başlatma ve yapılandırma kodunda, örneğin bir sürükle ve bırak editörü olmadan elle bir GUI oluştururken ortaya çıkma eğilimindedir. Makul bir şekilde çıkartabileceğiniz kendine yeten bir karmaşıklık yoktur. Ancak, biçimlendirme okunabilir ve bazı yorumlar varsa, olanları takip etmek gerçekten zor değil.
Başka birçok karmaşıklık ölçütü var: Bir kapsamdaki değişkenlerin sayısı mümkün olduğunca az olmalıdır. Bu değişkenlerden kaçınmamız gerektiği anlamına gelmez . Bu, her değişkeni gerektiği yerde mümkün olan en küçük kapsamla sınırlamamız gerektiği anlamına gelir. Değişkenler, içerdikleri değeri asla değiştirmezsek daha da basitleşir.
Çok önemli bir ölçüm, siklomatik karmaşıklıktır (McCabe karmaşıklığı). Bir parça kod aracılığıyla bağımsız yol sayısını ölçer. Bu sayı her koşullu katlanarak artmaktadır . Her koşullu veya döngü, yol sayısını iki katına çıkarır. 10 puandan fazla bir puanın çok karmaşık olduğunu gösteren kanıtlar var. Bu, 5 puan alan çok uzun bir fonksiyonun, 25 puan alan çok kısa ve yoğun bir fonksiyondan belki de daha iyi olduğu anlamına gelir.
Şartlı, tamamen çıkarılabilecek bir karmaşıklık örneğidir:
function bigFatFunction(...) {
...
phoneNumber = getPhoneNumber(headers);
...
}
...
function getPhoneNumber(headers) {
return headers.resourceId ? headers.resourceId : DEV_PHONE_NUMBER;
}
Bu hala kullanışlı olmanın sınırında. Bu şartın karmaşıklığı önemli ölçüde azaltıp azaltmadığından emin değilim, çünkü bu şart çok şartlı değil . Üretimde her zaman aynı yolu izleyecektir.
Karmaşıklık asla kaybolamaz. Sadece etrafa karıştırılabilir. Birçok küçük şey birkaç büyük şeyden daha mı basittir? Bu, duruma çok bağlı. Genellikle, doğru hisseden bazı kombinasyonlar vardır. Farklı karmaşıklık faktörleri arasındaki bu uzlaşmayı bulmak sezgiyi ve tecrübeyi ve biraz da şans gerektirir.
Çok küçük fonksiyonların ve çok basit fonksiyonların nasıl yazılacağını bilmek yararlı bir beceridir, çünkü alternatifleri bilmeden bir seçim yapamazsınız. Mevcut duruma nasıl uygulanacaklarını düşünmeden kurallara veya en iyi uygulamalara kör bir şekilde uymak , en iyi ihtimalle ortalama sonuçlara, en kötü ihtimalle kargo-kült programlamasına yol açar .
Patronunla aynı fikirde değilim. Argümanları geçersiz değil, ancak Temiz Kod kitabının da yanlış olması. Patronunuzun kurallarına uymak muhtemelen daha iyidir, ancak bu sorunları düşündüğünüz, daha iyi bir yol bulmaya çalıştığınız gerçeği çok umut vericidir. Deneyim kazandıkça, kodunuz için iyi bir faktoring bulmayı daha kolay bulacaksınız.
(Not: bu cevap, kodu ne basitleştirdiği konusunda üst düzey bir görünüm sağlayan Beyaz Tahta'dan The Whiteboard tarafından yazılan Makul Kod blog yazısının düşüncelerine dayanmaktadır .)