Shotnest · ライブラリ
動作が同じだと決めつけずコードの文章を比較する
Shotnestのテキストツールで二つのコードスニペットを比べ、if (count > 0) と if (count >= 0) がなぜトークンの0.778を共有するのかを確かめます。
比較ツールがコードに対して行うこと
比較ツールは両方の入力を小文字にし、Shotnestが検索で使うのと同じ文字の正規化(アクセントの除去、全角文字の半角化)を適用し、連続する空白をすべて一つの空白にまとめてから、空白で区切ります。報告されるのは、二つのテキストが共有する異なるトークンの割合と、片側にしかないトークンです。インデント、改行、大文字小文字はこの段階の前に消えます。文章には便利ですが、コードには危険です。
何も実行されません。ページは貼り付けたスニペットをただのテキストとして扱い、マークアップに変えずに結果を表示するので、数値が表すのは文字であり、動作ではありません。
二つのスニペットを準備する
- それぞれのスニペットを、波かっこや演算子も含めて、撮ったとおりに貼り付けます。
- まず「完全に一致」の行を読みます。大文字小文字と空白を保つ確認はこれだけです。
- 次に「正規化後に一致」と重なりの値を、別々の事実として読みます。
- 一つ目だけと二つ目だけのトークン一覧を開きます。演算子や語に付いた記号は、たいていそこに現れます。
- インデントが意味を持つ言語のインデントなど、トークン一覧に表れないものは、スクリーンショットに戻って確かめます。
演算子が一つだけ違う二つのスニペット
一つ目のテキストは、三行に分けて書いた「if (count > 0) { return count; }」。二つ目のテキストは同じ文を一行にして、>の代わりに>=を使ったものです。正規化すると改行が消えるので、違うトークンは>と>=だけです。異なる九つのトークンのうち七つが共有され、7 ÷ 9になります。
- 完全に一致
- いいえ
- 正規化後に一致
- いいえ
- 単語の重なり
- 0.7777777777777778
- 一つ目のテキストだけにある
- >
- 二つ目のテキストだけにある
- >=
二つ目の組は逆の危険を示します。「const Total = 1;」と「const total = 1;」は正規化後に一致し、重なりは1と報告されますが、多くの言語ではTotalとtotalは別の名前として扱われます。
コードのテキストでの間違い
- 重なりが1に近いことを、二つの関数が同じように動く証拠とみなすこと。
- 完全一致の行を読み飛ばし、識別子の大文字小文字の変化を見落とすこと。
- ライブテキストでのコピーでかっこが抜けたり、二つの段が混ざったりしたスニペットを比べること。
- 変わった比較演算子を、変わった語より重要なものとしてツールが示してくれると期待すること。
比較が及ばないところ
単語の重なりはテキストの尺度です。順序、繰り返されたトークン、空白を無視するので、コードがコンパイルできるか、同じ値を返すかはわかりません。Shotnestアプリでは、コードのように始まる行(import、def、returnなど)が三行以上あると、コードのスクリーンショットはコードの棚に入ります。この棚はもう一度見つけるためのもので、実行は自分の環境で行うことです。