web-dev-qa-db-ja.com

プログラミング言語をより便利にする「警戒心」の例は何ですか?

受け入れられた答え から「なぜLISPは役に立つのですか?」:

5.窮屈さ。現実の世界は散らかっています。実用的なコーディングは、厄介な構造を使用または発明する必要があります。 Common LISPには、物事を成し遂げることができる十分な警戒心があります。

この考えは私にも起こりました。私は現在、バックエンドがHaskellで作成することを選択し、フロントエンドがPHPであるアプリケーションを開発しています。私の経験では、PHPで乱雑なコードを処理する方が、Haskellで乱雑なコードを処理するよりもはるかに簡単です。 、それは私自身のコードであり、私のPHPコードはおそらくそれほど悪くはありません。

「wartiness」の簡単な例は、PHPの==(等式)演算子です。ご存知のとおり、 平等のタイプ ここで'' == 0は真です。私は==を警戒しているので、代わりにPHPの===(厳密な等式)演算子を使用することを選択することがよくあります。

$is_admin = ($gid === 24 || $gid === 25);

しかし、上記の使用法は間違っていることが判明しました。 $gid値はデータベースから取得されたものであり、文字列のままです。今回は、厳密な等式演算子が私を噛みました。次のように言うだけで、数分節約できたでしょう。

$is_admin = ($gid == 24 || $gid == 25);

別の興味深いアイデンティティを考えてみましょう。

php> var_dump('0012345' == '12345');
bool(true)

なんてこった! 2つの文字列の==は、文字列の比較でもありません。ただし、ユーザーに0012345と書かれたIDカードが与えられているが、データベースIDが単に12345であるかどうかを検討してください。 ===を使用することを選択した場合、ユーザーはアプリケーションへのログインに問題が発生する可能性があります。確かに、バグレポートが表示され、このあいまいな機能に依存するのではなく、アプリケーションを正しくすることができます。しかし、もっと時間がかかります。私はむしろその時間を外で過ごしたいです。本当にいい日です。

対照的に、これはほとんどの場合役に立たない疣贅の例です:

js> parseInt(031);
25

「警戒心」が物事を成し遂げるのに役立つ、より具体的な例は何ですか?理由を説明してください。 Haskellが持っていない機能をリストするだけではありません。

別の言い方をすれば、注意すべきいぼ状の言語機能とは何ですか。また、それらを使用して時間を節約するにはどうすればよいでしょうか。

5
Joey Adams

ここでの一般的な原則は、言語のいぼの形が要件のいぼの形と一致すると、それらはキャンセルされ、どちらもいぼではないかのようにプログラムできるということだと思います。

あなたは例を求めたので、Javaスクリプトではeval()を使用するだけでJSONを「解析」できると言います。

この例を選んだのは、プログラミングの「いぼ整列」スタイルの危険性を示しているためです。評価している文字列を完全に制御しない限り、JSON文字列に対してeval()を実行することは大きなセキュリティリスクです。 (それが私がそれをいぼと呼んでいる理由です-定義は少し主観的です)。

あなたの例では、言語に組み込まれた文字列から整数への変換は、それがあなたが望むように機能したときに素晴らしいものでしたが、それが異なって機能したとき(parseInt(031)-> 25のように)、助けになったのは警戒心ではありませんでしたが、実際にはあなたを警戒しますプログラムしなければなりませんでした。

プログラミング言語での疣贅の問題は、一般的にそれに対する制御が制限されていることです。したがって、疣贅が整列しなくなるように要件が少しずれた場合、本当に残っているのはtwoだけです。プログラムする疣贅のセット、あなたの要件のものプラス言語のもの。

7
psr

簡単な例は、C++の約半分です。率直に言って、削除する必要がある単なる病気であるC++のセクションがあり、それは明らかです-たとえば、配列/ポインターの崩壊。しかし、Cの互換性が向上するため、これらは保持されます。これは便利なことです。

2
DeadMG

簡単な例ですが、最善ではありません。

CLでは、真実はゼロではありません。それはちょっと大ざっぱですよね?通常、何かがTrueであるかどうかを確認する必要があり、そうでないかどうかを判断することはできません。 Trueは、nil以外のサブセットです。

しかし、少し目を細めてみると、実際にはほとんどの場合問題ではないことがわかります。また、(if (eq foo #t) this that)を尋ねる代わりに、コードのサイズを小さくすることができます。(if foo this that)を実行できます。スキームは最初のアプローチを取ります。

PLデザイナーがここで素晴らしい議論をすることができると私は合理的に確信していますが、残念ながら、それは今日の私ではありません。

漠然とした来歴の引用を引用するには...

  • 計画者:「仏陀は小さく、きれいで、真面目です。」
  • Lispnik:「仏陀は大きくて、毛むくじゃらの脇の下があり、笑っています。」

また、私は引用されています。うわー!

1
Paul Nathan