本について
Amazon: https://www.amazon.co.jp/dp/4822284654
題材として選択したのは、「オブジェクト指向でなぜつくるのか-第2版-」という本です。13章で構成されており、今回は第7章について、まとめました。
ゴール
- 「オブジェクト指向が現実世界をそのままソフトウェアに表現する技術」とは限らないことを理解する
- 上流工程におけるオブジェクト指向の仕組みを簡潔に説明できる
ソフトウェアは現実世界の仕事の一部を肩代わりする
しばしばオブジェクト指向は「現実世界をそのままソフトウェアに表現する技術」と説明されることが多いそうですが、これが混乱を招いてしまうことがあるようです。
例えば、病院のシステムが現実の病院をそのまま表現しているかと言えば、そうではないはずです。病院のシステムは、患者のカルテを記録したり、医療費を計算したりするかもしれません。しかし、患者を診察したり、面倒を見たりするのはシステムではなく人間です。
つまり ソフトウェアはあくまで人間が楽をするために現実世界の「仕事の一部を肩代わり」だけ です。よって、オブジェクト指向は「現実世界をそのままソフトウェアに表現する技術」という説明では混乱を招いてしまいます。
上流工程におけるオブジェクト指向の仕組み
オブジェクト指向が下流工程の分野で生産性や品質、再利用性などを高める効果があると認められたため、この技術を上流工程である業務分析や要件定義に適用して、システム開発全体の生産性や品質を上げようとする動きが起きました。
しかし、下流工程のオブジェクト指向プログラミングの仕組みをそのまま上流工程の業務分析や要件定義に適用しようとしても、必ずしもうまく当てはまらなかったようです。
このため上流工程にオブジェクト指向を適用する際には、オブジェクト指向プログラミングの仕組みを応用した形、すなわちオブジェクト指向プログラミングの仕組みを「使える部分だけ使う」形で適用しました。
その結果、上流工程におけるオブジェクト指向は2つの基本的な仕組みを提供することになりました。 集合論 と 役割分担 という考え方です。
集合論
オブジェクト指向プログラミングにおいて、クラスはサブルーチンと変数をまとめるもので、クラスからインスタンスをたくさん作れる仕組みでした。これは集合論における集合と要素に似ていたため、クラスとインスタンスは上流工程で集合論に応用されることになりました。
例えば、現実世界で「ヤマモトさんとタナカさんが従業員」だとしたら、「ヤマモトさんとタナカさんがインスタンスで、従業員がクラス」、つまり「ヤマモトさんとタナカさんが要素、従業員が集合」のように整理することができます。
またオブジェクト指向プログラミングでは、クラス定義の共通部分をまとめて別クラスに切り出す仕組みだった継承も、全体集合と部分集合の考え方に応用されました。
例えるなら、「人間を男と女に分類すること」に使用できる考え方です。
役割分担
オブジェクト指向プログラミングにおいて「メッセージパッシング」は、インスタンスを指定して、クラスにまとめられたメソッドを呼び出す仕組みでした。この仕組みは上流工程で「ある特定の役割を待つもの同士が、決められた方法で連絡し合う様子」を表現する、役割分担のモデルに応用されました。
例えば、「レストランでウエイトレスに料理を注文する」「ウエイトレスがコックに注文を伝えて料理を作らせる」というような一連の流れから役割分担を表現できます。
※ 「客」は注文する役割を担っていて、「ウエイトレス」は注文を受けてコックに伝える役割を担っている。
まとめ
-
オブジェクト指向は「現実世界をそのままソフトウェアに表現する技術」ではなく、現実世界の仕事の一部を肩代わりするものである。(そもそもコンピュータ・ソフトウェアがそういった側面を持っているため)
-
上流工程におけるオブジェクト指向は、 集合論を用いて物事を分類し整理する仕組み と 役割分担を表現する仕組み を備えた 汎用の整理術 である。
所感
私は以前に社内システムを実装したことがあるのですが、そのときにメンバーの作業を全て自動化しようとしてうまくいかなかったことがありました。
なぜなら、コンピュータやソフトウェアが得意とする分野(計算・記録)を意識しないまま、現実世界で行われている全ての作業をシステムとして実装しようとしたからです。
この章を読んで改めて実感したのですが、現実世界を全てプログラミングで実現しようとするのではなく、現実世界で行われている作業のどの部分をシステムとして実装できるか、コンピュータやソフトウェアの特徴を考慮しつつ設計することが大切だなと思いました。