2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

単一責任の原則

Last updated at Posted at 2020-04-15

##単一責任の原則 (Single responsibility principle)

クラスは1つのことだけ責任を負う

もし複数の責任を負っているとすれば、それは伝播する
つまり、1つの変更内容が伝播してしまう

ある日の会話

私「この原則を徹底すると、クラスを大量に作成しないといけないから、ファイル管理が大変にならない?」

兄「そうだね。実際コードを書いて説明するよ」
兄「まず悪い例ね」

悪い例1
class BadSampleConstructChange
{
    public function __construct(array $users)
    {
        $this->user = $users;
    }

    public function A(){}
    public function B(){}
    public function C(){}
}

兄「コンストラクタに渡すものに修正が入ると、A、B、Cメソッド全てに変更が必要になる」

兄(メソッド内容とメソッド名は省略するわ)

私(おけ)

悪い例2
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);
    }
}
悪い例2-Bメソッドを変更する
    public function B(): ?string
    {
        if (something_if) {
            $this->userName = null;
        }
        return $this->userName;
    }

兄「悪い例2は、お互いプロパティを触り合っているから、どこか1つ変更があると他が壊れちゃう」

私「たまにバグの原因になったりするやつね・・」

悪い例3
class BadSampleComplexity
{
    public function ABC()
    {
        $this->A();
        $this->B();
        $this->C();
    }

    public function A(){}
    public function B(){}
    public function C(){}
}
悪い例3-SampleOneControllerで使用
$BadSampleComplexity = (new BadSampleComplexity())->ABC();
悪い例3-SampleTwoControllerで使用
$BadSampleComplexity = (new BadSampleComplexity())->ABC();

兄「あとは、1つの関数内で⾊々やってて何かすると他の利⽤者が困るやつもダメだね」

兄「例えば、SampleTwoControllerで呼び出すときはBメソッドの処理がいらないってなった時、ABCメソッドにif文をいれると呼び出し箇所すべてで条件分岐の判定が入るから、パフォーマンスが下がる。」

私「if文入れない場合でも、ACメソッドっていうほぼ同じメソッドがコピペされることになっちゃうね」

私「じゃあ、やっぱり1クラス、1処理が正解なのかな?」

兄「うーん。正解とも一概には言えなくもないけど。。」

兄「実際に開発するときは、単一責任の原則と、クラス分割の兼ね合いが大事だと思うよ」

兄「要は、変更内容の伝播が発生しなければOK

私「なるほどねー!理解が進みました。ありがとう」

おわり

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?