メソッドからコンストラクタへのパラメータの移動によるリファクタリング

著者:杉浦

メソッドからコンストラクタへのパラメータの移動によるリファクタリング

 このリファクタリングはあるオブジェクトの複数のメソッドで同じパラメータを渡している場合に有効です。コンストラクタでパラメータを定義することによって、インスタンス化された際にあらかじめ何度も渡されるはずだったパラメータを定義することによってコードをシンプルにします。
 次は期限が1日になる様にのAPIトークンを更新するメソッドの呼び出しです。これを行う箇所が複数のコードファイルの中で何度も出てくると仮定します。その場合[‘expired_at’ => now()->addDay()->format(‘Y-m-d H:i:s’)]も何度も出てくるということです。この状態でAPIトークンの期限を3時間にしたいという要求が来た場合、変更箇所が複数に渡り少々面倒なことになります。(置換で対処しようにも妙な変数名や何やらで失敗するかも)そうでなくとも単に行が長くなりがちです。

/** @var ApiToken $api_token */
$api_token->fill(['expired_at' => now()->addDay()->format('Y-m-d H:i:s')]);

 これをApiTokenクラスのコンストラクタに記述し、fillの度に呼び出すことで改善します。

class ApiTokens extends Model
{
    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $this->new_expired_at = now()->addDay()->format('Y-m-d H:i:s');
    }
    public function fill(array $attributes)
    {
        $attributes['expired_at'] = $this->new_expired_at;
        return parent::fill($attributes);
    }
}

 こうするとクラスApiTokenからインスタンス$api_tokenを定義するたびに更新用の新たな期限が$api_tokenのプロパティに設定され、fill()に新たな期限の値を渡さずともfill()は新たな期限をトークンに設定します。例では1つのメソッドでのみプロパティを扱いましたがこれが複数のメソッドになってくるとなお効いてきます。

/** @var ApiToken $api_token */
$api_token->fill();
  • この記事いいね! (0)

著者について

杉浦 administrator