Bir refraktörün daha yüksek bir LOC ile bitmesi hiç mantıklı geliyor mu? [kapalı]


25

Daha ayrıntılı kodun (daha mantıklı ifadelerde olduğu gibi) daha kısa koddan daha temiz olduğu durumlar var mı?



18
Tabii ki öyle. Çoğaltmayı kaldırırken bile, yeni ayıklanan işlevi tanımlayan kod kendi alanını kaplar. Yeni bir işlev yazmak dört satır alabilir ve yalnızca iki tasarruf sağlayabilir ve yine de yapılması gereken değerli bir şey olabilir.
Kilian Foth

5
"daha özlü kod"? Daha küçük bir satır sayısının "daha iyi" kod anlamına geldiği konusundaki yanlış inançtan gerçekten nefret ediyorum Öyle değil. Aslında, genellikle tam tersi. Bir noktaya geliyor - ve çok hızlı bir şekilde ulaşılıyor - daha az ve daha az alana daha fazla anlamın sıkıştırılmasının, kodun anlaşılmasını zorlaştırdığı bir nokta . Aslında, birçok kazananın geçilmez kod yazmak için insanın anlama sınırlarına dayandığı bir yarışma var - Uluslararası Karışık C Kod Yarışması - .
Andrew Henle

1
Sorunuzun adı ve sorunuzun kendisi farklı sorular soruyor. Örneğin, bir if ifadesi, mantıksal olarak aynı ancak sadece 1 satır olan üçlü bir ifadeyle değiştirilebilir.
Kaptan Adam

1
-1 *** daha ayrıntılı kod (daha mantıksal ifadelerde olduğu gibi) *** fiiliyet ve mantıksal ifadelerin sayısı ilgisiz iki şeydir. Tanımları değiştirmek kötü bir şey.
Pieter B

Yanıtlar:


71

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 varkı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 ififade 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.


34
Bu gün ve yaşta, geliştirici beyinleri disk, CPU, RAM veya ağ bant genişliğinden daha az kaynaktır. Onlar zaten önemlidir ve bazı uygulamalarda bunlar sınırlayıcı faktör olabilir, ancak çoğu durumda, kodu anlamak için geliştiricilerin yeteneği için optimize etmek istediğiniz ilk sonra bu diğer şeyleri ve.
anaximander

2
@anaximander, Kesinlikle katılıyorum. Önce diğerlerini, ikincisi de derleyiciyi okumak için kod yazın. Bu nedenle, geliştiren tek kişi ben olsam bile, kodumu başkalarının akranlarına eklemesini sağlamanın yararlı olduğunu düşünüyorum.
David Arno

4
Bunu gözden geçiriyor olsaydım, iade ifadelerinin sırasını tersine çevirmeyi !ve koşuldan çıkarmayı öneririm . İkinci dönüşün bir taneye konmasını da öneririm else. Ancak, olduğu gibi, muazzam bir gelişmedir.
Martin Bonner

2
@DavidArno Bu mantığı görüyorum ve kodunuzda bir deyimse if (!foo.HasValue)daha da güçlü. Ancak ifdeğil gerçekten bir çıkış-erken - bir var "Bunu yapmak veya bağlı olduğu."
Martin Bonner Monica destekler

2
@fabric Boole değerlerinin karşılaştırılması tehlikelidir. Elimden geldiğince kaçınıyorum.
Martin Bonner Monica

30

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.


Daha fazla LOT (metin satırı) ekleyerek cevabınızı kırdınız ve kaliteyi
yükselttiniz

12

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.


Belki gereksiz, ama sadece heceleyerek; Eğer her zaman daha fazla LoC ile bitirmek okunabilmesi için kod golfed refactor eğer
JollyJoker

1

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:

  • Ürününüzün iki haftada acil bir yüksek öncelikli yeni özellik veya hata düzeltme veya geliştirme ihtiyacı var (ya da proje büyüklüğünüz / şirket büyüklüğünüz / vb. için acil olan herhangi bir zaman dilimi)
  • Çok çalışır ve zamanında XYZ teslim edersiniz ve çalışır. Tebrikler! İyi iş!
  • XYZ'yi geliştirirken mevcut kod tasarımınız / uygulamanız XYZ'yi gerçekten desteklemedi, ancak XYZ'yi kod tabanına sığdırabiliyordunuz
  • sorun şunun çirkin ve korkunç bir kod kokusuna sahip olmasıdır, çünkü bazı zor / zeki / çirkin / kötü-pratik-ama-bazı-işler
  • Daha sonra zaman bulduğunuzda, birçok sınıfı değiştirebilecek ya da yeni bir sınıf katmanı ekleyebilecek olan kodu yeniden değerlendiriyorsunuz ve yeni çözümünüz "doğru bir şekilde yapılıyor" ve artık kötü kod kokusuna sahip değil. "doğru yol" artık daha fazla kod satırı gerektiriyor.

Bana kafamın tepesinden gelen bazı somut örnekler:

  • bir komut satırı arayüzü için 5000 satır if / else-if kodu olabilir veya geri aramaları kullanabilirsiniz ... her geri arama çok daha küçük ve okunması / test edilmesi / doğrulanması / hata ayıklaması / vb. if / else-if kodunun muhtemelen daha küçük olacağını gösteren çirkin 5000 satırı kodlayın
  • N işleme yöntemini destekleyen bir kod parçası işlemek için , yine en çirkin görünen ifadeleri if / else kullanabilirsiniz ...
    • veya daha iyi olan / daha iyi olacak olan geri aramalara geçebilirsiniz ancak geri aramalar daha fazla kod satırı alır (yine de derleme zamanı)
    • ya da daha fazla soyut ve çalışma zamanında değiştirilebilir eklentileri yapabilirsiniz. Eklentiler güzeldir, çünkü her yeni eklenti için ana ürünü veya mevcut bir eklenti üzerinde değişiklik yapmak zorunda kalmazsınız. API'yi yayınlayabilirsiniz, böylece diğerleri ürünü genişletebilir. AMA yine bir eklenti yaklaşımı daha fazla kod satırı kullanıyor.
  • Bir GUI için harika bir yeni widget oluştur
    • siz veya bir iş arkadaşınız yeni widget'ın XYZ ve ABC için harika olacağını belirtti ancak şu anda widget sadece XYZ için çalışmak üzere sıkı bir şekilde entegre edildi
    • gereci her ikisinde de çalışacak şekilde yeniden etkinleştirirsiniz, ancak şimdi toplam kod satırı artar.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.