##単一責任の原則 (Single responsibility principle)
クラスは1つのことだけ責任を負う
もし複数の責任を負っているとすれば、それは伝播する
つまり、1つの変更内容が伝播してしまう
ある日の会話
私「この原則を徹底すると、クラスを大量に作成しないといけないから、ファイル管理が大変にならない?」
兄「そうだね。実際コードを書いて説明するよ」
兄「まず悪い例ね」
class BadSampleConstructChange
{
public function __construct(array $users)
{
$this->user = $users;
}
public function A(){}
public function B(){}
public function C(){}
}
兄「コンストラクタに渡すものに修正が入ると、A、B、Cメソッド全てに変更が必要になる」
兄(メソッド内容とメソッド名は省略するわ)
私(おけ)
class BadSampleOneChange
{
public function __construct(string $userName)
{
$this->userName = $userName;
}
public function A(): string
{
return $this->something_A($this->userName);
}
public function B(): string
{
return $this->something_B($this->userName);
}
public function C(): string
{
return $this->something_C($this->userName);
}
}
public function B(): ?string
{
if (something_if) {
$this->userName = null;
}
return $this->userName;
}
兄「悪い例2は、お互いプロパティを触り合っているから、どこか1つ変更があると他が壊れちゃう」
私「たまにバグの原因になったりするやつね・・」
class BadSampleComplexity
{
public function ABC()
{
$this->A();
$this->B();
$this->C();
}
public function A(){}
public function B(){}
public function C(){}
}
$BadSampleComplexity = (new BadSampleComplexity())->ABC();
$BadSampleComplexity = (new BadSampleComplexity())->ABC();
兄「あとは、1つの関数内で⾊々やってて何かすると他の利⽤者が困るやつもダメだね」
兄「例えば、SampleTwoControllerで呼び出すときはBメソッドの処理がいらないってなった時、ABCメソッドにif文をいれると呼び出し箇所すべてで条件分岐の判定が入るから、パフォーマンスが下がる。」
私「if文入れない場合でも、ACメソッドっていうほぼ同じメソッドがコピペされることになっちゃうね」
私「じゃあ、やっぱり1クラス、1処理が正解なのかな?」
兄「うーん。正解とも一概には言えなくもないけど。。」
兄「実際に開発するときは、単一責任の原則と、クラス分割の兼ね合いが大事だと思うよ」
兄「要は、変更内容の伝播が発生しなければOK」
私「なるほどねー!理解が進みました。ありがとう」
おわり