必ずしも悪いわけではありません。基本クラスのメソッドは、多くの場合、サブクラスのオーバーライドポイントとなる空のメソッドを呼び出します。例:Cocoa TouchのUIViewには-didAddSubview:
、デフォルトバージョンでは何もしないと文書化されているメソッドがあります。UIViewの-addSubview:
メソッドは-didAddSubview:
、サブクラスがそれを実装して何かを行うことがあるため、何もしなくても呼び出す必要があります。もちろん、何もしないメソッドとその理由は文書化する必要があります。
歴史的な理由で空のまたは役に立たない関数/メソッドが明らかに存在する場合は、削除する必要があります。よくわからない場合は、ソースコードリポジトリ内の以前のバージョンのコードを見てください。
- 個別のクラスファイル、オブジェクト、またはメソッドで行われる冗長チェック。
コンテキストがなくても大丈夫かどうかはわかりません。同じ理由でチェックが明確に行われる場合、特に両方のチェックで同じアクションが実行される場合、責任の明確な分離がなく、リファクタリングが必要になることがあります。両方のチェックの結果のアクションが同じでない場合、条件が同じであっても、おそらく2つのチェックが異なる理由で実行されており、おそらく大丈夫です。
次の間に大きな違いがあります。
if (1) {
// ...
}
そして:
if (foo() == true) {
// ...
}
どこでfoo()
常に戻るtrue
。
最初のケースは、人々がデバッグしているときによく起こります。を使用しif (0) {...
て、バグを切り分けようとしているときにコードのチャンクを一時的に削除し、次にを変更し0
て1
そのコードを復元するのは簡単です。if
あなたはもちろん、終わったら削除する必要がありますが、それはそのステップを忘れるために、またはあなたはいくつかの場所でそれをやった場合は、1つまたは2を欠場するのは簡単です。(後で検索できるコメントでこのような条件を識別することをお勧めします。)唯一の害は、将来発生する可能性のある混乱です。コンパイラがコンパイル時に条件の値を決定できる場合、それは完全に削除されます。
2番目のケースは許容可能です。によって表される条件をfoo()
コード内の複数の場所からテストする必要がある場合、たった今foo()
常に真実であったとしても、それを別の関数またはメソッドに分解することが正しいことです。foo()
最終的にを返す可能性がある場合false
、メソッドまたは関数でその条件を分離することは、コードがその条件に依存するすべての場所を識別する1つの方法です。ただし、これを行うと、foo() == false
条件がテストされずに後で問題が発生する可能性があるというリスクが生じます。解決策は、false
ケースを明示的にテストする単体テストを必ず追加することです。
これは、歴史の産物であり、コードのレビュー中またはソフトウェアの定期的なプロファイリングによって特定できるもののように聞こえます。意図的に作成できると思いますが、誰かが実際にそれを意図的に行うと想像するのは大変です。
if (false) {...}
ブロックはコードをコメントアウトするのに最適です!</