Daha ayrıntılı kodun (daha mantıklı ifadelerde olduğu gibi) daha kısa koddan daha temiz olduğu durumlar var mı?
Daha ayrıntılı kodun (daha mantıklı ifadelerde olduğu gibi) daha kısa koddan daha temiz olduğu durumlar var mı?
Yanıtlar:
Buna cevap vermek için, başıma gelen gerçek bir dünya örneğini ele alalım. C # kitaplığımda tuttuğum bir kütüphanede şu kod vardı:
TResult IConsFuncMatcher<T, TResult>.Result() =>
TryCons(_enumerator) is var simpleMatchData && !simpleMatchData.head.HasValue
? _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
: _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
Bunu akranlarla tartışırken, oybirliğiyle verilen karar, "akıllıca" kullanımıyla birleştiğinde iç içe üçlü ifadelerin is var
kısa, ancak kod okumayı zorlaştırmasıydı.
Bu yüzden onu yeniden refactored:
TResult IConsFuncMatcher<T, TResult>.Result()
{
var simpleMatchData = TryCons(_enumerator);
if (!simpleMatchData.head.HasValue)
{
return _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
}
return _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
}
Orijinal versiyon üstü kapalı, tek bir bileşik ifade içeriyordu return
. Yeni sürüm şimdi açık bir değişken bildirimi, bir if
ifade ve iki açık içeriyor returns
. Daha fazla ifade ve daha fazla kod satırı içerir. Yine de danıştığım herkes, "temiz kod" un anahtar yönleri olan okumayı ve aklını kolaylaştıracaktı.
Bu yüzden sorunuzun cevabı empatik bir "evet" dir, özlü koddan daha ayrıntılı olan daha net olabilir ve bu nedenle geçerli bir yeniden düzenlemedir.
!
ve koşuldan çıkarmayı öneririm . İkinci dönüşün bir taneye konmasını da öneririm else
. Ancak, olduğu gibi, muazzam bir gelişmedir.
if (!foo.HasValue)
daha da güçlü. Ancak if
değil gerçekten bir çıkış-erken - bir var "Bunu yapmak veya bağlı olduğu."
1. LOC ve kod kalitesi arasında korelasyon eksikliği.
Yeniden düzenlemenin amacı, bir kod parçasının kalitesini iyileştirmektir.
LOC, bazen bir kod parçasının kalitesiyle ilişkilendirilen çok temel bir ölçümdür: örneğin, birkaç binlerce LOC'ye sahip bir yöntemin kalite sorunları olması muhtemeldir. Bununla birlikte, LOC'nin sadece metrik olmadığı ve birçok durumda kalite ile korelasyonunun olmadığı not edilmelidir . Örneğin, bir 4 LOC yöntemi mutlaka bir 6 LOC yönteminden daha okunaklı veya daha sürdürülebilir değildir.
2. Bazı yeniden düzenleme teknikleri LOC'lerin eklenmesinden oluşur.
Yeniden düzenleme tekniklerinin bir listesini alırsanız, kasıtlı olarak LOC'lerin eklenmesinden oluşanları kolayca tespit edebilirsiniz . Örnekler:
Her ikisi de çok faydalı refactoring teknikleridir ve LOC üzerindeki etkileri, kullanılıp kullanılmayacağını düşünürken tamamen önemsizdir.
LOC kullanmaktan kaçının.
LOC tehlikeli bir ölçümdür. Ölçülmesi çok kolaydır ve doğru yorumlanması çok zordur.
Kod kalitesinin ölçüm tekniklerini öğrenene kadar, ilk önce LOC ölçmekten kaçının. Çoğu zaman, ilgili hiçbir şey elde edemezsiniz ve kodunuzun kalitesini düşürmek için sizi yanlış yönlendireceği durumlar olabilir.
Kaynak kodunuzun bayt sayısını veya LoC sayısını en aza indirmenin nihai sonucunu görmek istiyorsanız, Stack Exchange Code Golf sitesine gönderilen yayınlara bir göz atın .
Kaynak kodunuz bu şekilde azalırsa, yakında sürdürülemez bir karışıklığa sahip olacaksınız. Bu tür bir kodu yazan ve onu tam olarak anlayan kişi olsanız bile, altı ay içinde döndüğünüzde ne kadar verimli olacaksınız? Bu kadar az kodun gerçekte daha hızlı bir şekilde çalıştığına dair hiçbir kanıt yoktur.
Kod, ekibinizin herhangi bir üyesinin bakabileceği ve hemen ne yaptığını anlayabileceği şekilde yazılmalıdır.
Evet yeniden düzenleme kesinlikle daha fazla kod satırına neden olabilir.
IMO'nun en yaygın örneği, genel olmayan kodu aldığınızda ve daha genel / esnek hale getirmenizdir . Kodun kolayca tanımlanması kod satırlarının önemli ölçüde artmasını sağlar (bazen iki veya daha fazla bir faktörle).
Yeni jenerik kodun başkaları tarafından (sadece dahili bir yazılım bileşeni yerine) bir kütüphane olarak kullanılmasını beklerseniz, genellikle kod satırlarını tekrar artıracak en unitedest kod ve kod içi dokümantasyon işaretlemesi eklersiniz.
Örneğin, her yazılım geliştiricisi için olan çok yaygın bir senaryo:
Bana kafamın tepesinden gelen bazı somut örnekler: