意味の通らない名前 (a とか hoge) や、単語として意味はあるけれど曖昧さの残る名前 (begin とか) はリファクタリングを一考する余地があるよなあ、と考えている。
効率よく発見したいけれど、名前の長さなどで一様に探せるものではないためむずかしい。
そこで、look というコマンドのことを思い出した。与えられた文字列と先頭一致する文字列を辞書から探すコマンドで、Mac などには標準で入っている。
look syn
と入力すると syntactic とかいろいろ出てくる。
この look の検索結果が多ければ多いほど、曖昧さの残る文字列といえるのではないか、という仮説を立ててみた。
$word | look $word wc -l |
---|---|
a | 17096 |
abort | 13 |
こういうかんじ。
形態素解析をすることを考えたのだけれど、英語を対象言語としたライブラリがなかなか見つからなかった。
また、形態素解析を用いるにしても、得られるパフォーマンスを考慮するとある程度間引くことは少なからず求められるだろうし、まずノイズを取り除くというレベルのことができるのではないかなあ、と思った。
https://rubygems.org/gems/ruby_parser という Gem に依存しているのでそれをインストールする必要がある。
使い方は引数として検証したい Ruby のソースコードファイルのパスを与えてあげればよい。
$ cat bad.rb #!/usr/bin/env ruby a = 1 b = 2 c = 3 d = 4 ret = a + b + c + d puts ret $ ruby ambiguous.rb bad.rb a => 17096 b => 11070 c => 19901 d => 10896 ret => 477
こういう出力が得られる。たとえばこれをエディタなどに与えて、たとえば Vim の quickfix として表示するとかが考えられると思う。
閾値をどうとるべきか、といったチューニングは必要だと思う。
たとえば、ブロック引数の名前は多少曖昧な名前付けも許容するとか、メソッドやクラスなど公開された API となる部分の名前はより厳しくする、といったことが考えられる。
おもしろアルゴリズムを募集します。