Hangisi daha sürdürülebilir - if / else veya boolean ifadesi aracılığıyla boole ataması?


11

Hangisi daha sürdürülebilir kabul edilir?

if (a == b) c = true; else c = false;

veya

 c = (a == b);

Code Complete'e bakmayı denedim, ancak bir cevap bulamıyorum.

İlkinin daha okunabilir olduğunu düşünüyorum (kelimenin tam anlamıyla yüksek sesle okuyabilirsiniz), ki bu da onu daha sürdürülebilir hale getiriyor. İkincisi kesinlikle daha mantıklı ve kodu azaltır, ancak C # geliştiricileri için sürdürülebilir olduğundan emin değilim (bu deyimi daha çok örneğin Python'da görmeyi beklerim).


3
İkisi eşdeğer değildir. else c = falseBirincisi için a'ya ihtiyacınız var , ya da ödevi ödeve yapmalısınız ||=.

17
Sanırım ilk formda iki düzenleme yapmanız gerektiği sorunuzu cevaplıyor!
James

7
@James ile aynı fikirdeyim. İkinci form, ayrıntılı olarak olmasa da, anlaşılması çok basittir ve anlamıyla ilgili herhangi bir belirsizlik bırakmaz. Alınan hileler veya kısayollar yok, sadece kısa çünkü konsept basit. İlkini bir hata ile kodladığınız ve düzeltmek için düzenlemek zorunda olmanız ve hala mükemmel değil (parantezlerin tutarsız kullanımı), düşündüğünüz kadar basit olmadığının kanıtı pozitif.
Eric King

5
Vay canına, C # devs gerçekten ilk formu kabul edilebilir mi? Bu ... onlara olan güvenimi ciddi şekilde azaltır. Deneyimlerime göre, ilk formun kullanılması büyük ölçüde boole ifadelerinin yanlış anlaşılmasını ima ediyor.
Andres F.

2
Sadece işleri ilginç tutmak için, başka bir seçenek daha var:c = a==b ? true : false;
SinirliWithFormsDesigner

Yanıtlar:


14

İkinci seçenek daha iyidir.

Kodun amacını gizleyerek sürdürülebilirliği zedeleyen akıllı programlama kısayollarına karşı dikkatli olmanız için kesin bir neden var. Yani, soruyu sorduğun için seni suçlamıyorum.

Ancak, c = (a == b);akıllı bir hile örneği olarak düşünmüyorum . Bu, basit bir kavramın doğrudan bir temsilidir. Mümkün olduğunca düz ileri.

Düzgün, "sürdürülebilir" (eksik parantez ve tek satırlık bir yapı, olmadan ilk örneğinin biçimlendirme yapmak bu kodu doğuracak akıllı kısayol düşünün):

if (a == b)
{
    c = true; 
}
else 
{
    c = false;
}

Deneyimlerime göre, böyle bir ayrıntılı, hataya eğilimli şekilde basit boole mantığı yazmak "iffy" kodunun bir işaretidir. Bu kod tabanında ne kadar karmaşık mantığın ele alındığını merak etmeme neden olacaktı.


15

İlk olarak, iki formunuzun eşdeğer olmadığını anlayın.

if (a == b) c = true;

cadeğeri eşitse true olarak ayarlanır bve değilse değeri zaten olduğu gibi kalır.

c = (a == b);

caeşitse true olarak ayarlanır bve değilse false olarak ayarlanır.

İkinci formun eşdeğerini istiyorsanız, ilk formun tarzında, şöyle yazmanız gerekir:

if (a == b) {
  c = true;
} else c = false;

Şimdi, ikisinden hangisinin daha okunabilir, daha sürdürülebilir ve bir şey değiştirilirse hata getirme olasılığı daha düşük. İkinci form ile sopa.


Kesinlikle doğru - Sorumu güncelledim.
Bret Walker

İkinci formu aşırı uzun ve karmaşık olarak görüyorum - eğer bu etkiyi istiyorsanız, bir boole ataması kullanın.
Monica'yı eski durumuna getirin - M. Schröder

11

İlk formunuzun daha okunabilir olduğuna katılmıyorum - tek bir satırda iki deyim olması kesinlikle deyimsel C # değildir ve ifparantez kullanmadan bir ifadenin olması önerilmez .

İkincisi, ikinci formun nasıl daha az bakım yapılabilir olduğunu görmüyorum - sürdürecek bir şey yok. Bu arasındaki ilişkinin basit bir ifadedir ave bve bir daha basitçe ifade edilemedi.

İkinci formu tercih etmenin bir başka nedeni, cbildirimi tek bir ifadede atayabilmeniz ve atayabilmenizdir.

bool c = (a == b);

Değişkenleri değiştirmek kolayca hatalara yol açabilir, bu yüzden bundan kaçınırım. İfadenin kullanılması if, değişkenin koşuldan önce bildirilmesini ve sonra değiştirilmesini gerektirir.


Bir satırdaki iki ifadeyi sahte kod olarak okudum
Jimmy Hoffa

1
" Another reason to prefer the second form is that you can declare c and assign it in a single statement" İçin +1
Andres F.

0

"daha sürdürülebilir" çok öznel olabilir.

Genellikle okunabilirliği ve kod azaltma amacını tercih ederim. Azaltılmış formu kullanarak 8 yazılan karakteri kaydettiğinizi düşünüyorum.

Dili ve kültürü dil etrafında ele almak bence 'okunabilirliğin' bir özelliğidir.

Ortaya çıkan bayt kodunu optimize etmek için kodun azaltılmasında performansın neden olabileceği zamanlar vardır, ancak bu bazı profillemeden sonra dikkatle yapılmalıdır.


Öznel: Duh. Kod azaltma: Ayrıca (abartılmamışsa) netliği artırabilir ve amacı daha iyi iletebilir. Performans: Hiç endişe duymuyorum (optimizasyon bazen hayati önem taşır, ancak bu optimizasyonun altında olan bir şey değildir, çünkü neredeyse hiç önemli değildir - muhtemelen çekirdek veya sürücü yazsanız bile).

4
İlk formda, düzeltilmesi gereken, ayrıntılarında gizlenmiş en az 1 hata vardı. İkinci form basit ve noktaya geldi ve hiçbir hata yoktu. Diyeceğimi dedim. Her durumda, asıl amaç daha az karakter yazmak değildi! Ve bu soru performansla ilgili değildi, bu da bu durumda alakasız.
Andres F.

@ delnan tam olarak benim görüşüm Duh. birinin kod azaltması, başkasının netliğidir. Optimizasyonu birincil sorun olarak göstermedim ... Örnek olarak kullandım. Akıllı hileler ekleme veya normların dışına çıkma nedeniniz, sizin / kültürünüzün / kuruluşunuzun okunabilir olarak kabul edeceği her şeyle dengelenmelidir.
Johnnie

1
Temiz bir boole ifadesi yazmak akıllıca bir numara değildir!
Andres F.

Sorunun ruhunu ele alıyorsanız ve temelde bir kavramı desteklemek için kullanılan bir ananloji benzetmezseniz, yorumunuza daha fazla değer katacağım sanırım.
Johnnie

0

İkinci. Daha az tekrarını (KURU) vardır ve ne olup bittiğini anlamak daha kolay, yani colsun veya olmasın değerine sahip ave olmayacak beşittir.

IMHO, daha da iyisi

c = a == b

Tam yazdığım gibi

  • 1 + 2 + 3 onun yerine ((1 + 2) + 3)
  • 5 + 3 * 7 onun yerine (5 + (3 * 7))

Açıkçası ve önemsiz gereksiz kod bir erdem değildir. Karmaşık.


-4

Aşağı seçmenler, lütfen gözden geçirilmiş cevabımda neyin yanlış olduğunu açıklayın.

Evet, c = (a == b);okumak zor olabilir (daha da kötüsü, StyleCop gereksiz parantezden şikayet ediyor), ama yine de basitliğini sevdim a == b. Bu nedenle, burada her iki kullanmak ister ne ave baynıdır:

private static bool NoPeriod
{
    get
    {
        return this.MyWaveLength == this.HerWaveLength;
    }
}

Ve sonra şunları yapabilirsiniz this.c = this.NoPeriod:

this.c = this.MyWavelength == this.HerWaveLength;

1
böylece kastettiniz return this.MyWaveLength = this.HerWaveLength;yoksa return this.MyWaveLength == this.HerWaveLength;onun yerine?
Jesse C. Slicer

5
Ne!? c = (a == b);hataya meyilli değildir. Orijinal sorudaki ilk form, hataların düzeltilmesi için OP'nin sorusunu düzenlemek zorunda kaldığı gibi, daha fazla hataya eğilimli !
Andres F.

Sanırım önerilen çözümünüzün bir hatası var = vs. ==
Ondra

@Ondra Morský, teţekkürler ... derleyici bunu benim için yakalardý.
İş

6
StyleCop'a aşina değilim, ancak gereksiz parantezlerin kötü olduğunu söylüyorsa, kapatmanız gerekir. Derleyici için gereksiz parantezler gerekli değildir, ancak insan gözü için çok, çok hoş olabilirler. C = a == b yazdıysanız; derleyici bunu iyi anlayabilir, ama bir insan için daha zor.
Michael Shaw
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.