Shotnest

Shotnest · ライブラリ

動作が同じだと決めつけずコードの文章を比較する

Shotnestのテキストツールで二つのコードスニペットを比べ、if (count > 0) と if (count >= 0) がなぜトークンの0.778を共有するのかを確かめます。

比較ツールがコードに対して行うこと

比較ツールは両方の入力を小文字にし、Shotnestが検索で使うのと同じ文字の正規化(アクセントの除去、全角文字の半角化)を適用し、連続する空白をすべて一つの空白にまとめてから、空白で区切ります。報告されるのは、二つのテキストが共有する異なるトークンの割合と、片側にしかないトークンです。インデント、改行、大文字小文字はこの段階の前に消えます。文章には便利ですが、コードには危険です。

何も実行されません。ページは貼り付けたスニペットをただのテキストとして扱い、マークアップに変えずに結果を表示するので、数値が表すのは文字であり、動作ではありません。

二つのスニペットを準備する

  1. それぞれのスニペットを、波かっこや演算子も含めて、撮ったとおりに貼り付けます。
  2. まず「完全に一致」の行を読みます。大文字小文字と空白を保つ確認はこれだけです。
  3. 次に「正規化後に一致」と重なりの値を、別々の事実として読みます。
  4. 一つ目だけと二つ目だけのトークン一覧を開きます。演算子や語に付いた記号は、たいていそこに現れます。
  5. インデントが意味を持つ言語のインデントなど、トークン一覧に表れないものは、スクリーンショットに戻って確かめます。

演算子が一つだけ違う二つのスニペット

一つ目のテキストは、三行に分けて書いた「if (count > 0) { return count; }」。二つ目のテキストは同じ文を一行にして、>の代わりに>=を使ったものです。正規化すると改行が消えるので、違うトークンは>と>=だけです。異なる九つのトークンのうち七つが共有され、7 ÷ 9になります。

完全に一致
いいえ
正規化後に一致
いいえ
単語の重なり
0.7777777777777778
一つ目のテキストだけにある
>
二つ目のテキストだけにある
>=

二つ目の組は逆の危険を示します。「const Total = 1;」と「const total = 1;」は正規化後に一致し、重なりは1と報告されますが、多くの言語ではTotalとtotalは別の名前として扱われます。

コードのテキストでの間違い

比較が及ばないところ

単語の重なりはテキストの尺度です。順序、繰り返されたトークン、空白を無視するので、コードがコンパイルできるか、同じ値を返すかはわかりません。Shotnestアプリでは、コードのように始まる行(import、def、returnなど)が三行以上あると、コードのスクリーンショットはコードの棚に入ります。この棚はもう一度見つけるためのもので、実行は自分の環境で行うことです。