🧙‍♂️

SOLIDについて書き記していくだけ#1

2024/04/27に公開

Single Responsibility : 単一責任の原則

→モジュールはたった一つのアクターに対して責務を負うべきである

モジュール:ソースファイル

アクター:同じ振る舞いを要望する人等をまとめたグループ

目的

責務を集中させることを避ける
責務を集中するどうなるか?
→モジュールに対して変更を行う時、責務が集中していると他の本来関係ない振る舞いに影響を及ぼす可能性がある。

コード例

違反例🙅‍♀️
それぞれのアクターに対してgetRegularHours()が責務を持っているため
getRegularHours()を修正した時にそれぞれのアクターに影響を及ぼしてしまう

class Employee {
    private readonly string $name;
    private readonly string $department;
    private readonly int $hourlyWage;

    // 給与計算するメソッド
    // 経理部に対して責務を負っているメソッド
    public function calculatePay()
    {
        $this->getRegularHours();
    }

    // 勤務時間を集計するメソッド
    // 人事部に対して責務を負っているメソッド
    public function reportHours()
    {
        $this->getRegularHours();
    }

    private function getRegularHours()
    {
     // 労働時間を返すメソッド
     // 経理部・人事部のメソッドに対して責務を持っている
     // 経理部に必要な変更を行なった場合、人事部のメソッドにも影響が出る
    }
}

改善例🙆‍♀️
経理部と人事部に必要なメソッドを分離してそれぞれクラス化
それぞれのメソッドはそれぞれの変更に対して独立している

// 従業員のデータを持つクラス
class Employee
{
    public function __construct(
        public string $name,
        public string $department
    ){}
}

// 経理部に対して責務を負っているクラス
class PayCalculator
{
    public function __construct(
        public Employee $employee
    ){}

    // 給与計算するメソッド
    public function calculatePay() {
        $workingTime = $this->getRegularHours();
        // 労働時間を使って計算する
    }

    private function getRegularHours(){
		    // 労働時間を返すメソッド
    }
}

// 人事部に対して責務を負っているクラス
class HourReporter
{
    public function __construct(
        public EmployeeData $employee
    ){}

    // 勤務時間を集計するメソッド
    public function reportHours()
    {
        $this->getRegularHours();
    }

    private function getRegularHours(){
		    // 労働時間を返すメソッド
    }
}

Discussion