【Ruby】オブジェクト指向設計を噛み砕いていく(#3 柔軟なインターフェースとは)

投稿日:

プログラミング初心者の勉強ブログ #80

「オブジェクト指向設計」について理解を深めていくシリーズ。「オブジェクト指向設計実践ガイド」を読んでの備忘録になります。今回はオブジェクトのインターフェースを意識する取り組みです。前回までの「プログラムはクラスから成り立つ」という考えから一転、「プログラムはメッセージによって定義される」という視点で見たときの、より良い設計方法についてです。

 

目次

 

前回までの内容

 

オブジェクト指向設計で考慮すべき3つの点

前回までの内容で、オブジェクトはクラスから成り立ち、それぞれのオブジェクトは単一責任になるような設計が理想であり、それゆえ発生するオブジェクト間の依存関係を管理することこそ、オブジェクト指向設計そのものだという考え方を学びました。

一方で、今回の内容は視点が少し異なります。「オブジェクトの成り立ち方」ではなく「オブジェクト間で渡し合うのメッセージの定義の仕方」という部分から、オブジェクト指向設計を学んでいくことになります。

「オブジェクト同士が渡し合うメッセージ」とは、具体的には「メソッド」のことを指します。クラスを元に生成されたオブジェクトは、内部にメソッドを有します。このメソッドは自身の特徴から、「振る舞い」であったり「メッセージ」という呼ばれ方をされます。

このメソッドを用いて、オブジェクト同士は会話をし連携するのであり、そのためオブジェクト指向設計は「メッセージによって定義される」ということもできます。

クラスによって成り立ち、メッセージによって定義されるオブジェクト指向設計を行うにあたって考慮すべき点は以下の3つです。

 

1,オブジェクトの責任

「将来に起こりうるブログラムの変化に柔軟に対応すること」をプログラム開発の念頭に置いたとき、オブジェクトは必ず1つの目的を持ち、その目的に対してのみ責任を持つ設計が良いという考え方です。

詳しくは

【Ruby】オブジェクト指向設計を噛み砕いていく(#1 単一責任を意識したクラス設計)

こちらで書きましたが、それぞれのオブジェクトが自分の目的以上の責任を持つことによって、オブジェクト同士が結合してしまい、将来に起こりうるブログラムの変化に柔軟に対応することが容易でなくなります。

 

2,オブジェクトの依存関係

オブジェクトは必ず依存関係が発生します。オブジェクトがそれぞれ振る舞いを持ち独立し、他のオブジェクトとメッセージのやり取りを行い、処理が進みプログラムが動きます。

【Ruby】オブジェクト指向設計を噛み砕いていく(#2 オブジェクトの依存関係を管理する)

依存関係は必要最低限に抑えることが理想であり、そのために「必要な依存」と「不必要な依存」を見極める必要があるということが考慮すべき点になります。

 

3,オブジェクトが交わすメッセージ

上の2つが、「オブジェクト指向アプリケーションはクラスから成り立つ」という「クラス」を中心に置く考え方に対し、今回は「メッセージ(メソッド)」を中心に置いたときの考え方になります。

「メッセージを送るためにオブジェクトがある」という考え方で設計ができるようになったとき、それはオブジェクト指向の「キャリアの転機」になるそうです。より柔軟なアプリケーションを作成するためには、「メッセージ」を中心に考えた設計が不可欠です。

 

「メッセージ」という概念をたくさん言ってますが、具体的には、

「メッセージ」=メソッドとその引数

であり、オブジェクトはそれぞれが持つ「メソッドとその引数」を使って会話をしてるという話です。

 

オブジェクトのパブリックインターフェース

クラスを定義するとき、内部にそのクラスの振る舞いに当たるメソッドを用意します。メソッドには外部に出す「パブリックなメソッド」と、外部に晒さない「プライベートなメソッド」が存在します。

オブジェクトが会話をするために使う「メッセージ」は、パブリックなメソッドに該当するわけであり、このパブリックなインターフェースを構成するメソッドに着目することが、オブジェクトに必要のない責任を持たせない設計をしていくにあたって大切だということです。

「依存の発生原は、オブジェクト同士のパブリックインターフェースだから、クラスを構成するときや依存を減らしたいときはそこを注意してね」

という話だと思います。

では具体的に何に注意したら良いのかですが、それが次の段落になります。

 

「どのように」よりも「何を」で考える

大事なのは、「オブジェクトの責任の範囲を的確に捉えられるか」だと考えます。

オブジェクトは単一責任であり、与えられた1つの目的を達成することのみに特化すべきです。逆に言えば、他の目的に関する責任は排除すべきであり、このときオブジェクトは

「自分が何を望んでいるか」

のみに対し責任を持つことになります。ですので、

「何を」が大切であり、「どのように」は必要ありません。

自分が達成しなければならない目的に必要なものは「何なのか」さえ知っていれば良く、「どのように」その必要なものが用意されるかに関しての情報は一切必要なく、排除の対象になるということです。

このように「オブジェクトの責任の範囲」がどこまでなのか、という境界線を意識して設計を実践していくことが大切です。

 

まとめ

前回までの「クラス」を中心に置いたオブジェクト指向設計では、「オブジェクト指向設計は基本的に全てRailsがやってくれている」という感想に終わりました。しかし、今回の「メッセージ(メソッド)」を中心に置いた考え方では、メソッド作成に対してオブジェクト指向の考え方が求められるのであり、それはつまりオブジェクト指向設計に開発者が介入するというわけです。

Railsアプリにおいて、メソッド作成が「オブジェクト指向設計」と「開発者」のパブリックインターフェースなのかなと。

でもこの場合、開発者の目的は「変化に柔軟なアプリを開発すること」であり、開発者の僕は「アプリの完成」を望んでいて、「どのように開発するか」という部分はオブジェクト指向設計だと責任の範囲外になるはずなんですけどね。オブジェクト指向と現実は違うということなのか、それとも僕の理解が間違っているのかはわかりません。

以上ありがとうございました。

 

-プログラミング学習
-, ,

Copyright© s u p ? , 2019 All Rights Reserved.