クラスによる、ワイルドカード、Antパスの検索のコード を見てきました。

クラスを使用すると、少しコードが増えますが、再利用性が高くなります。


ここでは試しにC言語でAntパスの検索を作ってみましょうビックリマーク

(参考にしたコードはこちら です。)


【サンプル】

/**
Antパスにマッチするかを調べる。
@param ptn [in]Antパスで書かれたパターン
@param str [in]検査対象文字列。 
@return マッチした時true(1)、マッチしなかった時false(0) 
*/
const int ant_path_match(const char *ptn, const char *str)
{
  const int isSlash = (*str == '/' ? 1 : 0);
  
  switch( *ptn )
  {
    case '\0':
      //パターンの終端の場合 
      return '\0' == *str;
    case '*':
      if(*(ptn+1) == '*'){
        //パターンが**の場合 
        return ant_path_match(ptn + 2, str )
          || (('\0' != *str) && ant_path_match(ptn, str + 1));
      }else if(isSlash){
        //パターンが*の場合で、strがスラッシュのとき 
        return ant_path_match(ptn + 1, str);
      }else{
        //パターンが*の場合で、strがスラッシュでないとき 
        return ant_path_match(ptn + 1, str)
          || (('\0' != *str) && ant_path_match(ptn, str + 1));
      }
    case '?':
      if(isSlash){
        //パターンが?の場合で、strがスラッシュのとき 
        return 0;
      }else{
        //パターンが?の場合で、strがスラッシュでないとき
        return ('\0' != *str)
          && ant_path_match(ptn + 1, str + 1);
      }
    default:
      return ((unsigned char)*ptn == (unsigned char)*str)
        && ant_path_match(ptn + 1, str + 1);
  }
}


【説明】

クラスの場合、200ステップくらい書いていましたね。

C言語だと30ステップほど。。


あ、あれ!? C言語の方が楽じゃん!!

そうなんです。Antパスしかいらないなら、クラスではない方が楽なんですビックリマーク

(見てのとおり、コードは分かりづらいですが・・・)

しかし、クラスで作った200ステップほどのコードは、以下の機能がありますラブラブ!


 ・ワイルドカード検索

 ・部分一致のワイルドカード検索

 ・Antパスの検索

 ・部分一致のAntパスの検索

 ・複数の文字コード(sjis、utf-8、euc)に対応

 ・ワイルドカードに一致した文字列を取得できる

 ・ワイルドカードに一致したときに操作ができる(コールバックできる)

 ・ワイルドカードに含めない文字を自由に設定できる


思いつかないだけで、他にもあるかもしれません。

すごくないですかはてなマーククラスドキドキ


もしこれだけの機能をC言語で上記のように作成していくと、

30ステップ×機能数(7)×文字コード数(3)以上必要になるかもしれません。

しかも、1つ1つの機能で作りが変わってしまうので、コードが追いづらくなります。



【最後に】

今回はそれほど大きな機能ではないので、あまり大きな恩恵は見えづらいかもしれません。

しかし、実装する機能が大きくなればなるほど、

クラスで統一化され、意味のある分類わけをされたコードはメンテしやすくなります。


また、ワイルドカードの例で見てきましたようにクラスの入れ替えだけで機能を変えられるのは

魅力です。



C++ユーザが増えるとうれしいなぁアップ