== doğru büyük bir anlaşma yapmak?


105

Sürekli yazan bir meslektaşım var:

if (someBool == true)

Beni duvara sürükledi! Büyük bir şey yapmalı mıyım yoksa sadece düşürmeli miyim?


12
Açık veya if (some_flag == true)örtük olanı tercih ederim if (is_something)veya if (has_something). Değişken isimlerini not edin.
fredoverflow

69
Meslektaşınıza, türünün someBool == truede boolean olduğunu hatırlatın , bu yüzden aynı mantıkta olması gerekir if ((someBool == true) == true).
Mike Seymour

2
@GSto: Sanırım biliyorsundur, ancak PHP'de bir şeyi bir bool'a “atmak” için bunu yapabilirsiniz ve gerçekten yararlı olabilir.
zneak

2
@ Zneak Veya daha net ve kullanımlı olabilirsiniz $var = (bool) some_expression. Ve çoğu durumda, PHP gerekli dönüşümleri dinamik olarak yapacağı için bile önemli olmaz.
waiwai933,

4
Her zaman sabit birinci, eğer (gerçek == someBool) kontrol Kazayla = yerine == ait daktilo [evet şaka yapıyorum!]
Steven A. Lowe

Yanıtlar:


126

Bu sadece gereksiz kod, yaşam veya ölüm değil. Ancak....

Çok oluyorsa, nasıl someBooladlandırıldığına dair bir sorun olabilir . İyi bir isim, ihtiyacını ortadan kaldırmak için uzun bir yol kat edebilir.==true

if(IsSomeCondition)

veya

if(hasCondition)

veya

if(somethingExists)

Örneğin.


Bu bana en doğru geliyor. Her şey netlik ve adlandırma sanatı ile ilgili, orijinal sözdizimi o kadar da kötü değil ama bu daha iyi kodlamanın doğru yolu.
TJB,

2
Beni yen! Uygun adlandırma olmadan, daha özlü eşdeğerlik hiç bir anlam ifade etmiyor.
Troy Hunt

4
someBool == trueNetlik için birkaç kez eski kod kullanmak zorunda kaldım . Ama sıfırdan if (isSomething)
yazarsam

Kabul ediyorum, adlandırma bunu çözse bile, adın SomeBool olduğunu varsayarsak, herhangi bir anlamı olabilir ve herhangi bir türde olabilir (bir dizideki boole miktarına eşit bir tamsayı?). Booleanların bir tür varoluşsal fiile ihtiyacı var, aksi takdirde kendi başlarına okuması her zaman zor olacak.
Morgan Herlocker

Kabul ediyorum, her şey okunabilirlikle ilgili. Değişkenler iyi adlandırılmışsa, buna ihtiyacınız yoktur. İfade daha iyi okursa "== true" için giderdim, aynı zamanda (çirkin) "if (! ())" Yerine "== false" kullanırsanız tutarlıdır.
Ronny Brendel

71

Ben gördüğümde someBool == true, ben yardım edemem ama programcı fikrini içselleştirilmiş değildir hissetmeye değerlendirmede oldukça temel eksikliktir.

Bununla birlikte, bakış açım çarpıtıldı çünkü üniversiteye öğretim programlarında birkaç yaz geçirdim, çünkü çocuklara sık sık böyle ifadeler yazdılar çünkü bir ifadeyi değerlendirmenin zihinsel egzersizinde ustalaşmamışlardı. Kavramı karıştırdıklarında, artıklık belirgin hale geldi.

Başka türlü yetkin bir profesyonel programcı için, bu muhtemelen durum böyle değil. Muhtemelen, programlamanın ilk günlerinde geliştirdikleri kötü bir alışkanlıktı ve asla sarsılmadı. Ama birisinin röportajda yaptığını ilk gördüğüm şey olsaydı, yine de beni biraz korkuturdu.


Bunu bu kadar çabuk alışkanlık haline getiremem. Profesyonel programcıların ağzından gerçekten çarpıcı şeyler duydum. Genellikle grokkers, biri tarafından kısa bir süre sonra "bu nasıl oldu hiç çalışmıyor?"
dash-tom-bang

12
Gönülden değerlendirme hakkında katılıyorum. Durumda merak ettim, "Nerede durur?" if (((((x == true) == true) == true)! = false) // ve diğerleri ...
yawmark

1
Bazen yazardım if (c == true) return true; else return false;, ama zamanın% 99'u (% 1'i orada hiç kimseyi kaçırmadığımdan emin olamadığımdan beri) hemen fark edeceğim ve her şeyi değiştireceğim return c. Çoğu yetkin programcının, alışkanlıklarını kariyerlerinin başlarında geliştirdiği takdirde benzer bir şey yapmasını beklerim. Beklemeyeceğim şey bir wtf tepkisi.
Lie Ryan

1
Oh oğlum, düşünce sanatı. Ben tam anlamıyla geçen hafta bizim kod temeli bu rastladı. if (!someCondition) { someCondition = false; }Kodumuzdaki bazı imkansızlıkların yanı sıra bazı (fazla, birçok) fazlalıklar da gördüm, ancak bu birisinin gerçekten yazdığını düşünmek için çok ağırdı. Hatta birden çok kez.
Anthony Pegram

1
Sadece bir kaçını if(x) x=true;gereksiz x=!!x;
kılmadığını

58

Bu da beni çıldırtıyor, ancak yapıcı bir şekilde kendilerine fazlalıktan bahsettiğimi ve sonra da aynı fikirde olmasalar bile bıraktıklarını söyleyebilirim.

Alternatif olarak bu yaklaşımı deneyebilirsiniz:
Siz: Boolean'leri değerlendirmek için aşağıdaki kod kurallarını kullanmaya başlayabilir misiniz?

if (someBool==true)&&(true==true) {}

Onlar: Neden bunu yapalım? Bu ifadenin ikinci yarısı gereksizdir, her zaman doğru olarak değerlendirilirdi.

Sen: George, haklısın. Aptal ben. O zaman tüm yedeklilik olmadan bir sürümle gidelim. Peki ya

if (someBool) {}

6
Evet anlaştım. Aptalca, ama dövüşlerini seçmelisin, ve bu kod gerçekten meslektaşının ne yapması gerektiğini yapıyor. Olmayan bir söz - "Neyin yanlış YANLIŞ ?!" bir çeşit, sonra bırak. "İf (someBool! = True)" ya da "if (! SomeBool == true)" ya da bu tür diğer toplantılar gibi saçmalamaya başlarlarsa da, toplanmaya değer bir mücadele olabilir ....
BlairHippo

3
(SomeBool == false) nasıl olduğundan daha kötü (bazıBool == doğru)?
FinnNk

5
true=truederlemek değil, siz olamaz atamak için true;-)
fredoverflow

1
Alıştım if(somebool == false)veya alıştım !=ama her zaman yanlış ve doğru değil. Gereksiz buluyorum, ancak kodlama standardı if()bir fonksiyona benzeyen ısrar ettiğinden beri , parenler arasındaki boşlukları okumama yardım ediyor. Kendi başıma, bir bool bool, ama uçmuyor if (somePointer); if (somePointer != NULL)Bir işaretçi bool olmadığından tercih ederim .
dash-tom-bang

5
Okunabilirlikle ilgili, mantıksız veya (mikro) fazlalık değil
Ronny Brendel

45

Bence, çok önemsiz bir şey iş arkadaşlarınızla en büyük probleminizse, kendinizi çok şanslı saymalısınız.


5
Eh, mükemmellik için gayret etmek için iyi, ama kesinlikle kızartmak için daha büyük balık vardır
TJB

3
Sanırım tartışmaya değer her sorun hakkında bunu söylüyorsun.
Dave Van den Eynde,

2
Potansiyel olarak daha büyük sorunların göstergesidir. Garajınızdaki tavandaki küçük kahverengi leke büyük bir sorun gibi görünmeyebilir, ancak büyük bir su sızıntısı olabileceğiniz anlamına gelebilir.
Josh,

42

Bu kötü alışkanlığı kesinlikle durdurmalısın. Nazikçe...

İkili eşit işaretler yazarak, kodun içine dönüştüğünü unutmak kolaydır:

if (someBool = true)

Örneğin C # 'da bu sadece bir uyarı üretecektir, bir hata üretmeyecektir. Bu nedenle, uyarıları hatalar gibi işlemezseniz, değişkeni true değerine ayarlayın ve her zaman koşulu girin.


6
Bu alakalı bir tartışma değil. Böyle bir dilde çalışıyorsanız, gerçek olanı diğer tarafa taşıyabilirsiniz. Soru, doğru olanı dahil edip etmemekle ilgili.
Cam,

8
@ Cam: Asıl noktayı kaçırıyorsunuz. Geriye mantık önermiyorum.
Guffa

15
@ Cam - Bunun ne zaman sorun olabileceğine dair gerçek bir dünya örneği veriyor. Bunun oldukça alakalı olduğunu söyleyebilirim.
ChaosPandion

1
@Guffa Cam çok doğru. Bu, if bloklarında == (anyType) komutunu kullanmayı bırakmanın bir nedeni değildir.
Ronny Brendel

2
@Ronny: Hayır, herhangi bir türle olamaz (dil bir koşul olarak herhangi bir türe izin vermediği sürece). Deyim if (answer = 42) {}ifadesi bool olmadığı için sadece derleme değil.
Guffa

21

Seninle aynı fikirdeyim ama burada şeytanın avukatı oynayacağım:


Dile ve değişkenin adına bağlı olarak, x == true uygundur:

İntegral tipler için statik yazım ve zorlama türü olan bir dilde aşağıdaki durumu göz önünde bulundurun:

if (actionsAllowed){
    //do actions, since they are allowed
    //...
}

Kodun bu bölümünü okuyan bir kişi, actionsAllowed öğesinin bir boolean değişkeni olduğunu hemen fark etmeyebilir - aynı zamanda izin verilen işlemlerin sayısını temsil eden bir tam sayı da olabilir. Yani == true ekleyerek, x'in bir boole olduğu ve bir boole zorlanan bir tamsayı olmadığı anlaşılır:

if (actionsAllowed == true){
    //do actions, since they are allowed
    //...
}

13
okunabilirlik == GoodThing
Muad'Dib

5
eğer ((okunabilirlik == GoodThing) == doğru) ...
JoelFan

1
bool isGoodThing = okunabilirlik? true: (kodlamaStandartlar? true: (internalizationOfConcept? true: false));
johnc

17
Yani değişkeni yeniden adlandırın actionsAreAllowed.
Graeme Perrow,

9
Yazarak if (x) { ..., bunun zaten xbir boolean veya bir boole dönüştürülebilir olduğunu iddia ediyorsunuz . Sen buna ne diyorsun önemli değil.
Daniel Earwicker

15

Null bools?

bool? MyFlag = null;

if (MyFlag == true)
    ;  

if (MyFlag)  // error, doesn't compile!
    ; 

if (MyFlag.Value)
johnc

1
Bütün dillerin boşuna boole sahip değildir, ve bunu yapanların çoğu ikinci yapınızı kabul eder.
zneak

1
@johnc: "if (MyFlag.Value)", MyFlag null ise (MyFlag.HasValue seçeneğini işaretleyerek test edebilirsiniz), bir istisna atabildiği için istediğinizi yapamayabilir.
Ludovic Chabant,

4
Bu benim neable bools ile evcil hayvan peeve :)
Jarrod Dixon

3
bool? isValid = null; if (isValid ?? yanlış);
skolima

11

Genelde, söz konusu sözleşme bir şekilde projeyi önemli ölçüde engellemediği sürece, kodlama sözleşmelerinden çok fazla bir şey yapmak istemezsiniz. Birçoğunun, kod bölgeleri ve öncü alt çizgiler kadar küçük olan şeylerin üzerinde arttığını gösteren bir argüman gördüm.

Söyleniyor, == trueşartlı bir ifadeye ekleme ile ilgili herhangi bir sorun görmüyorum . Nitekim, == falseolumsuz koşullar için test yaparken önde gelen bir ünlem işaretinin aksine kullanma alışkanlığım var . Bence daha okunaklı.

Yerleşmiş bir kongre varsa, değişmek için bir neden olmadığı sürece onu takip ediyorum derim. Ancak, hakkında büyük bir kıyameti arttırmaya değmez.


1
Dilinize bağlı olarak, someValue, doğru olarak değerlendirilse bile mutlaka true değerine eşdeğer olmayabilir. Örneğin, (9 == True)Python'da false olarak değerlendirir ve C ++ 'ta benzer olduğunu düşünürdüm.
dash-tom-bang

Kod bölgeleri ve önde gelen alt çizgiler, insanları yüzüme vurmak istememe neden oluyor.
MGOwen,

11

Ack. Ben o adamım Utanç, utanç. Bu şekilde öğrendim ve kafamda “otomatik biçimlendirme” yapıyorum. Joel'in tercih edilen sözdizimini kullandığım tek zaman, bool değişkeninin "is" gibi bir fiil önekine sahip olmasıdır. Fiilene ihtiyacım var, "olabilir," "olabilir," "yaptı" ya da "eşit" fiilini sağlamak için == 'ye ihtiyacım var. Asla bu alışkanlığı bozmayacağım, o yüzden sokakta bana 'merhaba' demiyorsanız anlayacağım.


7
Bu kötü bir şey değil. Gerçek metin gibi okuyan kod, örtük foo'dan çok daha iyidir. Bu alışkanlığı okunabilirlik uğruna saklayın.
Ronny Brendel

11

bana "boolean delilik kodunu" hatırlat, bunun gibi

if(someBool == true)
   otherBool = false;
else
   otherBool = true

Onun yerine:

 otherBool = !someBool

Bu komik, her tarafını kirleten bir sistemi sürdürmek zorunda kaldım. Beni çıldırttı.
Tjaart

8

Şahsen C tabanlı dillerde "hayır" deme şeklinden kesinlikle hoşlanmıyorum. Bu küçük ünlem işareti göz ardı etmek çok kolaydır.

Bu yüzden tam olarak yazıyorum:

if (someCondition == false) {

Bunu bir süre okuduktan sonra, ben de simetri istiyorum.

if (someCondition == true) {

Öyleyse !bunun yerine C kullanarak bir yapı olarak düşünün not.


3
C ++ aslında sahipnot operatörü ve (eğer standart başlığı içermesi kez bu kadar C yapsa <iso646.h>). Eğer istemiyorsanız (veya olamaz) bu başlığı kullanın (veya Java veya C # ile sıkışmış iseniz), ünlem işaretinden sonra bir boşluk koyarak öneririz ise: if (! condition). Bu biraz daha dikkat çekici hale getirir.
Konrad Rudolph

1
Java yapıyorum. notbir seçenek değil.

6

Dile bağlı, ama genellikle kötü bir fikir ...

C de, bunu asla yapma. Test ettiğiniz değerin yanlış olmadığı (sıfır olmayan), aynı zamanda "true" olarak tanımlanan tek değere eşit olmadığı bir durum bulmak çok kolaydır.

Ruby'de, bunu yalnızca Boolean true dışındaki her şeyde başarısız olmak istediğinizden eminseniz yapın.

C ++ ve bool türü ile diğer statik dillerde, gereksiz, ve sen yanlış yazan zaman programlama hatalarına yol açabilir =yerine ==, veya promosyon hataları yorumlarda belirtildiği gibi.


Aslında, atama operatörünün bir değer döndürdüğü dillerde ... C ++ gibi ... if (b == true) {sadece gereksiz değil. Yanlışlıkla atanmış olabilir, çünkü aynı zamanda biraz risklidir trueiçin b.
Stephen C

4
C ++ 'da sadece gereksiz değil, tehlikelidir. Eğer yazarsanız if (b == true)ve bbir bool değil, tip dönüşümleri yanlış bir yol. A boolnormalde 1 değerine sahip uygun bir integral tipine yükseltilen bir integral tiptir. Eğer yazarsanız, int b(2); if (b == true)o zaman, doğru sonucu verecek olan tipte zorlanmak yerine karşılaştırma amacıyla 1 değeri olan bir değere truedönüşür . intbbool
David Thornley

@DavidThornley, derleyicinizdeki uyarıları açın. Uyarıların hata olarak ele alınması, kaçınmaktan ziyade daha iyi savunma programlama tekniğidir ==.
Abyx

5

Sence bu kötü mü? Peki ya:

if(someCondition) {
  return true;
} else {
  return false;
}

2
Oğlum bunu kaç kez gördüm. Bu, ReSharper gibi bir araç için iyi bir durumdur.
Meslek

Evet - eğer clods kiralarsanız, ReSharper'ı satın alın.
Kirk Broadhurst

4

tercih ederim

if (bVal)

veya

if (!bVal)

Ben de, onu büyütmenin insanları kızdıracağından korkuyorum, bu yüzden tavsiyem unutmak. Üzgünüm!


4
Kutsal olan her şeyin aşkı için, ilk etapta olmasa if (!bNotVal) da , sürece if (bNotVal). İsimlerdeki ugh negatifleri okumak her şeyi zorlaştırır.
dash-tom-bang

2
Bool olacak bir devin NotConnected olduğunu biliyordum; if (isNotConnected == true) ... yuck
johnc

4

Ona yanlış yaptığını söylemelisin.

onun

if (true == someBool) {

}

eğer birini unutursa = yazma stilinde büyük sıkıntıda.


3

Peki ya

if (x == "true")

Neden bu kadar zor ?!


Bazı eski php kodu üzerinde doğru çalışıyorum ve bazen böyle bir şey buluyorum if(preg_match('/title/', implode($_POST))){. PHP, yeterince söyledi, daha iyi bir iş bulmam gerekiyor.
Keyo

4
Evet, ben de görüyorum (x == "1"), ama bu genellikle kötü db tasarımına yapar.
atfergs

xKullanıcı girişi geldiğinde benzer yapılar kullandım (örneğin, yapılandırma dosyası veya web servisi). Bununla birlikte, genellikle başka gerçeklere dayanan değerlere de izin veriyorum, bu yüzden daha çok benziyorif x.lower().strip() in ["true", "yes", "on", "1"]
eswald 19:10


3

Böyle bir kod yazıyorum!

İşte nedeni:

"if bla == true" bir cümle gibi okur, burada "if bla" birçok durumda böyle olmaz. Sadece gerçek kodu OKUYOR yanlış sesler.

Ayrıca derleyici eğer bloklar halinde yapılan ödevler hakkında uyarır, bu yüzden == true komutunu kullanmanın hiçbir tehlikesi yoktur. (= ile karıştırarak)

Ayrıca "== true" yazamayanlar, "== false" için şunu kullanın! Gerçekten çok çirkin buluyorum. Ve eğer "== false" kullanırsanız, gerçeği doğrulamak için iki farklı yol kullanmak yerine, "== true" ifadesini kullanmak sadece çok tutarlıdır.


3
Eğer "eğer bla" bir cümle gibi okunmuyorsa ... bu değişkeninizin tam olarak isimlendirilmediği anlamına gelir ... bunda yanlış olan: if (userHasRights) doSomething ()
JoelFan

"Çoğu durumda". Evet haklısın. Yeniden adlandırma da iyi. "İf (QWidget :: acceptDrops () == true)" ile yeniden adlandırma imkanınız yok. belki de ismini söylemek iyi olurduAcceptDrops () ... Çok fazla güçlük çekiyor (ve herhangi bir API'de bu ihmali kuralını kullanarak tutarlı olmak imkansız), yani diğer "ile tutarlı olmak = = ne olursa olsun" -ifs, İhmal etmemenizi şiddetle tavsiye ediyorum, bu yüzden farklı görünmüyor, dolayısıyla tutarlı görünüyor.
Ronny Brendel

3

Bir takımın parçası olarak çalıştığınızı unutmayın, bu yüzden birlikte çalışmanız gerekir. "Başkalarıyla iyi oynar" ilkokuldan sonra bile hala önemli bir kişilik özelliğidir :)


2

Genel olarak '== true' ifadesini çıkarır, ancak ekibinizin kodlama standartlarına dahil etmediğiniz sürece tartışmaya bile bir dakika değmez.


3
Ayrıca, ekibin kodlama standartlarındaysa, bu tür önemsiz şeylerden kurtulmak için standartları yeniden değerlendirmeniz gerekir.
JohnFx

Kabul! Sadece durumda olsa ...
FinnNk

2

Temel olarak C # geliştiricisi olarak hemfikir olsam da, bunun her zaman böyle olduğunu söyleyemem. Örneğin, Javascript'te, === tür birleşimini gerçekleştirir. Öyleyse var x = 3 varsayılırsa :

if(x) --> true

süre

if (x === true) --> false

Sanırım bu == 'den farklı. Çünkü JS’de bile kullanmam. (X == true) .

Ofisimde ortaya çıkan bu tür başka bir noktada dokunuşlar:

bool b = false;

C # 'de, bool; yeterli olacağını ve initalize ediyorum b için yanlış . Bununla birlikte, yukarıdaki satırı yazmak daha açıktır ve yine de optimizasyon sırasında derleyici tarafından sökülmelidir.

Bu yüzden, benim açımdan her şeyin çok açık olmadığı ve iyi uygulamaların ne olduğu ve ne kadar olmadığı açık olduğunu tahmin ediyorum.


bool b;yalnızca bbir alan olduğunda false değerini başlatır . Yerel değişkenleri açıkça başlatmalısınız.
Matthew Flaschen

+1 kabul etti. Diğer (betik) dilleri ile aynı sorun. Boolean trueveya yalnızca "true" için test etmek istiyorsanız açık olmanız gerekir . Örneğin, boş olmayan herhangi bir dize bazı dillerde kabul edilir, == trueancak kabul edilmez === true.
Martin Wickman

2

Ah evet, fakat değişken null ise? (Bool?)

Bazı diller (C #) 'true' dilini seçmeli ve kullanmalıdır.

bool? isAccepted = true;

if((bool)isAccepted)
{...}

if(isAccepted == true)
{...}

2

Genç kuralları biliyor, ama yaşlı istisnaları biliyor;)

Sonunda C#, bir ile başa null-able boolçıkıyorsanız, o zaman yapmanız gereken:

bool? x = null;
bool? y = true;
bool? z = false;
if (x == true || y == true || z == true) {
    // That was the only way that is reasonably readable that I know of
    // to accomplish this expression.
}

Tristat sorun değilse, genellikle true/ ile karşılaştırmak için bir sebep olmamalıdır True. Bununla birlikte, içinde Pythonve C/C++sizin gibi birkaç başka dilde ifbir bool olmayan ifadede gerçekleştirebilirsiniz. Bu dillerin tamsayıları, işaretçileri, listeleri vb. Doğru ya da yanlış olarak yorumlaması için benzersiz kuralları vardır. Bazen bunu istemezsin. Örneğin, bu Python kod parçasında:

x = True
y = 'abcdef'
z1 = x and y
z2 = (x == True) and (y == True)

Burada zolmalı True, fakat z2olmalıdır False. Şimdi, bir Clojuredil buna başka bir yoldan yaklaşır - orada andişlev mutlaka bir a'ya göre değerlendirilmez bool, bununla ifbaşa çıkabilir.

Ne olursa olsun dilin, her zaman kendinizi bir şeyler karşılaştırarak bulmak Trueya False, muhtemelen yorumlama değer.


İlk sorun, sahte değişken öncül IMO'dan korkunç değişken isimleri kullanarak kaynaklanıyor. Varsayalım x, y, z isimlendirildi notExceptButHasX, exceptNotButIsntY, doNotUnlessIsExceptZ? Bu probleminizde okunabilirliği nasıl sağlıyor? Eğer x, y, z, "isEnabled", "isEffective", "hasProperty" gibi bir isim verilmişse, ifadeniz veya ile isEnabled || isEffective || hasPropertykarşılaştırıldığında çok daha okunaklı hale gelir . truefalse
Thomas

1

Böyle bir kodlama beni daha önce yanlış bir şekilde ovalardı. Örnek tanımlayıcınız "someBool" olarak adlandırılsa da, bu kodlama stilini yanlışlıkla bir boolean olduğu garanti edilmeyen bir değişkende yanlışlıkla kullanmak, istenmeyen davranışlara neden olabilir. "SomeBool" değeri tam olarak "true" veya "false" değilse, sonuç yanlış olur.

Geçen yıl tanımlanması zor olan bir kodlama tarzının neden olduğu çok ince bir hatayla karşılaştım çünkü birinin gözleri bu tür yapılar üzerinde parlıyordu. "Nasıl yanlış olabilir?" Diye düşünürdünüz. Aynısı, davranışlarını doğrulamadan okuduğunuz veya kodladığınız "(var)" veya "(! Var)" gibi iyi anlaşılmış ifadeler için de geçerlidir.

Bu nedenle kodbasedeki bu tür böceklerin varlığını azaltmak ve bu ince böceklerin gelecekte bir anda yanlışlıkla sürünme ihtimalini azaltmak için birkaç kodlama standardı getirdim.

  1. Tüm ifadeler, amaçlarına göre parantez içine alınmalıdır.
  2. Tüm boolean testleri "suchBool! = False" gibi negatif olarak ifade edilmelidir.

Yeni stile uygun olmayan kodu temizleyerek, bu tür ince hataların birkaç örneğini tanımladım ve düzelttim.


1
Biraz Bool'un DOĞRU / YANLIŞ dışında bir şeyler yapabilmesi kötü kodlama uygulamasıdır.
AttackingHobo

@AttackingHobo, bir dilde boolean tiplere sahip olmama ve / veya istenen tam davranışı sağlamak için bir sınıf kullanmamanın tuzaklarından biridir.
Huperniketes

1

Bunu her zaman ActionScript 2'de kullanmak zorunda kaldım (kuşkusuz şimdi ölü bir dil), çünkü:

var something:Boolean = org.black.box.unknown.ThisMightNotExistYet();

// this is slightly ambiguous
if(something)
{
}

// because if you allow undefined you might actually mean
if(false != something)
{
}

// which can mean something different than
if(true == something)
{
}

// and comparing against what you actually MEAN is less script than
if(undefined != value && value)
{
}

Bu yüzden spesifik olmak neredeyse her zaman en iyisiydi.


1

Katılıyorum. Özellikle güçlü yazı dillerinde gereksiz bir yapıdır.

Booleanların başka bir suistimalini eklemek için, bu tür bir inşaatı Javascript'te (özellikle 100'den fazla satırda olduğu gibi spagetti benzeri canavar fonksiyonlarında) birkaç kez buldum:

//create the variable, not initializing it
var flag;
//...
//assing a value to the var, by the example 
flag=$("mycheckbox").selected;
//...

//and at the moment of use it:
if(flag!=true) {
   //code to execute when the checkbox is unchecked
}

Görünüşe göre, bu dilde katı bir tür tanımın bulunmamasından dolayı, bazı programcılar false|undefineddeğerlerle uğraşmak zorunda kalmamayı tercih ediyorlar .


1

Bunun gibi bir kodu olacak bir meslektaşım var:

if(something == true)

Ve sonra, bir çeşit test / hata ayıklama için, bu bloğu çağırmak istemeyecek, böylece onu değiştirecek:

if(something == true && false)

Ve sonra ara sıra değiştirecek:

if(false)

En kötüsü, bu tür hata ayıklama, zaman zaman üzerime sürtündü ve diğer geliştiricilerin okuması gerçekten kötü!


0

Tutarlılığın bir kod tabanında kral olduğunu söyleyebilirim. Bu nedenle, çoğunlukla kuruluşunuzda kullanılan stili kullanmalısınız . Tercih ettiğiniz stili resmi şirket kodlama kurallarının bir parçası yapmaya çalışın. Zaten kurallara uygunsa, sadece onu takip et.

(Bu söyleniyor, beni de gerçekten sinirlendiriyordu - ama büyük bir anlaşma yapmak için muhtemelen yeterli değil).


0

Ekstra == doğru yerleştirmeyi tercih etmiyorum, ancak bazen yanlışlıkla ekliyorum ve farketmiyorum. Kişi onları fark etmemiş ve yanlışlıkla yerleştirmemiş olabilir. Kodumu yeniden okudum ve bazen ekstra == true koyduğumu fark ettim, bu yüzden şunu kaldırdım == true. Bazen bunu fark etmiyorum ve mutlu bir şekilde bana gereksiz yere yerleştirdiğimi söyler.


0

peki ya:

int j = 1;
for (int i=1; i>=j; i++) ...

Evet, gördüm.

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.