オブジェクト指向ラヴのこと

鼻が詰まって目が覚めてしまいました。時間あるので、朝から意識高くブログで釣り記事を書いていきます。

オブジェクト指向結構好きだという話です。

アクセスコントロールカプセル化という言葉は何かイマイチ響きがよくないと思うので勝手に言い換えます。
コード読む上で一番理解を妨げるのは状態数なことが多くて、値が変わり得るか、変わる場合にはどう変わるかというのは、矢張り重要です。並行、並列な処理を読み書きする際には殊更ですね。

カスタマイズポイント(シーム)の提供。矢張りコレは重要で、

class C {
public:
  virtual void f();
  virtual void g();
};

void h(C* c);

h(cobj);
void h(C* c, void (*f)(), void (*g)());

h(cobj, f, g);

どっちがいいかという話です*1。メッセージが〜とか難しいことを言う人がいますが、そういうのはまあ詳細でしかないと思っています。
特にテスタビリテ〜的な話になるとこれは本当に重要で、何よりありがたいのが、そういうこと分かってない人でも、とりあえずクラス使わせとけばいいみたいなところがあって…その点で C++ の virtual はゴミクソですね。
以前オブジェクト指向の言語機能とか無くても、関数あればカスタマイズポイント提供できるし〜っていう意見を見たことがあるのですが、しかし現実にはいくつもの関数呼び出しのネストのために、カスタマイズポイントが一つや二つじゃあ足りないわけで、それ本当に一々引数でたらい回すのですか…?という…いや Read モナドとか使うんですかね、信じられない…ていうかそれだって結局型クラス使ってるじゃんみたいな…まあそういうことです。そもそもそのためにモジュールや型クラスは生まれたわけで…はい、モジュールはモジュール、型クラスは型クラスで良いものですね。

文法。文法は大事です。

obj.isEnabled();
isEnabled(obj);
obj.x().y().z();
z(y(x(obj)));

メソッドチェインかわいい…♥。Haskell の $ の偉大さにかなり近いですね。

他にも色々あるわけですが、結局はこの三つなのかなあと最近はよく思います。勿論これらを達成できるほかの言語機能もあるわけですが、普及しているという四点目を考慮すると今のところオブジェクト指向〜は大変よいものだなあ!という感じですね。現実と戦っていくうえで、これを超える言語機能は今と衣まだない!!!*2

嫌いなところもいっぱいあって、矢張り一番は non-intrusive に書けない言語が多い、というのが…これは本当に困ります。しかし C++ template はやりすぎです(使っちゃうけど)。動的型付けの言語使えという話ではない、と個人的には思っています。大体はアダプタ書いて解決するわけですが、そういう点では scala の implici parameter は中々気が利いてるといえますね。

あとはメソッドがファーストクラスでない言語が多い。というか、まず前提として、関数はファーストクラス、もしくはそれに近いレベルの操作が可能であって欲しいというのがあるのですが…ruby とかこの点では大大大大大キライですね。不可能ではないとはいえ、扱いにくすぎます。

しかし朝から何書いてるんだか…鼻通ってきたし、寝ていいでしょうか…

*1:後者も好きですが

*2:フィッシングポイントです