Entry

定数宣言はバグの自動検出のためにあるんでねいのかな

2010年03月17日

なんとなくこちらから。なんで Python には定数という概念がないの?という話。コメント欄です。

自分の過去コードをりファクタリングしててもUpperCase変数は「変えてほしくないんだな」と思うし、他人が作ったモジュールの変数をむやみに書き換えることはまずありません。

でも自分が提供したモジュールを、初心者がむやみに書き換えやしないかと心配で夜も眠れません。 でも、こういう人って(プログラマには)結構多いと思います。

結局、「定数があるべき」という人は、こんな心配性な人なんだと思います:-)

なぜPythonには"標準"で定数を定義できないのか? - Pashango’s Blog

こちらのコメントも含め,他もそうなんですけれど,答えとしてはおおむね「必要ないから」といったところなんだと思います。まぁ,必要ないならしょうがないなぁ,と。

もっとも,これが心配性のせいかというと,どうなんだろ。こゆもんって,後々楽するためにつけるもんだと思うんですけど。あたしは仕事でも趣味でも,もっぱら C++ でプログラミングしているんですけれど,定数宣言に限定せず修飾子一般について言うと,この言語はとにかくたくさんの修飾子をつけ(られ)ます。例えば,ある文字列をキーにして別の文字列を取得する関数として,こんな関数を宣言できる(クラス宣言の一部分です)。

protected:
  const std::string& getSomeString(const std::string& key) const throw ();

const の指定だけで3箇所つけています。これが普通。コメント主さんの考え方によると,どんだけ心配性なんだよ?ということになるのかしらん。しかし,この宣言を見るだけで,C++ のプログラマは,こんなことが分かります。

  • この機能を呼び出すには,getSomeString という識別子を使う。
  • この関数は継承関係にあるオブジェクトからしか呼び出せない。
  • 引数は std::string 型の参照。
  • この引数は関数内部で値が変更されない。
  • 戻り値は std::string 型の参照(多分メンバ変数の一部を返しているんだろうな,と推測する)。
  • この戻り値は関数の外部で変更できない。
  • この関数はオブジェクトの状態(メンバ変数の値)を変更しない。
  • この関数は例外を投げない。

たくさん情報をソースコードの中に記述することで,その関数を利用する人が利用しやすくなるんですね。で,このことは処理系についても言える。

どゆことかというと,例えば,この関数の内部実装でこんな間違った実装をしちゃったとします。

const std::string&
getSomeString(const std::string& key) const throw () {
  // key に ".cpp" をつけた文字列を返す
  key += ".cpp";
  std::string* str = new std::string(key);
  return *str;
}

関数の呼び元では,引数 key の値は変わらないと思っているわけだけれど,getSomeString に埋め込まれたバグのために,文字列が変更されてしまいます。

プログラミングは人間がやることだから,バグが入り込む点については仕方ありません。問題は,このバグをいかに早く適切に取り除くことができるかです。C++ の場合,上のように宣言した以上,引数 key を変更するような実装は許されません。つまり,コンパイルが通らない。コンパイルを通さないことで,「バグがありますよ」と教えてくれるわけ。関数の外部で,戻り値を変更しようとした場合も,「関数の使い方を間違えてますよ」と教えてくれる。結局のところ,バグを自動的に検出しているわけです。

プログラムの仕様を処理系に細かく伝えることができる言語ほど,バグを作り込んでも早く直せると思うんですけど,どうなんでしょ。

言語を問わず,プログラムで表現する機能が一定だとするなら,楽に書ける言語ほど処理系外部(コーディング規約とか)で決めなくちゃいけないお約束が増えていきます。「UpperCase で書かれた識別子は変更してはいけない」という決まりを,処理系外部で決めることは自由なわけですけれど,この定数(としたモノ)を変数として扱っても,その不当を処理系は検出しないし,何事もなかったように実行します。処理系外部で決めた決まりごとは,結局人間がすべて覚えて適用することになる。

ま,プロジェクトの規模が小さい場合や,関与する人間が少ない場合は,その手間もそんなにかからないわけで,記述の手間をかけない方がむしろ効率的と言えるのかもしれません。いらないってんなら,ま,しゃーない。

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