2013-12-14

レーベンシュタイン距離を使って似ているメソッド名を提案してくれるおせっかいPHPコード、そして Ruby と比較してみた



コード自体は MethodSuggestion クラスのマジックメソッド __call を使って宣言されていないメソッドが呼ばれた場合にレーベンシュタイン距離を使って似たような名前のメソッドを探してくるというものです。

この MethodSuggestion クラスは、ここでは ArrayObject を継承しているため、インスタンスから mount とか japan とか無茶ぶりされた場合に似ている名前のメソッドを ArrayObject から探してきて返しています。


元ネタにさせてもらったのは Rubyのmethod_missingを使って、似ているメソッド名を提案するコードを書いてみた - Hive Color という記事なのですが、そこの Ruby と本記事の PHP の違いとしておもしろいのはやはり PHP が組み込み関数として levenshtein を有しているという点でしょうか (今回の記事はほぼそのために書いたようなものです)。

そして Ruby の洗練された美しいオブジェクト志向に対比されて鈍く光るいぶし銀の array 志向でしょうか。

あと PHP で気になるのは asort が破壊的メソッドになっている (「破壊的メソッド」とは Ruby 用語で、元の変数の中身を書き換えてしまうメソッドのこと。安定ソートの概念とは少し似ているが関係ない) のと、array_slice あたりのまどろっこしさがありますね。


追記

例外クラスにしてみた。これでファイルを読み込んで3行足せばデバッグしやすくな...らないですね、手間の割にそんなに便利でもないので使えないです。



勝手に似ている名前のメソッドを呼ぼうとする「ビーストモード」も頭をよぎりましたが人類の平和のためにやめておきました。