Kodunuzda özlülük veya okunabilirliği tercih ediyor musunuz? [kapalı]


21

Dil kısayolları genellikle kodu daha kısa yapmak için kullanılabilir.

Örneğin, üçlü ve boş birleştirme operatörleri kod miktarını azaltabilir, ancak tartışmalı olarak okunabilirliğin zararına:

C # 'da:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

işlevsel olarak şuna eşittir:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

ama belli ki çok daha ayrıntılı.

Okunabilirlik ve özlü olma söz konusu olduğunda çizgiyi nerede çizersiniz?


3
Bu sübjektif bir soru, bir şeyi uygulayan biri yolunun mantıklı olduğunu söyler, okuyan biri anlamsız olur ve okuyan başka bir kişi anladım derdim ama başka bir yolu tercih ederim. Bu sadece tercihtir.
Chris

20
İkinci versiyonun daha okunaklı olduğunu düşünüyorum.
Vaibhav

2
Netliği öz ile karıştırıyorsunuz. Conciseness okunabilirliği artırır. Terslik ondan uzaklaşıyor.
Ferruccio

1
@ ThorbjørnRavnAndersen: C # kodunun izleyicileri genellikle "C # geçmişi olan geliştiriciler" dir. Gördüğüm kadarıyla, burada programcılar üzerindeki fikir birliği, birisinin onlara aşina olamayacağı için faydalı dil özelliklerini kullanmaktan kaçınmamanız gerektiği anlaşılıyor. (Ayrıca bakınız: programmers.stackexchange.com/q/101513/33843. )
Heinzi

1
yinelenen ?: programmers.stackexchange.com/q/58630/15464 .. Oh, bu daha eski. :)
Steven Jeuris 15:11

Yanıtlar:


63

Her ikisi de.

İlk örneğiniz kesinlikle daha ayrıntılı ve tartışmalı olarak daha açık ... ama aynı zamanda bir tane yerine beş satır taramamı gerektiriyor. Daha da kötüsü, amacına vurgu yapar - bir değer vermek newGuy.Boss.

İkinci örnek, boş birleştirme operatörüne yabancıysam, bana bir saniye tutabilir, ancak amacı hakkında hiçbir şüphem yok ve bir değerin kaynağını arayan daha büyük bir rutini tarıyorsam, Bunu seçmem benim için daha kolay.

Şimdi, bunu kontrast:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

...ile:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

İkinci örnek yine çok daha kısadır, ancak şimdi aynı test tarafından tetiklenen görevlerin farklı görünmesini sağlayarak amacını gizlemektedir. Burada, eski olanın ayrıntılarının haklı olduğunu hissediyorum.


3
Mükemmel cevap! - Amaç ile ilgili ayrıntılardan ibaret değil.
Damovisa

2
@Damovisa: tam olarak - kodun hedefi iletişimdir ve bunun neden olabildiğince tam olarak yapılmaması gerektiğine dair genel bir neden yoktur (daha fazla değil).
Shog9

1
Boş birleştirme operatörünü öğrenmek bir saniyeden fazla sürecek - ama bilmiyorsanız öğrenmeniz gerekir!
Casebash

2
Ah "??" Java ile iyi olurdu.

Son örnek kod açısından daha kısa olsa da boss, ayrıntılı örnekte sadece bir kez aksine 3 kez değerlendiriliyor . Bu, sadece kısa olmak için kısa kodun kötü bir fikir olmasının bir başka nedenidir. Bence özlülük, okunabilirlik / sürdürülebilirlik (karmaşık kod için) veya performans (iç döngülerin kritik bölümleri vb. İçin) olup olmadığının birincil amaç için ikinci olması gerektiğini düşünüyorum. Başka bir deyişle, kesinlikle kısa bir süre için kesinlikle optimizasyon yapmayın
kodunuzu

16

Her ikisi de iyi hedefler olsa da, birini seçmeye zorlandığımda her zaman Okunabilirlikten yana olacağım .

Ben senin örneğin okunabilirliği hem iyileştirdiğini iddia ediyorum ve kısalık. Ancak şunu göz önünde bulundurun:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

aksine

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

İkincisi özlü, ancak okumak zordur. İlki ayrıntılı, ancak mantık akışı açıktır.

Sonuç olarak, kısalık, ekrana daha fazla sığma kabiliyetinden başka bir amaca hizmet etmiyor. Okunabilirlik hata ayıklamayı kolaylaştırır ve genellikle tercih edilmelidir.


11
Doğru biçimlendirme, ikinci örneğin okunabilirliğini kolayca artırabilir. Bu haksız bir karşılaştırma. Bu şekilde biçimlendirildiğinde , o kadar da kötü olduğundan emin değilim.
Steven Jeuris,

Kod örnekleri eşdeğer değildir: İlki eksik ?? whatever.something.
John B. Lambe

11

Genel bir kural olarak, netlik nedeniyle okunabilirliği asla feda etmediğini, ancak bu konuda bilgi eksikliği olan başka programcılara dayanarak okunabilirliği asla yargılamadığını söyleyebilirim.

Sünnet ve okunabilirlik zıt değildir. Bu cevap gibi, bazen daha kısa okunabilir.


4
Başka bir programcının bilgi eksikliğini varsaymadığı için +1. Verilen örnekte, ikinci seçenek yalnızca boş birleştirme operatörüne aşina değilseniz, daha az okunabilir. İş arkadaşlarımın dil sözdizimini bilmediği varsayımına dayanarak kodumu asla yazmam. Ne ??anlama geldiklerini bilmeseler bile , onu kullanırsam ve sonra öğrenirlerse, ikimiz de yararlandık. O msdn.com üzerinde "?? operatörü" yazmak için zor gibi Ve o değil
Tim Goodman

4

Okunabilirliği tercih ettiğimi söyleyebilirim, bu bazen kısa kod kullanmak anlamına geliyor. (Yani daha büyük bir koşullu blok içindeki nispeten basit koşullamalar için üçlü).

Temel olarak, gereksiz yere anlamak zorsa, yapmayın.


3

Okunabilirlik ilk önce özle çelişki halindedir, çünkü kod başlangıçta yazıldığından daha sık değiştirilir. Diğer yandan:

  1. Sözdizimsel gürültü ve kazan plakası kodu genellikle niyetleri gizlemekte ve bu nedenle okunabilirliğe zarar vermektedir. Bazen daha özlü kod da daha okunaklıdır. Örneğin, lambda işlevlerini veya delegeler / birinci sınıf işlevleri yerine, tek yöntemli bir arabirim uygulayan tek yöntemli sınıfları düşünün.

  2. Okunabilirlik, dili ve benzersiz / gelişmiş özelliklerini oldukça iyi bilen makul bir tecrübeli programcı için kodun okunmasının ne kadar kolay olduğu, ancak en düşük ortak paydayı bilen ancak bazı yetkin kod maymunu kullananlar açısından kolay bir şekilde değerlendirilmelidir.


2

Ben sanmıyorum bir yönü henüz söz edilmiştir: nelerdir sizin hedefleriniz?

Tek umursadığın iş güvenliği ise, her şeyin özünde ve küçüklüğünde ol. Ayrıca kodunuzu yorumlayarak atlayın.

Yepyeni bir proje üzerinde çalışırken kodunuzu başkasına kolayca teslim edebilmek istiyorsanız, okunabilirlik, netlik ve pek çok sağlam yorum için gidin.

Not: Yukarıdaki şahsen sizinle ilgili değildir, @Damovisa; İki pozisyon arasında seçim yapan herkes için.


Bir iş güvenliği gibi geliyor ama programcı olmak istiyorsanız , yanlış bir şirkette iş güvenliği ...;)
Alois Mahdal

2

Ayrıntılı sürümün bir avantajı olduğu bir şey var.

Daha fazla satır var ve çoğu hata ayıklayıcı satır odaklı ! Bir ifadenin ortasına bir kırılma noktası ayarlamak çok zordur, ancak bunu genellikle bir blok ifadesinin içine koymak oldukça kolaydır.

Başka bir deyişle, hata ayıklayıcınızın ne zaman başlamasını istiyorsanız, editörünüzde hangisini görmek istersiniz boss == null?

(Bu ?? - operatörünü sevdiğimi söyledi)


0

Okunabilirlik ilk önce gelmeli, uzun vadede çoğu insan çoğu zaman mevcut kodu değiştirmek veya genişletmek için harcar - okunabilirlik, bakımın büyük bir parçasıdır.

Bununla birlikte, özlülük, okunabilirliğe katkıda bulunabilecek bir şeydir. Örneğin, sorunuzda ikinci snippet hem daha okunaklı hem de daha özlüdür.

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.