<< 来年に向けてのメモ | Top | Ruby版 Blogツール作成 >>
[ Date: 2006年02月09日 / Modified: 2006年12月17日 ]
クラス間の通信
オブジェクト指向では、クラスから作られたインスタンスどうしがメッセージを送りあってデータを操作するというイメージがある。
私の場合は、実際コードを書いていく際、なんでもかんでも継承を使うというのはいやだし、実際その必要がないケースも多いので、あるクラスのフィールドに別のクラスのインスタンスを渡しておいて、そのフィールドとなった部品クラスからメソッドを呼び合うというやりかたをとることが多い。これはオブジェクト指向的には、関連とか集約とよばれる手法だと思うが、この方法でも Data::Dumper なんぞで表示してみる時、部品クラスのよけいなデータ構造まで見えてしまうので結構うざったく感じる(Data::DumperのMaxdepthをその都度変えるのもメンドイし)。
実際クラスどうしに渡されるのは、オブジェクトのアドレスなので、見ためほどデータが重くなっているわけではないのだが、あまりシンプルとも言えない場合がある。
そもそもあるクラスから利用される部品クラスの部分が、一つやふたつのフィールド値であるような場合、そもそも部品クラスとして埋め込む必要があるのかとも思えるケースがある。
もうひとつ問題は、ファイルやネットごしのデータを読む場合、あるタイミング(例えばその読み込み過程である種のデータに出会った時などに)、何らかのコールバックをクラスどうしで呼び合えないと、全く同じような分岐処理を複数のクラスに書くはめになる。そういうのはいかにも無駄と思える。対象となるデータに遭遇した時に、うまくインスタンスどうしがメッセージ通信してくれれば、もっともっとコードをシンプルに、かつ独立性を高めて書けるのにと思うのである。
こういう場合に、特定のクラスフィールドを作って、そのフィールド変数を内側に含んだクロージャを使ってインスタンスどうしを通信させるというような方法をもっと考えるべきだろう。最低限必要なフィールド値だけを、必要なタイミングで操作変更してくれるような、コールバックメソッドとしてのクロージャ。こういうのがうまく書ければ、なんでもかんでも部品クラスに埋め込まなくてもよいはずだ。
実際クラスどうしに渡されるのは、オブジェクトのアドレスなので、見ためほどデータが重くなっているわけではないのだが、あまりシンプルとも言えない場合がある。
そもそもあるクラスから利用される部品クラスの部分が、一つやふたつのフィールド値であるような場合、そもそも部品クラスとして埋め込む必要があるのかとも思えるケースがある。
もうひとつ問題は、ファイルやネットごしのデータを読む場合、あるタイミング(例えばその読み込み過程である種のデータに出会った時などに)、何らかのコールバックをクラスどうしで呼び合えないと、全く同じような分岐処理を複数のクラスに書くはめになる。そういうのはいかにも無駄と思える。対象となるデータに遭遇した時に、うまくインスタンスどうしがメッセージ通信してくれれば、もっともっとコードをシンプルに、かつ独立性を高めて書けるのにと思うのである。
こういう場合に、特定のクラスフィールドを作って、そのフィールド変数を内側に含んだクロージャを使ってインスタンスどうしを通信させるというような方法をもっと考えるべきだろう。最低限必要なフィールド値だけを、必要なタイミングで操作変更してくれるような、コールバックメソッドとしてのクロージャ。こういうのがうまく書ければ、なんでもかんでも部品クラスに埋め込まなくてもよいはずだ。
投稿者 jgb : 2006年02月09日 00:57