とあるソフト会社の開発手法(コーディングスタイル):第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; }
と、まぁ、こんな感じに、「『皆でしっかりチェックしている』と言い張るわりには、あまり質が良くないよね」って事をだらだらネチネチ書いていこうと思っていた時期が僕にもありました……。
【- 目次 -】
今日の一冊 | |
|
タグ:伝説のプログラマたち
2009-04-30 09:06
nice!(0)
コメント(0)
トラックバック(0)
コメント 0