嘘のコードに気をつけるべきですか?


9

これは、回答のディスカッションとこの質問のコメントを参照しています。業界でのドキュメントへの嫌悪とは何ですか?。その答えは、「コードは嘘をつくことができない」ので、ドキュメントの代わりに頼りになる場所であるべきだと主張しました。いくつかのコメントは「コードは嘘をつくことができる」と指摘しました。少なくとも部分的にはドキュメントの扱いが不十分で不適切であるために、双方に真実があります。

嘘のコードを探して、既存のドキュメントと比較する必要がありますか?それともそれは通常それがしている必要があることのための最良の情報源ですか?それがアジャイルコードである場合、それは嘘をつく可能性が低くなりますか、それともそのコードはまったく嘘をつきませんか?


1
「嘘」の意味を教えてください。コンテキストを取得するために、別の質問のコメントを参照する必要はありません。
user16764 2013年

@ user16764他のスレッドを見ないで最初に思い浮かぶのは、
Underhanded

ドキュメンテーションがコードがfooを行うべきであり、コードがbarを行うと言っている場合、それはそのbarがコードが行うべきことを意味しますか?または、コードは常に正しいため、ドキュメントを決して読んでいないため、barが正しいアクションであると想定していますか?
thursdaysgeek 2013年

コードがbarとして受け入れられた場合、ドキュメントは間違っていて古くなっています。しかし、fooとbarが密接に関連していて、ユーザーが期待どおりに問題を解決しないことにユーザーが気付いていない場合、おそらくfooのドキュメントに誤りはないでしょうか?言い換えると、コードは本当に、コードが実行するべきことのすべてであり、すべてであるのでしょうか?
thursdaysgeek 2013年

回答:


9

素人の言葉で:

はい、うそをつくコードを検索し、それが真実を伝えるようにする必要があります。しかし、それをドキュメントと比較することによってではありません。それは嘘をつく文書を検出するための方法でしょう。

コードが存在する可能性のある方法はいくつかありますが、そのうちのいくつかを紹介します。

  • 満たされない条件のために実行されないコードのブロック。コードはそれがどれほどのことをするかについてあなたに嘘をついています。
  • 不必要な複雑さを追加するコードは、問題が実際にどれほど複雑かについてあります。
  • 命名規則のないコードは、それが実際に行っていることとは異なる何かを行うと誤解させるためにあります。

短いほど、それは少なくなります。それは自明です。

コードが複雑でないほど、透過性が高くなります。だから、それは少ないです。

難解な構文のトリックはたくさんあります。明確で段階的なアルゴリズムを優先します。彼らはあまり嘘をつきません。

優れた静的コード分析ツールは、あるコードを見つけるのに役立ちます。

また、優れた自動テストバッテリーは、コードに強制的に真実を伝えます。


4
The shorter and terser the code is, the less it lies. It's self evident. そんなことはほとんど言わない。私の経験では、コードが短く簡潔であるほど、一般に不正な関数呼び出しでそれらを非表示にすることにより、コードの下に敷設する機会が増えます。
メイソンウィーラー

@MasonWheelerあなたは正しいです。「簡潔」な部分を編集しました。
TulainsCórdova2013

「命名規則のないコードはありません」には納得しません。それは確かに悪いですが、それがあなたに何も言っていないなら、それはどのように嘘をつくことができますか?"私は言っていない!" 頑固に閉塞的で有益ではありませんが、欺瞞的ではありません。確かに「嘘」は命名規則が存在する場合ですが、コードが実際に実行するものと一致しない方法で使用されます。たとえば、ハンガリー語(yuck!)を使用しているpが、変数のプレフィックスが時々ある場合ポインタではありません。
Steve314 2013年

2
実際、あなたが提案していることは、単に「嘘」というよりも「哲学」と表現する方がよいでしょう。理論は冗長で複雑になる傾向があるため、論理的な欠陥を確認することは困難です。また、表面的に賢く自信があるため、愚かに見えても疑問に思われることはありません。
Steve314 2013年

別の例:基礎となる言語またはランタイムプロパティを変更するコード、たとえばプリミティブの動作の再定義またはマスキング。
JustinC 2013年

6

コードは嘘をつかない。

コードに含まれるのは、ドキュメント、QA、または顧客の発言に関係なく、プログラムが現在実行していることです。特に、コードがリリースされてしばらくの間フィールドにある場合は、その予想される動作を無視してはなりません。

コードは確かに正しくない可能性があります。それは確かにその名前や組織で誤解を招く可能性があります。それは確かに判読できません。

しかし、あなたはあなたのコードが何であるかのための真のソースかどうやってあなたはそれをやっていた...あなたはそれが実際にやっているかを知る必要がある場合に考えたもの、それが行うように設計されたもの、行うことになっているもの、ないではないではありません、コードに移動します。


意図的に欺瞞的であるが、徹底的に正しい場合、あなたは嘘をついていないと考える学派があります。それだけが考えの対象ではありません。たとえば、Aldert Vrijによる古い版のDetecting Lies and Deceitがあります。これが最初に行うことの1つは、嘘と欺瞞のさまざまな定義を検討することです。いずれにせよ、それは一般的な理解であるため、部分的には、正しいが意図的に誤解を招くステートメントを含めることを選択します。
Steve314 2013年

申し訳ありませんが、「しかし、それは確かに正しかった」と言っても、うそつきと呼ばれることができないという意味ではありません。人々が反論しなくても、彼らはまだそれを知っています。
Steve314 2013年

@ steve314-pssh。元の質問はコメントに関するものでした。コメントを支持するためにコードが誤解を招くように名前が付けられている(そしてコメントが古くなっているという非常に一般的なシナリオを無視している)これらのまれなシナリオのためにわらを構築することはばかげています。
Telastyn 2013年

1
私はそれに同意します-あなたが主張することについて議論しているのではなく、それをしている間にあなたが使用する「嘘」の明白な定義だけです。コード嘘をつくことができます-コンパイラーではなく、確かに人間の読者に。場合によっては意図的な目標でさえあります。難読化されたCコンテストなどは比較的無害な例です。私はuser61852への私のコメントで示唆するように、哲学。コンパイラが嘘を見抜いているからといって、それが嘘ではないという意味ではありません。
Steve314 2013年

@Telastynフィルターでリダイレクトを実行して、実際に空白でステップスルーが発生し、そのメソッドから呼び出されないコードにアクセスして、戻ってこないことはないと思いますか?神、私は!@#$ Java開発者がJavaを使用するのを嫌います。
Erik Reppen 2013年

0

あなたはいくつかの質問をします。

私たちは嘘のコードに目を光らせるべきですか?

もちろん!

[コード]を既存のドキュメントと比較する必要がありますか?

他の回答で述べたように、多くの場合、これはコードではなくドキュメントで問題を見つけることになりますが、それによって害が生じることは決してありません。

それとも、[コード]は通常、実行する必要のある最も優れたソースですか?

それは、常にそれが何のための最高のソースですされてやって。コード何をすべきかについての最良のソースは、さまざまなものの(組み合わせ)ですが、主なものは次のとおりです。

  • コード自体。
  • 呼び出しコード。
  • そのコード内のコメント。
  • ドキュメンテーション;
  • ユニットテスト;
  • 統合および回帰テスト。
  • プログラマー。
  • エンドユーザー。

「最適な」ソース(またはその組み合わせ)は、状況によって異なります。

それがアジャイルコードである場合、それは嘘をつく可能性が低くなりますか、それともそのコードはまったく嘘をつきませんか?

「アジャイルコード」の意味がわかりません。AFAIKの「アジャイル」は通常、コーディングプロセスを指します。「アジャイルプログラミングプロセスで作成されたコード」を意味するとしたら、それまだ嘘であると言っても安全だと思います。たとえば、ウォーターフォールスタイルのプロジェクトで作成されたコードと比較して、うそになる可能性は主観的な問題です(個人的には、大きなつながりはないと思います)。


脚注
上記はすべて、コード嘘をついている可能性があること、およびこれは基本的な(少し工夫されている)例であることを前提としています。

public int DivideByTwo(int input) 
{
    return input / 3;
}

これは私が「コード嘘」と言った一例にすぎず、@ user61852には他にもいくつかあり(到達不能なコード、コードの複雑さは問題の複雑さと一致しない、不適切な命名)、もっとたくさんあると思います。ウィキペディアには、ある程度まともな嘘の要約があり、それらの多くはコードで見つけることができます。

注あなたは誰かと口論している場合は、その非常に必ず他の人の「コードは、それが何をするかない」という「嘘はできませんコード」によって意味するものではありません。本質的に、ここの他の人は、「コードは嘘をつかない」というステートメントを公理/基本的な真実として宣言できるほど狭い「嘘」の定義を使用して定義しています。この場合、おそらく彼/彼女の公理に同意するのが最善です。


0
if (x > 5) {
  doSomething();
} else {
  doADifferentThing();
}

「嘘」という言葉が技術的に適切であるかどうかについて議論することができますが、このコードは、xが5より大きい場合とそうでない場合があることを明確に示しています。プログラム全体を見て、この関数が1か所でしか呼び出されず、xが常に定数6に設定されていることを発見した場合、それは嘘です。

さらに、コンパイラはこれに気づいて、このコードブロックを単に

doSomething()

doADifferentThingがプログラムの他の場所で呼び出されない場合、プログラムから完全に削除される可能性があります。

あなたの言語assertがプロダクションビルドで無効にされているある種のをサポートしている場合、各assertステートメントは潜在的に嘘です。型キャストは嘘かもしれないもう1つの主張です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.