単一責任の原則でカレー作り
こんにちは、Javaおじさんのシキムです。
40才目前で、プログラム工学に興味を持ったので本や記事で読んだ難しい話を
咀嚼して簡単な言葉で語りたいと思います。
今回は、単一責任の原則(Single Responsibility Principleというものについてです。
ざっくりと、、、
1つのクラスとかメソッドにいろいろなことをさせるといろいろ大変だから、
1つのクラスとかメソッドにひとつのことをさせると楽ですということ。
詳しくは偉い人の話を読んでください。
ここでは、この原則をカレー作成装置に見立てて解説したいと思います。
では、さっそくカレー作成装置を作りましょう。
カレー作成装置(メソッド名)
入れるもの(引数):
人参、ジャガイモ、玉ねぎ、肉
作業(処理内容):
人参の皮をむき、ジャガイモの皮をむき、玉ねぎの皮をむき、
人参を切り、ジャガイモを切り、肉を切り
鍋に入れて煮込み、カレールーを入れて、ご飯にかける
出てくるもの(戻り値):
カレー
やりましたね、カレー装置完成です。
しかし、試しに起動したところカレーは出てきませんした。
こうなると、この装置でいろいろな作業している(責任を持っている)ので修理するのは
どこが壊れているか特定する必要がありめっちゃ大変です。
では、単一責任の原則を意識して装置を新たに作りましょう。
人参下ごしらえ装置
入れるもの(引数):
人参
作業(処理内容):
人参の皮をむき、人参を切る
出てくるもの(戻り値):
下ごしらえ人参
ジャガイモ下ごしらえ装置
入れるもの(引数):
ジャガイモ
作業(処理内容):
ジャガイモの皮をむき、ジャガイモのを切る
出てくるもの(戻り値):
下ごしらえジャガイモ
玉ねぎ下ごしらえ装置
入れるもの(引数):
玉ねぎ
作業(処理内容):
玉ねぎの皮をむき、玉ねぎを切る
出てくるもの(戻り値):
下ごしらえジャガイモ
肉下ごしらえ装置
入れるもの(引数):
肉
作業(処理内容):
肉を切る
出てくるもの(戻り値):
下ごしらえジャガイモ
カレー作成装置
入れるもの(引数):
下ごしらえ人参、下ごしらえジャガイモ、下ごしらえ玉ねぎ、下ごしらえ肉
作業(処理内容):
具材を鍋に入れて煮込み、カレールーを入れて、ご飯にかける
出てくるもの(戻り値):
カレー
真カレー装置完成です。
どうでしょうか?
下ごしらえ装置を別にすることでカレーが出てこない場合にも、どれか下ごしらえに問題があるのか
煮込みに問題があるのか確認が容易になったと思います。
そしてお気づきだろうか、
下ごしらえ装置をそのままに肉じゃが装置もシチュー装置も作れることを!!!
そう、気付いたら使いまわしも簡単になってます。
以上が、おじさんなりの単一責任の原則の理解です。
というかこの先が話の本題だったり。
が、話はここでは終わらない。ここまでの話を聞くと装置がバラバラなるほどいいような気がしませんか?
少し本気を出して。装置を分けてみましょう
・人参の皮に刃をあてる装置
・人参の皮にあてた刃を動かす装置
・人参をまな板の上に移動する装置
・まな板の上の人参を刃をあてる装置
・まな板の上の人参の上の刃を動かしてきる装置
↑の装置のジャガイモ版も作らないと
↑の装置の玉ねぎ版もつくらないと
↑煮込みも細かい工程いろいろあるよね。。。。。
↑まて、人参の位置を特定する装置も必要じゃないのか?
いや、いくつ装置を作る気なんだ。。。。
装置をバラバラにすることにこだわりすぎてしまうと、このような事態となってしまいます。
こんなことになると、逆にどこが問題になったのか調べるのも大変になってきます。
それでは本末転倒ですよね?
バラバラにすることが目的なんじゃない。
システムごとに最適な大きさの責任をクラスやメソッドに持たせていくことが
大事なんじゃないかなと思います。
Discussion