it-swarm.dev

"İf (0 == değer) ..." faydadan daha fazla zarar vermez mi?

Bu, başkasının kodunda gördüğümde en çok nefret ettiğim şeylerden biri. Bunun ne anlama geldiğini ve neden bazı insanların bunu bu şekilde yaptığını biliyorum (“yanlışlıkla '=' yerine '=' koyarsam?). Benim için bir çocuk merdivenlerden inip basamakları yüksek sesle sayarken olduğu gibi.

Her neyse, işte bununla ilgili iddialarım:

  • Program kodunu okumanın doğal akışını bozar. Biz insanlar, "değer sıfırsa" değil "sıfır değerse" diyoruz.
  • Modern derleyiciler, durumunuzda bir ödeviniz olduğunda veya aslında durumunuz sadece bu ödevden oluşuyorsa sizi uyarır, evet, yine de şüpheli görünüyor
  • Bir programcıysanız değerleri karşılaştırırken double '=' ifadesini koymayı unutmamalısınız. Siz de "!" eşitsizliği test ederken.
50
mojuba

Ah, evet, "Yoda koşullu" ("Değer sıfır ise, bu kodu çalıştırmalısınız!"). Lint (1) gibi araçlara her zaman "daha iyi" olduklarını iddia eden herkese işaret ederim. Bu özel sorun 70'lerin sonundan beri çözülmüştür. Çoğu modern dil, bir boole'ye atamanın sonucunu zorlamayı reddettiği için if(x = 10) gibi bir ifade bile derlemez.

Diğerlerinin söylediği gibi, bu kesinlikle bir sorun değil, ama biraz bilişsel uyumsuzluğu kışkırtıyor.

59
TMN

İğrençtir çünkü küçük ama fark edilir bir zihinsel vergi uygular.

İnsanlar soldan sağa neredeyse tüm programlama dillerinde (ve çoğu doğal dilde) okurlar.

123 == x Görürsem, zihinsel olarak ayrıştırma şeklim:

  • 123 - ne olmuş yani? eksik bilgi.
  • == - 123, 123, neden test edelim ...
  • x - tamam, bu yüzden endişeliyiz. Sadece şimdi bağlamım var.
  • 123 Ve x'in neden onunla karşılaştırıldığını tekrar düşünün.

x == 123 Zihinsel ayrıştırma gördüğümde:

  • x - Bağlam sağlar, koşulun ne hakkında olduğunu biliyorum. Gerisini görmezden gelmeyi seçebilirim. Önceki akışa dayanarak, neden ve ne olacağı konusunda iyi bir fikrim var (ve farklıysa şaşırtın).
  • == - Ben de öyle düşünmüştüm.
  • 123 - Evet.

Bozulma küçüktür (basit bir örnekte), ama ben her zaman fark ettim.

Dikkat çekmek için istediğiniz değerini ilk olarak koymak iyi bir fikir olabilir; if (LAUNCH_NUKES == cmd). Normalde bu niyet değildir.

56
dbkk

Zararlı? Hayır. Her iki şekilde de çalışır.

Kötü Uygulama? En iyi şekilde tartışmaya açık. Basit savunma programlaması.

Üzerinde uyku kaybetmeye değer mi? Hayır.

47
Wonko the Sane

Bu temelde flaimbait.

Hayır, yarardan çok zarar vermez. Basit.

Daha fazla kelime?

Derleyici argümanı? Eee, ish, belki de - sizi kendinizden kurtarmak için suçluya çok fazla inanmayın.

"Unutmamalısın" - iyi duh - hayır bu arada yorgun olmamalısın, bütün gün kod yazıyorum ve iki farklı dil kullanmak zorunda kaldım, bazen, sadece bazen insan olarak hata yaparım.

Bu tür davranışların amacı, savunmacı olması, orada olmaması çünkü sigortadan daha fazla hata yapmayı beklediğiniz için, çünkü çökmeyi umduğunuz için ... ama eğer Nice'ini örtbas ederseniz.

Okunması zor? Eğer iyi bir programcı (= her türlü kötü varsayımlar yapar) == donanım kablolu olması gerekir ama aynı iyi programcı 0 == değeri okuyamıyor?

Zarar vermez, potansiyel faydaları, aptalca bir sorusu vardır, başkalarının isterse devam etmesine izin verin.

17
Murph

Buna zarar demezdim, ama iğrenç. Yani hayır öyle demezdim.

11
whatsisname

Bütün 'ne bir = unutursam?' gerçekten çok fazla ağırlık tuttu. Evet, bir yazım hatası yapabilirsiniz, ancak hepimiz yazım hataları yaparız, tüm kodlama stilinizi değiştirmek aptalca görünür, çünkü bir hata yapmaktan korkuyorsunuz. Neden tüm değişkenlerinizi ve işlevlerinizi hiçbir noktalama olmadan küçük harfe çevirmiyorsunuz, çünkü bir şeyi büyük harfle yazmayı veya bir alt çizgiyi unutmayı unutabilirsiniz?

10
GSto

Bazı insanlar bunu bir koşulun ne yaptığını netleştirmek için kullanır. Örneğin:

Yol 1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

Yol 2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

Bazı insanlar ikinci örneğin daha özlü olduğunu ya da tersine çevrilen argümanlar testin kendisinden önce bir testin (koşullu) amacını gösterir.

Aslında her iki şekilde de umursamıyorum. Evcil hayvanımın stil hakkında kabartması var ve en büyüğü tutarsızlık. Yani, aynı şekilde, tutarlı bir şekilde yapın ve kodunuzu okumaya aldırmam.

Aynı anda üzerinde çalıştığı kendi farklı stiliyle altı farklı insanın göründüğü noktaya kadar karıştırın, biraz rahatsız oldum.

9
Tim Post

Bana göre, bu basit şartlanma. (90'lı yıllarda) C ve C++ öğrenen biri olarak, nedenleri öğrenilmiş olsa bile, alıştım ve hala kullanıyorum.

Eğer "sabit" için sol tarafa bakmak için "koşullandırılmış", bu ikinci doğa olur.

Ben de sadece denklik (ya da negatif eşdeğerlik) için kullanıyorum, büyük/küçük değil.

Wonko'nun cevabı ile tamamen katılıyorum.

6
DevSolo

Yararlı bulduğum bir örnek, if değişken kısmının oldukça uzun olduğu ve değerleri görmek kodun okunmasını kolaylaştırır. Noktalı ad alanı dilleri bunun en güzel örneklerine sahiptir.

Örneğin, tek oturum açma ile üzerinde çalıştığım bir şey, belirli bir hata türü gerçekleştiğinde ve belirli bir şekilde kurtarıldıysa, iki eşzamanlı oturumun olabileceği bir durum vardı, bu yüzden içindeki bir işleyici eklemek zorundayım. böyle bir şey:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

Kuşkusuz bu örnekte bunu yapmanın başka yolları da vardır, ancak bu, ilk sayı versiyonunun potansiyel olarak daha okunabilir olduğu bir durum olacaktır.

5
Bill

Ve yine de hatalar oluşuyor. Ve bazen bir döngü işlecinde eşitliği başka türlü kontrol edebileceğiniz bir atama istersiniz veya en azından onu kullanmak standart bir uygulamadır.

Biraz tutun. (Muhtemelen Code Complete'ten) takip ettiğim tavsiye, karşılaştırmalarda soldaki daha düşük değerde ne olması gerektiğini korumaktır. Bunu daha önce bir meslektaşımla tartışıyordum ve biraz çılgınca olduğunu düşündüm ama buna çok alıştım.

Yani şunu söyleyebilirim:

if ( 0 <= value )

Ama şunu da söyleyebilirim:

if ( value <= 100 )

Eşitlik soldaki değişkenle kontrol etme eğiliminde olacağım, sadece daha okunabilir.

3
glenatron