常に書いている私の同僚がいます:
if (someBool == true)
それは私を壁に押し上げます!私はそれを大量に作るべきですか、それとも単に落とすだけですか?
これは冗長なコードであり、生死を分けるものではありません。しかしながら....
頻繁に発生する場合は、someBool
の命名方法に問題がある可能性があります。適切な名前を付けることで、==true
の必要性をなくすことができます。
if(IsSomeCondition)
または
if(hasCondition)
または
if(somethingExists)
例えば。
私が見るとき someBool == true
、私は仕方がないのですが、プログラマーがevaluationの考え方を内面化していないように感じます。これはかなり根本的な欠陥です。
しかし、私が大学で数年間夏に子供たちにプログラミングを教えるのに費やした子供たちは真剣に式を評価する精神的な練習を習得していなかったため、このような式を頻繁に書いたため、私の見方はゆがんでいます。彼らがコンセプトを理解すると、冗長性が明らかになった。
そうでなければ有能なプロのプログラマにとって、これはおそらくそうではありません。それはおそらく、彼らがプログラミングの初期に開発した悪い習慣にすぎず、決して揺れ動いたことはありません。しかし、誰かがインタビューで最初に目にしたのは、それでも少し怖いでしょう。
それも私を狂わせますが、私は建設的な方法で彼らに冗長性について言及し、同意しなくてもそれを破棄します。
または、このアプローチを試すこともできます:
あなた:ブール値を評価するために次のコード規則を使い始めることができますか?
if (someBool==true)&&(true==true) {}
Them:なぜそうするのでしょうか?そのステートメントの後半は冗長であり、常にtrueと評価されます。
あなた:ジョージの言うとおりです。愚かな私。それでは、冗長性のないバージョンを使いましょう。どう?
if (someBool) {}
些細なことが同僚との最大の問題である場合、自分はかなり幸運であると考える必要があります。
あなたは間違いなくこの悪い習慣を止めるべきです。そっと...
二重等号を書くことを忘れがちで、コードを次のようにします。
if (someBool = true)
たとえばC#では、これは警告ではなくエラーを生成します。したがって、警告をエラーとして処理しない限り、コードは実行されます。変数をtrueに設定し、常に条件を入力します。
私はあなたに同意しますが、私はここで悪魔の擁護者を演じます:
言語と変数名に応じて、x == trueが適切です。
静的型付けと整数型の型強制を伴う言語で、次の状況を考えます。
if (actionsAllowed){
//do actions, since they are allowed
//...
}
コードのこのセクションを読んだ人は、actionsAllowedがブール変数であることをすぐには理解できないかもしれません-許可されたアクションの数を表す整数の場合もあります。したがって、== trueを追加することにより、xがブール値であり、整数がブール値に強制変換されていないことが明らかになります。
if (actionsAllowed == true){
//do actions, since they are allowed
//...
}
Null許容ブール値についてはどうですか?
bool? MyFlag = null;
if (MyFlag == true)
;
if (MyFlag) // error, doesn't compile!
;
通常、コーディング規約がプロジェクトを大幅に妨害していない限り、コーディング規約をあまり重視しないでください。私は、コード領域や主要なアンダースコアなどの小さなものに対して、多くの激しい議論がエスカレートするのを見てきました。
そうは言っても、条件付きステートメントに== true
を追加しても問題はありません。実際のところ、私は否定的な条件をテストするときに先頭の感嘆符とは対照的に== false
を使用する癖があります。もっと読みやすいと思います。
確立された慣習がある場合、私は変更する理由がない限りそれに従うと言います。ただし、大きな悪臭を放つ価値はありません。
ああ。私はその人です。恥、恥。それは私が学んだ方法であり、私が頭の中で「自動フォーマット」する方法です。 Joelの優先構文を使用するのは、ブール変数に「is」のような動詞接頭辞が付いている場合のみです。 「is」、「can」、「did」などの動詞が必要です。または、動詞「equals」を提供する==が必要です。私はその習慣を破ることは決してないかもしれないので、あなたが路上で私に「こんにちは」と言わなくても理解します。
「ブールマッドネスコード」を思い出してください。
if(someBool == true)
otherBool = false;
else
otherBool = true
の代わりに:
otherBool = !someBool
個人的には、Cベースの言語で「しない」という言い方を強く嫌います。その小さな感嘆符は見落としがちです。
したがって、私はそれを完全に書きます:
if (someCondition == false) {
それをしばらく読んだ後、私も対称性が欲しい
if (someCondition == true) {
したがって、not
の代わりに!
を使用したCのアーティファクトだと考えてください。
言語に依存しますが、それは通常悪い考えです...
Cでは、neverでこれを行います。テストしている値が偽(ゼロ以外)ではなく、「真」として定義されている単一の値と等しくない状況を見つけるのは簡単すぎます。
Rubyでは、ブール値trueを除くすべてで失敗することが確実である場合にのみ、これを実行してください。
C++およびブール型のその他の静的言語では冗長であり、=
の代わりに==
を誤って入力するとプログラミングエラーが発生したり、コメントに記載されているプロモーションエラーが発生したりする可能性があります。
あなたはそれが悪いと思う?どうですか:
if(someCondition) {
return true;
} else {
return false;
}
私は好む
if (bVal)
または
if (!bVal)
また、それを持ち出すと人々が怒るのではないかと心配しているので、私はそれを忘れることを勧めます。ごめんなさい!
あなたは彼がそれを間違っていると彼に言うべきです。
その
if(true == someBool){
}
もし彼がこれを忘れてしまったら、彼は彼の作文スタイルに大きな問題を抱えています。
いかがですか
if (x == "true")
なぜIS文字列なのか?!
実際、それがnull可能である場合、x == trueのテストが必要になります。 :)
私はそのようなコードを書きます!
理由は次のとおりです。
「if bla == true」は文のように読みますが、「if bla」は多くの場合そうではありません。実際のコードを読むとき、それはただ間違っているように聞こえます。
また、コンパイラはifブロックでの割り当てについて警告するので、== trueを使用しても実際には危険はありません。 (=と混同)
また、「== true」を書かない人は、「== false」に「!()」を使用しますか?本当に醜いです。また、「== false」を使用する場合、2つの異なる方法で真実を検証する代わりに、「== true」も使用することは非常に一貫しています。
あなたはチームの一員として働いているので、これらのことを一緒に解決する必要があることを忘れないでください。 「他の人とうまく遊ぶ」は、小学校の後でも重要な人格特性です:)
通常、「== true」は省略しますが、チームのコーディング標準に含まれていない限り、1分でも説明する価値はほとんどありません。
私は主にC#開発者として同意しますが、常にそうであるとは言えません。たとえば、Javascriptでは、===は型の合体を実行します。したがってvar x =とすると、次のようになります。
if(x) --> true
ながら
if (x === true) --> false
JSでもif(x == true)を使用しないので、これは==とは異なると思いますが、何かを考えるだけです。
この種のことは、私のオフィスで出てきた別の点に触れています。
bool b = false;
C#では、bool b;で十分であり、bをfalseに初期化します。ただし、上記の行を記述する方がより明示的であり、とにかく最適化中にコンパイラーによって取り除かれる必要があります。
ですから、私が言いたいのは、何がいい習慣であるかが必ずしもそれほど明白ではなく、その多くは好みと言語機能/癖に要約されます。
ああ、でも、変数がnull可能である場合はどうでしょうか。 (ブール?)
一部の言語(C#)では、キャストまたは「true」との比較が必要になります。
bool? isAccepted = true;
if((bool)isAccepted)
{...}
if(isAccepted == true)
{...}
若い人はルールを知っていますが、古い人は例外を知っています;)
最新のC#
では、null-able bool
を扱っている場合は、次のことを行う必要があります。
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.
}
トライステートが問題でない場合は、通常、何かをtrue
/True
と比較する理由はありません。ただし、Python
およびC/C++
などの他のいくつかの言語では、bool以外の式でif
を実行できます。これらの言語には、整数、ポインタ、リストなどをtrueまたはfalseとして解釈するための独自のルールがあります。時にはそれを望まないでしょう。たとえば、このPython snippet:
x = True
y = 'abcdef'
z1 = x and y
z2 = (x == True) and (y == True)
ここでz
はTrue
である必要がありますが、z2
はFalse
である必要があります。さて、Clojure
言語はこれに別の方法でアプローチします-and
関数は必ずしもbool
に評価されるわけではありませんが、if
はそれを処理できます。
言語に関係なく、何かをTrue
またはFalse
と比較するときはいつでも、コメントする価値があります。
そのようなコーディングは以前にも間違った方法で私をこすっていたでしょう。例の識別子の名前は「someBool」ですが、ブール値であることが保証されていない変数でそのコーディングスタイルを誤って使用すると、意図しない動作が発生する可能性があります。 「someBool」の値が正確に「true」または「false」でない場合、結果はfalseになります。
私はこのようなコーディングスタイルが原因でこの1年間で非常に微妙なバグに遭遇しました。あなたは「どうしてそれが間違っているのだろう?」と思うでしょう。 「(var)」や「(!var)」などのよく理解されている式についても、動作を確認せずにそれらを読み取ったりコーディングしたりすることは同じです。
そこで、コードベースにこのようなバグが存在しないようにし、将来このような微妙なバグが偶然に発生する可能性を減らすために、いくつかのコーディング標準を導入しました。
新しいスタイルに準拠していないコードをクリーンアップすることで、そのような微妙なバグのいくつかのインスタンスを特定して修正しました。
次の理由により、これをActionScript 2で常に使用しなければなりませんでした(確かに今は死んだ言語です)。
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)
{
}
したがって、ほとんどの場合、具体的に指定するのが最善でした。
同意する。これは、特に強い型付け言語では冗長な構成です。
ブール値の別の誤用を追加するために、私はこの種の構築をJavascriptで何度も見つけました(特に100行以上のスパゲッティのようなモンスター関数で):
//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
}
この言語には厳密な型定義がないため、一部のプログラマーはfalse|undefined
の値をいじる必要がないことを好むようです。
私はこのようなコードを持つ同僚がいます:
if(something == true)
そして、ある種のテスト/デバッグのために、このブロックを呼び出さないようにしたいので、次のように変更します。
if(something == true && false)
そして、時々それを次のように変更します:
if(false)
最悪なのは、このタイプのデバッグがときどき私にこすれてしまい、他の開発者が読むのが本当に悪いことです!
コードベースでは一貫性が重要です。したがって、あなたのスタイル、つまり、組織で使用されているmostlyを使用する必要があります。好みのスタイルを会社の公式コーディングガイドラインの一部にしてください。すでにガイドラインに記載されている場合は、それに従ってください。
(とは言っても、それは本当に私を苛立たせますが、おそらくそれを大いに活用するのに十分ではありません)。
私は余分な== trueを置かない方が好きですが、誤ってそれを含めて気づかない場合があります。人はそれらに気づかず、誤って配置した可能性があります。私は自分のコードを再読み込みし、余分な== trueを配置したことに時々気づくので、その== trueを削除します。私は時々それに気付かず、私がそれを冗長に配置したと言っている誰かを喜んで歓迎します。
私の同僚はif
a loop
と呼びました。私はそれについて話すために生きました。
WPFで多くのプログラミングを行うと、この習慣を身に付けることができます。大量のブールを使用しますか? (nullable bool)変数をif (someBool == true)
またはif (someBool ?? false)
のいずれかで記述する必要があります
うまくいけば、Ifステートメント内で他の型をブール型に強制変換できないVB.NETのようなOption Strict Onのような賢明な言語を使用していると思います。その場合、強制型変換が発生しないため、「== true」(またはVBでは「= True」)を追加する必要はありません。非ゼロをチェックしたい場合は、それを明示的に記述します(つまり、「If x <> 0」)。
どうですか:
int j = 1;
for (int i=1; i>=j; i++) ...
うん、見たよ。
初心者の開発者にとってはコードのにおいです。彼らはまだブール条件を習得/内部化する必要がなく、真または偽の条件に明示的に評価する必要があります。
JavaScriptでは、メソッドが期待することを説明する十分なドキュメントがある場合はif(bool)
を優先します...しかし、trueのevaluationが変数の存在を意味する場合は、数値1またはブール値に等しい確かに、それはより厳しいです。
JSを強く入力すると、柔軟性が低下します。タフコール。強く型付けされた言語、ハンマーを置きます。そうでなければ、なぜ彼はそれをするのですか?
実際、あなたの答えがあります。理由を尋ねてください。その後、彼を修正します。
彼を教える機会としてそれを使用してください。あなたがそうすれば、彼はあなたをもっと尊敬するでしょう。誰かに同じことをしてもらいたくないですか?
調査によると、冗長性の多いコードはエラーと強く相関しています。これが 興味深い論文 に関する問題です(PDFアラート)。
ブール値を比較すると、実際に大きな問題が発生する可能性があります。最近、次のようなインターンコードに遭遇しました。
if(foo == false && bar == 2) {...}
さて、これは非常に簡単に思えますよね?次のように単純化します。
if(!foo && bar == 2) {...}
違う。この場合、操作の順序により、&&
が最初に評価されることが決まります。つまり、これは実際に次のように評価されます。
if(foo == (false && bar == 2))
としても知られている
if(!foo)
チェックするはずだったその余分なもの、bar == 2
は完全になくなりました。そのため、someBool == [true|false]
を含むコードレビューは絶対に承認しません。
(逆のステートメント== true
および||
も問題の原因となることがわかります。)
はい、これは一種のプログラマの考え方です。 「if条件」は記号=、<、>を含む式がないと存在しないと考えるときはいつも、「関数の戻り」のように本当に苦労する状況を見てきました。
if(RowsAffected> 0){trueを返す; } else {falseを返す; }
プログラマーはリアルタイムの角度からコードを監視する必要があります。
Cの1つの問題は、ブール値に0と1以外の値を使用するという伝統があることです。
typedef enum { WHATEVER = 1 << 4 } MyFlags;
if (flags & WHATEVER) {
}
または、-1がtrueであることにも依存します。
問題は、APIを作成していると言うことです。
struct foo {
unsigned int bar : 1;
};
void myapi_foo_set_bar(struct foo *foo, int bar) {
foo->bar = bar;
}
ここで、barが0または1に正規化されていない場合、ビットフィールドに適合せず壊れます。
myapi_foo_set_bar(foo, flags & WHATEVER); /* broken */
質問のようにそれらをTRUEまたはFALSEと比較するなど、非正規boolが壊れる他の方法も見つけることができます!
とにかく私が思いついているのは、ブール値を正規化することはしばしば意味があるということです:
foo->bar = bar != FALSE;
もちろん、これはC特有の奇妙さです。
はい、ブール値の名前がブール値であることを伝える必要があるため、これは大きな問題です。次のコードがある場合は、こう言います。
bool arrayIsEmpty = array.length == 0;
if (arrayIsEmpty) { ... }
読みやすいので、== true
、評価の少ない人やプログラマーでも。
プログラミング規約は必ずしも「正しい」または「間違っている」とは限りません。それらは、プログラムを読んでいる人に見慣れた構造を与えるために存在します。そのため、起こり得る間違いがよりはっきりとわかります。すべてが少し間違っているように見えると、問題を「見る」ことが困難になります。
重要なことは、規約がすべての参加者によって明確に定義され、同意されていることです(「私がここで作業している間、この規約を使用することに同意します」のような場合でも)。
もちろん、ブール値をtrueと比較する特定のケースは明らかに間違っており、すべての犠牲を払って回避する必要があります。 ;-)
If(var == false)と書いたのは、varを書いた後、バックトラックしたり書いたりしないので!その後ろ。また、== falseがより明確に見えるようにする方法も気に入っています。
ただし、== trueは奇妙です。大したことをする意味があるかどうかわかりません。彼が他の人にそれを使わせたり、コーディング標準にしたりしない限り、私はそうは思いません。
次の例を使用して、同僚にアプローチすることができます。
if ((x == 3) == true) {
...
}
彼は== true
は冗長であり、次のように書き直す必要があります
if (x == 3) {
...
}
x == 3
はすでにブール式です。
今彼にsomeBool == true
例ですが、少し書き直しました:
if ((someBool) == true) {
...
}
someBool
はすでにブール値であるため、前の例と比較すると、== true
もこの例では冗長です。したがって、次のように書き直す必要があります。
if (someBool) {
...
}
私はいつも次のようなコードを置き換えるので面白いです:
if(foo) {
と:
if(true == foo) {
if(false == foo) {
しかし、私がこのコードを使用したのは、ほとんどの場合、明確な変数名がなかったためです。
これはあなたのニッカーのいくつかを札束に入れるかもしれません。
ブール型の.IsTrueおよび.IsFalseの拡張メソッドがあります。
だから私たちは書く
if(someBool.IsTrue())
-または-
if(someBool.IsFalse())
うん!そして、私は彼らを愛しています。コードを読むとき、それは私にはより明白になります。