SSブログ

とあるソフト会社の開発手法(コーディングスタイル):第1話 [戯言]

- 目次 -

第1話 「前方一致判定」

前方一致とは、
ある文字列が、他の文字列の先頭部分にあること。
詳しくは、ググるとかすれば良いです。

プログラマ的な具体例を出すと、JavaのString#startsWith()trueを返す状態。

そんな、前方一致しているかどうかを判定する関数が必要になりました。
ぶっちゃけ、JavaのString#startsWith()をC++で作るわけです。

そして、これが「皆でしっかりチェック」した前方一致判定関数。

bool startsWith(const char* strTarget, const char* strPrefix)
{
    // 引数のNULL判定は省略
    return strstr(strTarget, strPrefix) == 0;
}

簡単に解説すると、
文字列(strTarget)全体の中から、文字列(strPrefix)を検索し、見つかった位置が先頭(0)だったら前方一致という仕組み。

間違ってないけど、非常に無駄な事やっているよね。

最初の1文字が違っていると、その時点で前方不一致が確定するのに、文字列の終わりまで一致判定を繰り返すわけだから。

誰も、その点を指摘しなかったのだろうか…

効率よりも分かりやすさを取ったのだろうかと、好意的に解釈しておきます。

ちなみに、自分なら、こう書きますが。

// 全部自分で書く
bool startsWith(const char* strTarget, const char* strPrefix)
{
    // 引数のNULL判定は省略
    while (*strPrefix != '\0')
        if (*(strTarget++) != *(strPrefix++))
            return false;
    return true;
}
// 標準関数の組み合わせで実現
bool startsWith(const char* strTarget, const char* strPrefix)
{
    // 引数のNULL判定は省略
    return strncmp(strTarget, strPrefix, strlen(strPrefix)) == 0;
}

と、まぁ、こんな感じに、「『皆でしっかりチェックしている』と言い張るわりには、あまり質が良くないよね」って事をだらだらネチネチ書いていこうと思っていた時期が僕にもありました……。

- 目次 -

[車(セダン)] 今日の一冊
名探偵はもういない (ミステリー・リーグ)

名探偵はもういない

  • 作者: 霧舎 巧
  • 出版社/メーカー: 原書房
  • 発売日: 2002/02
  • メディア: 単行本

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。