“Eğer (0 == değer)…” iyiden daha fazla zarar vermez mi? [kapalı]


49

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

Her neyse, işte benim karşı olan argümanlarım:

  • Program kodunu okumanın doğal akışını bozar. Biz insanlar, "eğer sıfır ise" diyoruz ve "sıfır ise" diyoruz.
  • Modern derleyiciler, durumunuzda bir göreviniz olduğunda veya durumunuz sadece evet, yine de şüpheli görünen görevden oluştuğunda sizi uyarır.
  • Bir programcıysanız değerleri karşılaştırırken double = '=' koymayı unutmamalısınız. "!" Yazmayı da unutabilirsiniz. Eşitsizliği test ederken.

17
Ben de umurumda değil, ama kişisel evcil hayvan akranları listemden oldukça uzak.
Adam Crossland,

7
Ve programcılar bazen '=' ikiye kaçırabilirler. Yapması kolay ve gözden kaçırması çok kolay olan bir hata.
sange

8
Bu nasıl yapıcı değil ya da gerçek bir soru değil?
TheLQ

7
Bu kapandı, işte kısa görüşüm: insanlar yazmayı nasıl hatırlayabilir 0 == valueama yazmayı hatırlamaz ==? Demek istediğim, eğer düşünüyorsan, neden başlamak için doğru yazmıyorsun?
dr Hannibal Lecter

3
@ muntoo: Derleyicilere göre, pek çok şey "doğru", bunun çok iyi bir kriter olduğunu sanmıyorum.
dr Hannibal Lecter

Yanıtlar:


59

Ah, evet, "Yoda conditionals" ("Eğer sıfır ise, bu kodu çalıştırmanız gerekir!"). Tüysüz (1) gibi aletlerde "daha iyi" olduğunu iddia eden herkesi her zaman işaret ederim. Bu özel sorun 70'lerin sonlarından beri çözüldü. Çoğu modern dil, if(x = 10)bir boole atamasının sonucunu zorlamayı reddettiği için gibi bir ifadeyi bile derlemeyecektir .

Diğerlerinin dediği gibi, kesinlikle bir sorun değil, ancak bilişsel uyumsuzluğu biraz tetikliyor.


32
"Yoda koşullamaları" için +1. Aslında bunu LOL'dim. :)
Bobby Tables

3
Sipariş iyi olsa da, düz boolean cast yerine sıfıra karşılaştırmaya itiraz ediyorum if(!value).
SF.

1
Yani şartlı bir atama içinde bir hata mı düşünüyorsunuz?

4
“Çoğu modern dil bunu bile derlemeyecek” Sorun, bir boole atamasının sonucunu sessizce zorlayan bir dil kullanıyorsanız sorun ortaya çıkıyor. Bunu düşünebildiğim en popüler dil javascript olacaktır. Bu yüzden her zaman Java'da bile yoda koşullarını kullanıyorum, böylece javascript yazarken bunu yapmayı unutmam. İkisi arasında, problem yaratabilecek (ve olmuş) olacak kadar yeterince geçiş yapıyorum.
Sam Hasler,

3
Derlenmeyecek bir derleyici bilen var mı if (0 == x)?
Kristopher Ives,

56

İğrenç çünkü küçük ama göze çarpan bir zihinsel vergi uygular.

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

Ben görürsem 123 == x, ben zihinsel ayrıştırmak yoludur:

  • 123- ne olmuş yani? eksik bilgi
  • == - 123, 123, neden test ettin?
  • x- Tamam, işte endişelendiğimiz şey bu. Sadece şimdi içeriğim var.
  • Yeniden düşünmeye geri dönün 123ve x'in neden bununla karşılaştırıldığını öğrenin .

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

  • x- Bağlam sağlar, durumun ne hakkında olduğunu biliyorum. Gerisini görmezden gelmeyi seçebilirim. Önceki akıştan yola çıkarak neden ve neyin geleceği konusunda iyi bir fikrim var (ve eğer farklıysa şaşırın).
  • == - Ben de öyle düşünmüştüm.
  • 123 - Evet.

Kesinti küçüktür (basit bir örnekte), ancak her zaman bunu fark ettim.

Önce değeri koymak , örneğin dikkat çekmek istiyorsanız iyi bir fikir olabilir if (LAUNCH_NUKES == cmd). Normalde amaç bu değildir.


5
Kesinlikle. Doğal dillerde, sabit her zaman aynı sebepten ötürü son gelir: eğer ışık kırmızı ise ...
mojuba

2
@ mojuba Doğru, neredeyse evrensel. İşin garibi, nesnenin konudan önce geldiği birkaç doğal dil var (OVS / OSV siparişi), ancak hepsi belirsiz.
dbkk

1
Öte yandan, bazılarımız değişkenden önce sembolleri okuma eğilimindeyiz. Onlar daha göz alıcı. Bu yüzden ayrıştırmadan =veya ayrıştırmadan ==önce 123ya da xbaşımdan kodu İngilizceye çevirmek için can sıkıcı olmayacağım bile.
Izkata

Ayrıca, çoğu derleyici, uygun bir şekilde istemediğiniz takdirde, ekstra parantez kullanmadıkça, bu nedenle problemsiz bir çözümü çözmeye çalışır.
Deduplicator

47

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

Kötü Alıştırma? Borçlu, en iyi ihtimalle. Basit savunma programlaması.

Uykuya dalmaya değer mi? Hayır.


8
Ve okuduğumda, kodlama tarzını tartışmak için benim için en önemli neden olan kodu hemen anlıyorum. Tamamen katılıyorum, uyumayı kaybetmeye değmez.
Jeff Siver

17

Bu temelde flaimbait.

Hayır, iyiden daha fazla zarar vermez. Basit.

Daha fazla kelime?

Derleyici argümanı? Şey, belki de - seni kendinden kurtarmak için derleyiciye çok fazla güvenme.

İyi - "Sen unutmamak gerekir" duh yapamıyor, hiçbir tabii ki bu arada ben yorgun, ben iki farklı dil kullanmak zorunda kaldı ve bazen, sadece bazen onca gün kodlama oldum ediyorum olmamalı insanı - bir hata.

Bu tür davranışların amacı, savunuculuğu, orada olmamasıdır, çünkü sigorta yaptırmaktan daha fazla hata yapmayı beklemiyorsunuzdur, çünkü kaza yapmayı umuyorsunuz ... ama kapsanmayı seversiniz.

Okunması zor? İyi bir programcının (= her türlü kötü varsayımı yapan) kablolu == kabloya sahip olması gerektiğinden ama aynı şekilde kendi kendine iyi bir programcının 0 == değerini okuyamadığından şikayet ediyorsunuz.

Zarar vermez, potansiyel faydaları vardır, saçma bir soru, başkalarının isterlerse ve devam etmeleri durumunda bunu yapmalarına izin verin.


6
0 == değerinin, programlama çalışmalarına başlamadan önce cebir okuyanlar için doğal olmadığını düşünüyorum.
mojuba,

4
Bu tür bir nokta değil - evet, haklı değilsiniz ama aynı derecede büyük bir şey, programcılar olarak yazdıklarımız doğal bir dil olarak birikmiyor ve bu da neyi nasıl yorumladığınızla ilgili görüyorsunuz
Murph

4
Bravo .. gerçeğini cabası çünkü o doğal olmayan okur sen dolayısıyla potansiyel hataları yakalamak, buna yakın dikkat eğimlidir.
mocj

7
@mocj - Bu nedenle, kodumuzu okuyan kişilerin kodumuzu gerçekten okuması gerektiğinden emin olmak için kodun tamamını mümkün olduğunca gizlemeliyiz ?
Kaz Ejderha

6
@mocj - Buna minnettarım, ama argüman Yoda koşulunu okurken "beyin kekemesi" nin iyi bir şey olduğu yönündeydi. Soruyu soruyorum, eğer öyleyse, tüm kodları "beyin kılçığı" na yol açacak şekilde mi yazmalıyız? Orijinal soru
Kaz Ejderha


10

Bütün olarak 'ne bir = unutursam?' Diye düşünmedim. Gerçekten çok fazla ağırlık tuttum. Evet, bir yazım hatası yapabilir, ancak hepimiz yazım hatası yaparız, kodlama stilinizi değiştirmek aptalca görünür çünkü bir hata yapmaktan korkarsınız. Neden tüm değişkenlerinizi ve işlevlerinizi küçük harflerle noktalamadan küçük harf yapmazsınız, çünkü bir gün büyük harfle yazmayı ya da altını unutmayı unutabilirsiniz.


5
Sorunun amacı bu değil, nokta "zararlı mı" - değil. Çok küçük bir tahriş, en kötüsü, ancak zararlı değildir.
Murph

1
Dinamik dillerde - kesinlikle bir sembolü yanlış
yazabilir ve sonradan hatanızın

3
tüm saygımla, bir gece ya da iki saatini geçirip kaynağını bulduğunuzda (C ++ kodunda) = = yerine bir = olur, biraz ağırlık taşır.
DevSolo

2
@DevSolo: Bunun kariyerinizde bir ya da iki kez gerçekleşmesi gerektiğini düşünüyorum, ama bundan daha fazlası değil
mojuba

9

Bazı insanlar bir şartlı şeyin tam olarak ne yaptığını netleştirmek için kullanır. Örneğin:

1. Yol:

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 argümanların tersine çevrildiğini, testin kendisinden önceki bir testin (koşullu) noktasını gösterdiğini düşünüyor.

Aslında, iki şekilde de umursamıyorum. Stil hakkında evcil hayvanlarım var ve en büyüğü tutarsızlık. Yani, aynı şekilde yapın, sürekli olarak ve kodunuzu okumayı umursamıyorum.

Kendine özgü tarzı olan altı farklı insanın aynı anda üzerinde çalıştığı noktaya kadar karıştırın, biraz sinirleniyorum.


4
İkinci örnek beni "ha?" İlki çok daha okunaklı. Harika bir örnek. :)
Mateen Ulhaq

6

Bana göre basit bir şartlandırma. (90'lı yıllarda) C ve C ++ 'ı öğrenen biri olarak, buna alıştığım ve nedenleri derse alınmış olmasına rağmen kullanmaya başladım.

Bir kez "sabit" için sol tarafa bakmak için "şartlandırılmış" olduğunuzda, bu ikinci doğa olur.

Aynı zamanda sadece eşdeğerlik (veya olumsuzlanmış eşdeğerlik) için kullanıyorum, daha büyük / daha az değil.

Wonko'nun cevabı w / @ tamamen katılıyorum.


5

Yararlı bulduğum durumlardan biri if 'nin değişken kısmının oldukça uzun olduğu ve değerleri görmenin kodu okumayı kolaylaştırmasıdır. Noktalı ad alanı dilleri bunun en iyi örneklerine sahiptir.

Örneğin, tek oturum açma ile çalıştığım bir şey, belirli bir tür hata oluştuysa ve belirli bir yolla düzeltildiyse, iki eşzamanlı oturuma sahip olabileceğiniz bir durum vardı; böyle bir şey:

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

Kuşkusuz bu örnekte, bunu yapmanın başka yolları da var, ancak bu ilk sayı sürümünün potansiyel olarak daha okunaklı olduğu bir durum olacaktır.


2
Bence anahtar kelime "bunu yapmanın başka yolları";)
mojuba

Bu durumda evet, ancak bazı durumlarda bu hala en okunaklı sonuçtur. Benim tek noktam, bunu yapmak için dil veya ide davranışları ile savaşmaktan başka meşru sebepler ve tip-o
Bill

Dürüst olmak gerekirse, Yoda koşullarında <= ve> = için zorluk çekiyorum. == işareti farklı bir meseledir, çünkü kafamda sadece sembolleri değiştirebilirim, ama sizin durumunuzda, count () 'nin 2'ye eşit veya daha büyük olması gerektiğini hatırlatmam gerekiyor ve bu türetmek için can sıkıcı bir durum. daha küçük veya eşit bir işaret.
Alex,

3

Ve yine de hatalar meydana gelir. Ve bazen bir döngü operatöründe, eşitliği başka şekilde kontrol edebileceğiniz bir görev yapmak istersiniz ya da en azından kullanmak standart bir uygulamadır.

Biraz tuttum. Takip ettiğim tavsiyeler (büyük olasılıkla Kod Tamamlandı) karşılaştırmalarda solda daha düşük değerin ne olması gerektiğini korumaktır. Bunu daha önce bir meslektaşımla tartışıyordum ve biraz çılgınca olduğunu düşünüyordu ama buna çok alıştım.

Yani şunu söyleyebilirim:

if ( 0 <= value )

Ancak şunu da söyleyebilirim:

if ( value <= 100 )

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


1
Ben if(y > x)her zaman kullanmaya alışkınım . yBir sabittir sürece .
Mateen Ulhaq

Bunu bu şekilde yapardım, fakat bir keresinde soldaki en düşük değerlere sahip olma fikrini aldığımda, kodumun bir bakışta daha okunaklı olduğunu gördüm.
glenatron
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.