オブジェクト指向において、メソッド呼び出し関係をどうするか、の考え方です。
Tell, Don’t Ask
オブジェクトに、データを要求するのでなく、何をすべきかを指示すること
オブジェクトには、やることをズバッと指示しましょう、ということです。
どんなとき使うの?
get,get,get…と並んでるとき
ふんふーん♪
String name = employee.getName();
int age = employee.getAge();
String address = employee.getAddress();
String phoneNo = employee.getPhoneNo();
...
get 呼んでばっかりだけど、呼び出し元で色々やりすぎなんじゃない?
「getしてgetしてgetして、なんか処理…」わりとよく見かけるコードかもしれません。
でも、オブジェクト指向的にはイケてない。
呼び出し元で色々やりすぎ問題
手続き型プログラミングに慣れた人がやりがち
「getしてgetしてgetして、なんか処理…」とやるときは、だいたいこんな考え方をしています。
- 呼び出す側のクラス:処理を担当
- 呼び出される側のクラス:データ管理を担当
手続き型プログラミングでは「処理とデータを分割する」という考えがあります。しかしこれをすると、呼び出し元クラスにすべての処理が集中しがちです。
ドメインモデル貧血症 と呼ばれるアンチパターンです。
オブジェクト指向プログラミングでは、「責任で分割する」の考えが大事になります。単一責任原則 ですね。
その作業について責任を持つ人に、作業を依頼する。そういう考え方が重要です。
- 呼び出す側のクラス:作業を依頼する人
- 呼び出される側のクラス:責任もって作業する人
単一責任原則 にのっとったクラス分割が大事!
getterがあるのが悪いわけではない
この話をすると、
getterがあるのが悪いんだ!getterを撲滅せよ!
となりかねませんが、それは話が違います。
getterがあること自体は、問題ないのです。あったほうが便利なこと多いですし。
問題なのは、同じオブジェクトに対して、何回も問い合わせを行っていること。責任で分割するなら、やってほしいことを1回で伝え任せるほうが、責任分界点が明確になります。
オブジェクトには、1回でやることを指示しよう!
先輩と後輩の関係にも似ている…
この関係、なんだか、先輩と後輩の関係にも似ています。
先輩が後輩に指示します。こんな先輩いませんか?
- 「あれはどうなってる?」
- 「これはどうなった?」
- 「ええい、もうおれがやる!」
一方、こんな先輩もいます。
- 「これ、お願いね!」
どちらのほうが、円滑に仕事がまわるか、分かりますよね?
適切に権限を委譲することは、プログラムにおいても、組織においても、大切です。
まとめ
「getしてgetしてgetしてなんか処理…」という処理、安直に思いつきやすいです。
深い考えなしにクラス設計すると、このパターンに陥りがち。
責任分割を意識したクラス設計をしましょう。
コメント