新・闘わないプログラマ No.190

手抜き


「あんたのサイトさあ、最近いつも手抜きしてない?」などと言われてしまった私だったりするのですけど、反論できないところが辛いわけでして、何せ、ここのところ毎週、日曜日の夜になってから「あ〜あ、今週の分、何書こうかなあ」などと、そのときになって初めてテーマを考えたりしてまして、「別に、個人サイトでテキトーに駄文を書き散らしているだけなんだからいいじゃん。文句言われる筋合いなど無いわい」などと、開き直ったりもするわけでして…というわけで、毎度のごとく、今週も手抜き駄文です。

さて、最近、仕事で他人のプログラムなどを眺める機会が多いのですけど、なんと言うか、なんでそんなことわざわざ自分でコーディングするのかいな、ってのが結構あったりしますね。
Cのプログラムなんかでも、この人、標準ライブラリって知っているんだろうか、と思わせるような書き方をしている人も結構います。この間も、あるプログラムを見ていたら、やたら回りくどいことをやっているところに出くわしまして、よくよく解析して見ると、そんなん「strcmp」やら「strstr」を使えば一発じゃん、なんてことを思ってしまいました。
もうすでにあるものは使わにゃ損、というか、ライブラリを使わないで自分でごりごり書いたとしても、誰も誉めてくれないし、プログラムを見ても分かりづらいし…上の例でも、まだ「strcmp」や「strstr」に相当するような関数を自分で作って、それを呼び出しているのならともかく、プログラムの一連の流れの中で、ループを使って「strcmp」や「strstr」に相当するような処理が書いてあって、それを後で見る方はたまったもんじゃない、ってなことにもなります。
ほかにも、先日見かけた(というか、他にもよく見かける)のに、

        ・
        ・
    strcpy(out_buf, "Result=(");
    strcat(out_buf, hoge1);
    i = strlen(out_buf);
    out_buf[i] = ',';
    out_buf[i+1] = '\0';
    strcat(out_buf, hoge2);
    i = strlen(out_buf);
    out_buf[i] = ',';
    out_buf[i+1] = '\0';
    strcat(out_buf, hoge3);
    i = strlen(out_buf);
    out_buf[i] = ')';
    out_buf[i+1] = '\0';
        ・
        ・

なんてのがありまして、でもこんなの、

    sprintf(out_buf, "Result=(%s,%s,%s)", hoge1, hoge2, hoge3);

で終わりだと思うんですけどねえ。
この「strcat」でつなげて行くやりかた、ってよく見受けられるんですけど、こういうコーディングする人の考え方、っていったいなんなんでしょう。分かりづらいし、メンテナンスしづらいし、冗長だし、「sprintf」でも使った方がずっと便利だと思うんですけどね。
あ、でも、噂で聞いたことがありますけど、「printf」系の関数は遅いから一切使用禁止ってコーディング規則の会社がある、って聞いたことがありますけど、もしかしてその類?

話は替わって、Cのポインタの話で、ポインタ(特にポインタ演算)は出来る限り使わないようにしましょう、って考え方があります。出来る限り配列要素の形で表現しましょう、という。
まあ、ポインタはちゃんと理解して使わないと(理解して使っても?)バグの温床になりがちだし、無理に使う必要は無いのかも知れませんが、でも、ポインタを使うと、コードが短くなって見やすくなるんじゃないか、って場合もありまして…。
たとえば、こんなの

    for (i = 0; hogehoge[i].fuga[0] != '\0'; i++)
        printf("%s\n", hogehoge[i].fuga);

と、こんなの

    for (p = hogehoge; *p->fuga != '\0'; p++)
        printf("%s\n", p->fuga);

があったら、後者の方が見通しがいいから見やすくて私は好きだなあ…と思ったりするのですけど、この例だと大して差が無いですね。ううむ、いまいち例がよくなかったか ←でも、他の例を考えるのも面倒だからこのままにしておこう ←手抜き。
まあとにかく、私はキー入力で手を抜きたいし、別に後者が特に分かりづらいとは思わなかったりするので、そういう書き方もいいんじゃないか、と。
でも、さすがに、かの有名な、

    while (*p++ = *q++);

なんてのはやりませんが。K&Rに出てくるこの書き方、さすがにやりすぎだと思うし。こういうのを考えるのは、面白いことは面白いですけど、でも実際に仕事でそういう書き方をするか、というのは別問題。

ということで、毎度の如く、タイトルとはあまり関係の無いようなことばかりずらずらと書いてきたわけですけど…あれ? そういえば、以前にも似たようなタイトルで駄文を書いたような気がする…どれどれ、あ、「手を抜く」と題して書いているではないか、かなり前に。自分でネタのかぶった駄文を書いてどうする。
ううむ、困ったなあ。いまさら別のタイトルで書いている暇は無いぞ。ええい、このまま知らん顔して、この駄文を載せちゃえ ←究極の手抜き。

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp