Entry

プログラミングメモ - プログラミングは「違和感」を除去する作業なんだそうな

2010年05月07日

今日ちょっとベテランさんと話していて,へぇと思ったんだけれども,彼にとってプログラミングってのは,「違和感」を除去する作業なんだそうな。

どゆことかというとですね。例えば,次のようなコードがあったとしますよね。

#include <iostream>

int
add(int a, int b) {
  return a + b;
}

int
main(int argc, char* argv[]) {
  int n;  // <- 違和感
  int m;  // <- 違和感
  int s;  // <- 違和感

  n = 2;
  m = 4;
  s = add(2, 4);

  std::cout << s << std::endl;
  // <- 違和感
}

このコード,MinGW の g++ 3.4.5 では,-Wall のオプションをつけても警告がまったく出ないんですけれど,ベテランさんは「違和感」とコメントしたところに違和感があるらしい。

たしかに,最後の main 関数に戻りがないことや,初期化されずに宣言/定義されているローカル変数なんかには違和感を感じます。不定な要素をなるべく残しておきたくない,ということから。で,こゆ違和感は初級編。

も少しすると,C/C++ の場合,関数の戻り(返値)を気にするようになります。

puts("hello.");  // <-これの戻りは?

「puts(3) は文字列を出力する(標準出力に文字列を書き込む)関数」と覚えておくのはいいんですけれど,C の場合,これはあくまでも「副作用」という扱いになっていたりします。「C は関数の集合体」とかいった言葉はどこかで聞いたことがあるかと思うんですけれど,戻りのある関数である以上,できる限りその値を気にするようになるのがいいんだとか。ま,puts(3) の戻りを気にする人は,あまりいないと思うんですけどね。手馴れはそゆとこまで気を配る,と。

ちなみに,puts(3) が失敗すると EOF が返ることになっている。実際,この関数が失敗する可能性は(普通の PC の普通の OS 上で動かす限り)まずないわけですけれど,「この関数は失敗する可能性がある関数だ」ということを踏まえているか否かの違いは,たしかに大きいものがあるんじゃないかと思います。そして,失敗する可能性がある関数を呼んでいるのに,その結果を見ないのには,違和感がある……とか云々。

「malloc(3) したら free(3) しろ」とか「fopen(3) したら fclose(3) しろ」とかいった話はよく聞くわけですけれど,結局のところ自分が作る関数も含めて,プログラムの制御をできる限り自分の制御の下においておくことが「安心」だったりするわけですね。そんなことも踏まえて,プログラミングというのは,安定している状態を少し崩して,また立て直して……を繰り返してできるんだとか。malloc(3) を呼ぶと,(free(3) すべき(制御すべき)要素が増えて)少し安心に「不安」がやってくる。この不安を払拭するために,また新しくコードを書く……とかいった具合に。へぇ……。

おそらく,こゆ考え方は,テストファーストな開発の原型になるものなんだと思います。少し書いてから検証してリファクタリングする……というのは,形だけ真似していても多分ダメで,こうした違和感というか制御に対する気配りができるかどうかが核として備わってなくちゃいけないんじゃないだろうか。そして,おそらくその気の配り方が,テスト自体の品質にモロに影響する,と。

しばらくテストについて考えているんですけれど,なんだかいい話を聞いた感じ。実践に移すのは大変なんでしょうけど。

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