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

投稿日:

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

「オブジェクト指向設計」について理解を深めていくシリーズ。「オブジェクト指向設計実践ガイド」を読んでの備忘録になります。今回はオブジェクトの依存関係を管理するために意識すべき視点を学びます。オブジェクト間に生まれる依存関係について、「必要な依存」なのか、それとも「不必要な依存」なのかを見極めるためのポイントを学習します。

 

目次

 

オブジェクト同士の依存関係を管理することとは

前回、【Ruby】オブジェクト指向設計を噛み砕いていく(#1 単一責任を意識したクラス設計)にて、「プログラムは必ず変化が求められる」という大前提を学び、未来に発生するであろう変化を受け入れるための、変化に対応しやすいコーディングを書く必要性について理解しました。単一責任でクラス(オブジェクト)を設計することによるメリットや、意識すべき視点について理解することで、今後のより良いコードを設計するに当たって、「どのような書き方がオブジェクト指向設計的に望ましいか」という基準を得ることができました。

今回はその続きです。単一責任を意識し、適切に設計されたオブジェクトは、オブジェクト同士で「共同作業」を行うことになります。これは本質的なものあり、責任をあるべき所に隔離していく単一責任の考え方が徹底されたオブジェクトは、他の責任(情報)について、他のオブジェクトに依存せざるを得ないためです。「依存せざるを得ない」という書き方だと語弊が生じますが、この状態が本来のあるべき姿だということです。

「オブジェクト指向設計」とは、オブジェクト間の依存関係を管理することであり、適切なオブジェクト指向設計を行うためには、「依存関係の見極め」が大切になってくる、というのが今回のテーマです。

 

「必要な依存」と「不必要な依存」を見極める

それぞれのオブジェクト間に生じる依存関係に対し、「必要な依存」と「不必要な依存」の見極めるための視点について、根幹には「プログラムは変化が必要なものである」という考え方が適用されております。つまり、依存の取捨選択基準についても、「将来の変化に対応しやすいかどうか」が適用され、その依存関係が必要か不必要かどうかは、詰まる所「時と場合による」という回答が返ってくることになります。

依存関係とはそもそも何なのか

それでは結局どうすればいいんだ、という話ですが、まず依存関係が発生している状況を把握しなければなりません。

オブジェクト間で依存関係が発生するパターンは複数あります。

  1. あるオブジェクトが、他のクラス名をコード内に含んでいる
  2. あるオブジェクトが、他のクラスが持つメソッドをコード内に含んでいる
  3. あるオブジェクトが、他のクラスのメソッドが必要とする引数をコード内に含んでいる
  4. あるオブジェクトが、他のクラスのメソッドが必要とする引数の渡す順番関係を知っている

これらのどれかが該当するとき、「あるオブジェクト」と「他のクラス」との間に、依存関係があるということになります。

 

1、あるオブジェクトが、他のクラス名をコードに含んでいる

この場合 「BlogsController」クラスは、「Blog」というクラスをコード内に含んでおります。「BlogsController」がオブジェクト化されたとき、この状況に当てはまります。

 

2、あるオブジェクトが、他のクラスが持つメソッドをコード内に含んでいる

この場合「BlogsController」クラスは、「Blog」クラス(Active Record)が持つ「all」メソッドをコード内に含んでおります。

 

3、 あるオブジェクトが、他のクラスのメソッドが必要とする引数をコード内に含んでいる

この場合「BlogsController」クラスは、「Blog」クラス(Active Record)が持つ「new」メソッドに渡す引数「title」と「content」をコード内に含んでおります。

 

4、あるオブジェクトが、他のクラスのメソッドが必要とする引数の渡す順番関係を知っている

この場合「BlogsController」クラスは、Blog」クラス(Active Record)が持つ「new」メソッドに渡す引数「title」と「content」の渡す順番を知っている状況になります。

第一引数が「title」、第二引数が「content」だという順番を知っているということです。

 

依存関係とうまくやっていくには

上で出した例えの通り、Railsのコントローラを少し覗くだけでも、オブジェクト間には依存関係が非常に多いことがわかります。依存関係は必ず存在するものであり、これら多くの依存関係から「不必要な依存」を見極めることが、「オブジェクト指向設計」を行う上で大切であるということです。

依存は必ず存在しますし、プログラムの変化も必ず訪れます。依存が深ければ深いほど、プログラムを変化させたときの副作用は強くなります。必要な依存だけを残し、最小限に留めることが理想であり、そのための具体的なコーディングの技法が存在します。それが「依存オブジェクトの注入」です。

 

依存オブジェクトの注入

Dependency Injection 依存オブジェクトの注入 についてのおぼえがき - kasei_sanのブログ

上のリンクのブログを書いた方は、おそらく僕と同じ本を読んでます。これを見ていただくと「依存オブジェクトの注入」基本型についてわかります。

依存関係にあるインスタンス生成を、そのオブジェクトの外に移動させることで、結合を切り離すという技法です。プログラムの変更コストを下げ、再利用性を高める手法として利用されている方法です。

 

まとめ

オブジェクト指向設計について、本が言いたいことは理解できるのですが、実践できるかと言われるとあまりイメージが沸いていないのが正直なところです。Railsはそもそも、このオブジェクト間の依存関係をスッキリと整えてくれているんだろうなと感じます。MVC構造やビューヘルパーの仕組みがあることで、コーディングで生まれる不必要な依存関係を、上手いこと絶ってくれている気がします。というよりクラスの設計を意識することはRailsアプリでほとんど無いので、全てやってくれているレベルだと感じます。今後も引き続きオブジェクト指向設計を勉強したいと思います。

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

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

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