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