インターフェースの抽出 (リファクタリング-p341)
リファクタリング
Published: 2019-03-19

目的

「リファクタリング」を理解するためにサンプルコードを PHP で書き換えてみました。

今回は「インターフェースの抽出」について書きます。

「インターフェースの抽出」 について

複数のクライアントが、あるクラスのひとまとまりのインターフェースを使っている。または2つのクラス間でインターフェースの一部が共通である。

クラスは、互いにさまざまな方法で利用し合います。あるクラスを利用することは、しばしばそのクラスのすべての責任を当てにすることを意味します。

変更前

<?php

class Timesheet
{
    public function charge(Employee $emp, $days)
    {
        $base = $emp->getRate() * $days;

        if ($emp->hasSpeciallSkill()) {
            return $base * 1.05;
        }

        return $base;
    }
}

class Employee
{
    public function getRate()
    {
        return 0.72;
    }

    public function hasSpeciallSkill()
    {
        return true;
    }
}

$e = new Employee();
$ts = new TimeSheet();
echo $ts->charge($e, 200) . "\n";

変更後

<?php

class Timesheet2
{
    public function charge(Billable2 $emp, $days)
    {
        $base = $emp->getRate() * $days;

        if ($emp->hasSpeciallSkill()) {
            return $base * 1.05;
        }

        return $base;
    }
}

class Employee2 implements Billable2
{
    public function getRate()
    {
        return 0.72;
    }

    public function hasSpeciallSkill()
    {
        return true;
    }
}

interface Billable2
{
    public function getRate();
    public function hasSpeciallSkill();
}

$e = new Employee2();
$ts = new TimeSheet2();
echo $ts->charge($e, 200) . "\n";