Ben Alternatif Kontrol dizimi kaçınmak gerekir?

8 Cevap

Çoğunlukla kendi kendini eğitmiş programcısı gibi, ben gerçekten bazı şeyler veya kullanılmış olmamalıdır neden kimse açıklamak yoktu. Bir örnek (Ben yıllar önce aldım ve oldukça sık kullandığınız) alternatif kontrol yapısı sözdizimi:

x = (y == true) ? "foo" : "bar";

Ben şahsen kolay bu sözdizimi özellikle kısa, özlü kodu, takip etmek, ama daha fazla kullanmak için kötü bir uygulamadır eğer öyleyse ben bilmek istiyorum bu "vahşi" kullanımı bir sürü görmüyorum bulabilirsiniz Geleneksel if ... else yapısı?

Şimdiden teşekkürler.

8 Cevap

Bir dost çoğunlukla kendini yetiştirmiş programcısı gibi, ben sadece bunun arkasında herhangi bir özel yetki olmadan, benim fikir verebilir.

Ben hiçbir yan etkileri olan bir ifade kullanıyor yaparken üçlü koşullu operatörü (? :) Mükemmel kabul edilebilir olduğunu bulmak. En kısa sürede size karşı başka bir şey yapmak bir şey yapmak için bir karar temsil kullanmaya başlamak gibi, (benim görüşüme göre) bunu kötüye sensin.

Kısacası, kontrol yapıları kod akışını yapılandırılmasında ve operatörler ifadeler içindir. Sürece bir şeyleri bu şekilde tutar gibi, kod okunabilir kalır.

Koşullu operatörü (bazen üçlü operatörü olarak adlandırılan, ancak teknik olarak doğru değil, Marc'ın yorumlara bakınız) gerçekten bir "alternatif kontrol yapısı" değil, bir kaç önemli farklar var:

  • Koşul operatörü, bir operator ve bir değer sağlar, bir ifadede kullanılır.
  • / Başka bir kontrol yapısı ise, (elbette) kendi üzerinde herhangi bir değer döndürür.
  • Bir koşullu operatörü alternatifleri de deyimler olmalıdır.
  • Bir if-else yapısı alternatifler tabloların keyfi bir sayı olabilir.

Tabii ki benzerlikler de vardır:

  • Her bir koşullu ifade değerlendirir.
  • Sadece uygun alternatif (ifade ya da blok) koşullu boolean değerine göre değerlendirilir.
  • Hem artık "geçiş gibi" ifadeleri oluşturmak için türünün diğerleri ile birlikte zincirleme olabilir.

Eğer yan etkiler için alternatif ifadeler değerlendiren Genel olarak, eğer (bu işi yapmak yerine bir değer döndürmek için), sonra bir koşullu operatörü kullanarak bir if-else yapısını kullanarak daha bakıcılarına daha kafa karıştırıcı olabilir.

Tüm aşağıdaki doğruysa, bir koşullu kullanın:

  • Sizin koşullu ve alternatif ifadeler anlamak kolaydır.
  • Ifadelerin hiçbiri herhangi bir yan etkileri vardır.
  • Sen ek davranış gelecekte alternatifler üzerinde (yani yan etkileri veya ek ifadeler) gerekmez.

Verilen gibi örnek bir Üçlü koşul iyi bir kullanımıdır.

Şüphe, bir if-else kullanın. Başka bir tür olarak koşullu düşünme dikkat if-else ve içine ait olmayan şeyleri tıkmak için çalışıyorum. Bu tamamen koşullu operatör insanları kapatır (eski kodunda bulunan özellikle) o şey türüdür.

Bu, bir üçlü sunumu olarak bilinir. Niyet bir üçlü operatörü ile açık ve özlü expressened olabilir o zaman ben bunu. Ben genellikle çizgi çizmek ve bileşik ifadeler sahip (fazla 1 && veya kombine | |)

Şunun için iyi:

var x = (someVar > 42 ) ? ThisFunction() : ThisOtherFunction();

Kötü:

var x = (someVar > 42 && anotherVariable.IsSafeForConsumption() && IsNotProcessing ) ? ThisFunction() : ThisOTherFunction();

Bahsettiğiniz sözdizimi genellikle the ternary conditional operator olarak adlandırılan ve bir if / else bloğu anlamsal eşit olduğunu ve sadece aynı gerçekleştirir.

Postadölesan yapıları overusing yönelik temel itiraz bu if / else yolu kullanarak gibi okunabilir olmayabilir biraz dağınık kaynak kodunu oluşturabilirsiniz olmasıdır. Bu, belirli sözdizimi hakkında bilmiyorum insanlar için geçerlidir. Bu insanlar eğer / else anlamak olduğunu varsaymak far more likely% 100 güvenli.

Koşullu operatörü en Devs oldukça aşina olmalıdır. Aslında, ben sadece kullanmak istiyorum:

x = y ? "foo" : "bar";

Ben takip etmek çok kolay buluyorum. ==true / ==false bool değerlerden oluşan için (IMO) overkill görünmektedir. Bir daha yaygın "New world" kullanım şöyledir:

if(12345 == someVar) {...} // etc

Bu "const == değişkeni" "=" "==" vs sorunu önlemek için, ancak C # booleans gibi sayıları tedavi etmez, çünkü bu bir sorun olduğu çok nadirdir, ve (daha sık görülür C #) net görmek için:

if(someVar == 12345) {...} // etc

Eğer ekstra özledim = genellikle derleme etmeyeceğiz.

Benim için bu konu bir çok programcı ortamda okunabilmesi ve sürdürülebilirlik biridir.

Başkasının kodunu okumak için varsa, ya da daha sonra geri gelmek için gidiyoruz eğer, bunu okunabilir yapmak gerekir.

Basit durumda tutmak sürece, üçlü operatörler karartılmış ve okunamaz hale için kullandığı kod kolay.

  • Basit tutun
  • Okumak bile biraz zor gelirse, içine Refactor ise {} else {}

Bu en temel senaryolarda kullanılan zaman hariç, bunu önlemek söyleyeceğim. 2 yapıları aynı tam MSIL için derlenmiş, neden anlamak zor birini kullanmak?

Üçüncül operatör aslında bir yana ek olarak, statement bunu alabilir bir ifadesi olarak davrandığından:

x = (y == true) ? "foo" : "bar";
string instructions = "Please can somebody go and get me a " + x;

ve bu dönüştürmek:

string instructions = "Please can somebody go and get me a " + 
                      ((y == true) ? "foo" : "bar");

Ek parantez gerekli olduğunu unutmayınız. Neden göremiyorum eğer kendiniz derlemek için deneyin!

Bu olması çok faydalı bir özelliktir ve ben bunu her zaman kullanabilirsiniz. Diğerleri yan etkileri, ya da okunabilirliği azaltır aşırı karmaşık ifadelerle ifadeler yazmak için değil belirttiğim gibi sadece dikkatli olun.

Biraz ilgisiz notta Allah aşkına hiç (Ben bunu birçok kez gördüm) bu kod yazmak gibi please dont:

if (y == true) {
   weWantAFoo = true;
}
else {
   weWantAFoo = false;
}

Bunun yerine bu yapmalıyım:

bool weWantAFoo = (y==true);

Bu if açıklamada bir başka yerde bir koşullu deyim kullanarak sadece bir örnektir.