4

今日、最終的にコードのどこかにある次のスニペットに起因するバグを探しました (ここでは、リスト内の "PRIMARY KEY" 制約のみをフィルター処理しようとしていました)。

(filter #(= (% :constraint_type "PRIMARY KEY")) aListOfconstraints)

正しい代わりに:

(filter #(= (% :constraint_type) "PRIMARY KEY") aListOfconstraints)

つまり、バグは、次のように、キーが見つからない場合にデフォルトの引数を取るマップの複合効果でした。

({:a 1 :b 2} :a 0)

...そして、1 つの引数のみを受け入れて true を返す equal 関数:

(= 1) ; evals to true

この種の有効であるが疑わしいコードを表示するように促す代わりに使用できたツールはありますか? それとも、私が気付いていないベストプラクティスでしょうか?

4

4 に答える 4

5

の上に構築されたルールを使用して、clojureコードの静的分析を実行しようとするツールであるkibitに目を向けることができますcore.logic。新しいルールを追加するのはそれほど難しいことではありませんが、このツールにも制限があります。プロジェクトの説明を参照してください。

于 2013-02-10T12:21:13.070 に答える
5

探しているベストプラクティスは、コードの適切な動作をチェックする単体テストです。

リントツールの場合、Eastwoodを見ることができますが、あなたの場合、広く使用できるカスタムチェックを提供することは困難です。

于 2013-02-10T11:43:51.443 に答える
3

この種の問題がある場合は、右インデントを使用することをお勧めします。あなたの場合

(filter #(= (% :constraint_type)
            "PRIMARY KEY")
        aListOfconstraints)

そして、もしあなたが持っているなら

(filter #(= (% :constraint_type "PRIMARY KEY")
            )
        aListOfconstraints)

明らかに間違いに気付くことができます。

于 2013-02-10T12:22:18.780 に答える
2

以前の回答で言及されたイーストウッドは、2014年の初めの時点で、特定の問題や他のいくつかの種類の問題をキャッチできるようになりました。確認してください: https://github.com/jonase/eastwood

于 2014-11-05T01:34:07.873 に答える