オブジェクト指向とレスポンシビリティ

 MSDN blogのブロック図(下図参照)を見ていて、たまに読んでいる書籍の内容を思い出した。

ブロック図

 読んでいる本は「オブジェクトデザイン -ロール、責務、コラボレーションによる設計技法-」というもので、ソフトウェア・オブジェクトをいかに設計するのが良いのか。設計の基本と考え方・実践方法を指南する内容。

 本の内容がどうか。ということを書いても仕方ないので、興味があれば読んでもらうとして、何故そんな本を読んでいるのかというと、「手続き型プログラミングに馴染んでしまっていて抽象化が苦手な自分の思考方法をもう少しなんとかしたい。」という悩みがあるので。

 ソフトウェア設計での “抽象化” というのは、単純にいえば汎用化すること。要は、1度作成したモジュール(機能単位にまとめられたプログラム)をちゃんと再利用可能にする為の考え方。
 逆に “手続き型” は、あくまでも今作っているプログラムに必要な処理を、今必要な手順に従い、通り一辺倒に組み立てただけのもの…という感じですかね。(プログラミング・パラダイムが体系化される中で “手続き型” と呼ばれるようになったもの。汎用化設計を念頭に置いた概念ではなく、比較的自然発生的に形作られたプログラミング手法。)
 いちおう手続き型も、「プログラム内での再利用性は考慮に入れたもの」という定義があるようなのですが、”今作っているもの” に捕らわれないもっと広い視点での再利用性を得たいのです。

 そのようなわけで、なるべくなら作るプログラムをすべからくモジュールとして汎用化できるようにしていきたい。(実際にすべからく汎用モジュールに仕立てる必要はないので、実際は基本設計くらいは済ませておく感じ。)

 そこで必要になるのが、最初のブロック図。
 ブロック図に新しく追加するモジュールが、他の機能に対してどういう立ち位置でどう振舞うのが適切か。そもそもそのモジュールは固有のものか。既存のモジュールはどういう機能としてモジュールを求めているか。

 要は、今ある資源(リソース)と要求を満たす新しい資源の関係を把握する。
 書かなければならない(足りない)処理はどの部分なのか。

 今ある資源とのコラボレートを大事にする。という発想かなーなんて思ったり。

 なかなか読み進めてないので、あの本も早く読み進めないといけない..