Ben popüler olamayacağım ve Evet diyorum, bu kötü bir uygulamadır. Eğer kodunuzun işlevselliği, şartlı mantığı uygulamak için ona güveniyorsa.
yani
if(quickLogicA && slowLogicB) {doSomething();}
iyidir ama
if(logicA && doSomething()) {andAlsoDoSomethingElse();}
kötü ve elbette kimse kabul edemez mi ?!
if(doSomething() || somethingElseIfItFailed() && anotherThingIfEitherWorked() & andAlwaysThisThing())
{/* do nothing */}
Sebep:
Her iki taraf da yalnızca mantığı gerçekleştirmemek yerine değerlendirilirse, kod hatalarınız. Bunun bir sorun olmadığı, 've' işlecinin c # ile tanımlandığı, yani anlamın açık olduğu iddia edildi. Ancak bunun doğru olmadığını iddia ediyorum.
Sebep 1. Tarihsel
Temel olarak, kodunuzda işlevsellik sağlamak için bir derleyici optimizasyonuna (başlangıçta ne kastedildiği gibi) güveniyorsunuz.
C # dilinde olmasına rağmen, dil özellikleri booleni garanti ediyor 've' operatörü kısa devre yapıyor. Bu, tüm diller ve derleyiciler için geçerli değildir.
wikipeda çeşitli dilleri ve kısa devre almak onların listeler http://en.wikipedia.org/wiki/Short-circuit_evaluation birçok yaklaşımlar vardır gibi. Ve bir kaç ekstra sorun da buraya girmiyorum.
Özellikle, FORTRAN, Pascal ve Delphi bu davranışı değiştiren derleyici bayraklarına sahiptir.
Bu nedenle: Kodun serbest bırakılması için derlendiğinde çalışıp hata ayıklama için veya alternatif bir derleyici vb.
Sebep 2. Dil farklılıkları
Vikipedi'den görebileceğiniz gibi, boolean operatörlerinin onu nasıl idare etmeleri gerektiğini belirleseler bile, tüm diller kısa devrelere aynı yaklaşımı benimsemez.
Özellikle VB.Net'in 've' operatörü kısa devre yapmaz ve TSQL'in bazı özellikleri vardır.
Modern bir 'çözümün' javascript, regex, xpath vb. Gibi bir dizi dili içermesi muhtemel olduğu göz önüne alındığında, kod işlevselliğinizi netleştirirken bunu göz önünde bulundurmalısınız.
Sebep 3. Dil içindeki farklılıklar
Örneğin VB'nin satır içi, eğer kendi durumundan farklı davranıyorsa. Yine modern uygulamalarda kodunuz, örneğin arkasındaki kod ve bir satır içi web formu arasında hareket edebilir, anlamdaki farklılıkların farkında olmalısınız.
Sebep 4. Özel bir işlevin parametresini kontrol etmek için boş örneğiniz
Bu bir çok iyi bir örnek. Bu, herkesin yaptığı bir şeydir, ama düşündüğünüz zaman aslında kötü bir uygulamadır.
Kod türünüzü önemli ölçüde azalttığı için bu tür bir çek görmek çok yaygındır. Bir kimsenin kod incelemesinde ortaya çıkacağından şüpheliyim. (ve tabii ki yorum ve puanlardan popüler olduğunu görebilirsiniz!)
Ancak, birden fazla nedenden ötürü en iyi uygulamayı yapamamaktadır!
Onun çok sayıda kaynaklardan berrak, o en iyi uygulama kullanmadan önce geçerliliği için parametrelerini kontrol etmek ve geçersiz oldukları takdirde bir istisna etmektir. Kod pasajınız çevre kodunu göstermiyor ancak muhtemelen aşağıdaki gibi bir şey yapıyor olmalısınız:
if (smartphone == null)
{
//throw an exception
}
// perform functionality
Sen bir işlev aradığınız içinde koşullu deyimi. İşlevinizin adı yalnızca bir değeri hesapladığını ima etse de, yan etkileri gizleyebilir. Örneğin
Smartphone.GetSignal() { this.signal++; return this.signal; }
else if (smartphone.GetSignal() < 1)
{
// Do stuff
}
else if (smartphone.GetSignal() < 2)
{
// Do stuff
}
En iyi uygulama önerebilir:
var s = smartphone.GetSignal();
if(s < 50)
{
//do something
}
Bu en iyi uygulamaları kodunuza uygularsanız, gizli koşullu kullanımı kullanarak daha kısa kod alma fırsatınızın kaybolduğunu görebilirsiniz. En iyi yöntem, akıllı telefonun boş olduğu durumda işlemek için bir şeyler yapmaktır .
Bunun diğer yaygın kullanımlar için de geçerli olduğunu göreceksiniz. Ayrıca şunu da hatırlamamız gerekiyor:
satır içi koşullamalar
var s = smartphone!=null ? smartphone.GetSignal() : 0;
ve boş birleşme
var s = smartphoneConnectionStatus ?? "No Connection";
daha net bir şekilde benzer kısa kod uzunluğu işlevsellik sağlayan
tüm puanlarımı desteklemek için sayısız bağlantı:
https://stackoverflow.com/questions/1158614/what-is-the-best-practice-in-case-one-argument-is-null
Yapıcı parametre doğrulama C # - En iyi yöntemler
Null beklemiyorsa null olup olmadığını kontrol etmeli mi?
https://msdn.microsoft.com/en-us/library/seyhszts%28v=vs.110%29.aspx
https://stackoverflow.com/questions/1445867/why-would-a-language-not-use-short-circuit-evaluation
http://orcharddojo.net/orchard-resources/Library/DevelopmentGuidelines/BestPractices/CSharp
kısa devreyi etkileyen derleyici bayrağı örnekleri:
Fortran: "sce | nosce Varsayılan olarak, derleyici XL Fortran kurallarını kullanarak seçilen mantıksal ifadelerde kısa devre değerlendirmesini gerçekleştirir. Sce belirtilmesi, derleyicinin XL Fortran olmayan kuralları kullanmasına izin verir. "Varsayılan, buruntur."
Pascal: "B - Kısa devre değerlendirmesini kontrol eden bir bayrak direktifi. Kısa devre değerlendirmesi hakkında daha fazla bilgi için bkz. Kullanım Kılavuzunda belgelenmiştir). "
Delphi: "Delphi varsayılan olarak kısa devre değerlendirmesini destekler. {$ BOOLEVAL OFF} derleyici yönergesi kullanılarak kapatılabilir."