Entry

寄り添われてみての一部感想(カラミモード)

2009年01月03日

こちらの増田さんから。ネタがちと枯れ気味だから,絡んでみる。

>int
>count_comma(const char* str) {

別に comma に限定する必要はないから、count_char にして、char 引数もう一つもとうよ。

>int
>count_comma(const char* str) {

> int ret;

ret って?count?じゃあ count って変数名のほうがいいよ。あと = 0 ね。

> for (ptr = str; *ptr != '\0'; ptr++) {
>
> }

ヌル文字最後にない場合どうすんだよ、おめー

> static const char COMMA = ',';

だから、グローバルになんてするなよ。

再利用性を高めようとする意識はいい。けど、後で関数単体で再利用できるように書けって。

http://qune.cside.com/mt/mt-tb.cgi/1064

一昔前だと,もう少し骨のある意見をもらえてたんですけど,最近あまりもらえなくて,ちと寂しい。少しだけコメントしておきます。増田さんだけど。

まずこちら。

>int
>count_comma(const char* str) {

別に comma に限定する必要はないから、count_char にして、char 引数もう一つもとうよ。

(snip)

> for (ptr = str; *ptr != '\0'; ptr++) {
>
> }

ヌル文字最後にない場合どうすんだよ、おめー

http://qune.cside.com/mt/mt-tb.cgi/1064

こういう考え方は,確実にプログラマの身を滅ぼすので,初めに書いておこうと思います。count_char() なるもんは,お題を過剰に一般化していると見るべきだし,ヌル文字が最後にないときは,呼び元が悪い(ヌル終端しない文字列を扱う C の関数は珍しく,契約に入っていない)。

そもそも,必要のない機能を勝手に盛り込んで,テストケースを増やしたり,バグを埋め込んだりする態度は,趣味のプログラミングや学生の演習ならともかく,プログラミングをお仕事にしている人間の態度としてありえないんだと思います。言われたこと以外のことをやって工数を増やしてもお金は出ないので,YAGNI 的にいきたいところ。通常,ある関数(クラスでもモジュールでもそうですが)に拡張性を持たせるかどうかは,プログラム全体の目的と勘案して決める重大な作業です。いらぬおせっかいで,足を引っ張ることもある,と。

ヌル文字を見ない文字列関数を作るとすると,文字列長を引数に与えることになりそうですけど,この増田さんは strlen(3) のヌル文字なし版も自前で作っていそうです。限りなく意味のない関数だけど。count_char() なる関数にしても,下手すると,大文字小文字を区別しない版とか,MBCS/Unicode 対応版もつけようよ,とか言われそうな勢い。あわわ……。

続きまして。

> int ret;

ret って?count?じゃあ count って変数名のほうがいいよ。あと = 0 ね。

http://qune.cside.com/mt/mt-tb.cgi/1064

初期化してない旨の話(「= 0 ね」)は,見落とされてるんだと思うから措いとくとして,変数名のつけ方の方は,正直好みの問題なんだと思います。こんな小さな関数で,ret だろうが count だろうが間違いようがない。

一方,個人的に,count という変数名はあまり使いたくなかったりします。それは,動詞と名詞があって,どちらもよく使われるから紛らわしいっつのもあるし,そもそも,「総数」という意味で count なる単語だけを使うのは,英語的に座りが悪いから。counter とか count(s)OfComma とかならまだ分かるけど。

細かいことを……と,思うかもしれないけれど,ret だって似たような水準なんだと思う。ret なら,何が返値かすぐに分かって便利,とも言えるし。どっちもどっち。

最後に……。

> static const char COMMA = ',';

だから、グローバルになんてするなよ。

再利用性を高めようとする意識はいい。けど、後で関数単体で再利用できるように書けって。

http://qune.cside.com/mt/mt-tb.cgi/1064

これはもう,C/C++ 言語でグローバル変数を使うのがなぜいけないのか,もう一度見直した方がいいんだと思います。つか,この人 C/C++ 知ってるんだろうか。ちなみに,ここで使っているのは,外部リンケージのない(static な)定数です。再代入されることはない。心配されるのは名前の衝突で,翻訳単位におけるトップレベルの名前空間は汚染されています。しかし,これにしても,モジュール単位で見れば,この識別子は外部に漏れないわけで,結局のところ無害です。仮に二重定義したとしても,コンパイラがエラーを出す。#define で定義すると,二重定義しても警告止まりだったりすることもあるので,基本は static const で定数定義するのがいいんだと思います。

あと,「関数単体で再利用できるように」ってのが意味不明なんだけれども,モジュールの単位を関数の単位に限定しているって時点で,この増田さんのコーディング作法が透けて見える。つまり,関数をコピペしてると……。そう考えないと,つじつまが合わない。しかし,モジュールっつのは,コピペの単位ではないし,コピペすることを再利用するというわけでもない……当たり前だけど。

もっと他に突っ込みどころがあると思うんだけれどなぁ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN