コラム

少しだけ違うコードは TemplateMethod テンプレートメソッドパターンで効率的に書く

※この記事の注意事項
・できるだけ初心者の方が理解しやすいように、細かい説明は省略しております。
・最後まで読み進められるように、多少ユーモアを交えて表現していることがあります。

========================================

さて、オブジェクト指向の世界にはGoFパターンというデザインパターンが存在します。
全部で23パターンあるのですが、そのすべてが現在も有効か?というとそうでもないのです。

しかしながら、保守などを行う機会のある方は、このGoFパターンを理解しておくことで、過去のソースコードの理解が容易になったりします。
また、フレームワークの内部仕様などは、このGoFパターンを使って書かれていることも多いので、フレームワークの理解にも役立ちます。

ですので、考え方としてGoFパターンを押さえておくというのがよいだろうと思います。

少しだけ違うコードは TemplateMethod テンプレートメソッドパターンで効率的に書く

テンプレートメソッドは、ほとんど同じ処理なのに、少しだけ違うプログラムがあるといった場合に使用できます。

例えば、APIでデータを取得して表示するプログラムがあるとします。APIは一つではなく、いくつかのAPIから取得する場合もあるといった場合です。

具体的に言うと、Yahoo!JAPAN APIから取得して表示する場合と、Amazon APIから取得して表示するといった場合です。

どちらもAPIからデータを取得して表示するので、値をセットすることや、値を表示する処理は同じです。
違う部分はAPIからデータを取得する部分のみです。

/**
* APIからデータを取得する抽象(abstract)クラス
*/
abstract class Api
{
    //APIから取得したデータ
    public $data;

    //APIデータをセットする
    public function setData($apiData)
    {
        $this->data = $apiData;
    }

    //APIデータを表示する
    public function getData()
    {
        var_dump($this->data);
    }

    //APIから値を取得する処理は継承先でそれぞれが行う
    abstract public function getApiData();
}

/**
* Yahoo!JAPANからAPIデータを取得するクラス
*/
class YahooJAPAN extends Api
{
    
    function __construct()
    {
        # code...
    }

    public function getApiData()
    {
        //Yahoo!JAPANからAPIデータを取得するプログラムを書く
        $apiData = 'Yahoo!JAPAN API DATA';

        $this->setData($apiData);
    }
}

/**
* AmazonからAPIデータを取得するクラス
*/
class Amazon extends Api
{
    
    function __construct()
    {
        # code...
    }

    public function getApiData()
    {
        //AmazonからAPIデータを取得するプログラムを書く
        $apiData = 'Amazon API DATA';

        $this->setData($apiData);
    }
}

$yahoo = new YahooJAPAN();
$yahoo->getApiData();
$yahoo->getData();

$amazon = new Amazon();
$amazon->getApiData();
$amazon->getData();

ソースコードを見て、これって親子関係の継承で、子に処理を強制するabstractじゃない?と思った方、するどいです、その通りです。

このGoFというデザインパターンは、1987年に発表されたものです。ですので、それからプログラムの世界は様々な便利な仕組みができあがっているので、知らず知らずのうちに使っているものも多くあります。

でも理解しておくと、プログラマーどうしでの会話がしやすくなったりしますので、用語を覚えるという意味では重要ですのでぜひ覚えておきましょう。

テンプレートメソッドは基本的にこれだけなのですが、ここで足りないことは$dataの形式がわからないってことですね。

$dataをクラス形式やデータ形式でタイプヒンティング(型宣言)しておくとより完璧なコードになると思います。

========================================

▼PHPのオブジェクト指向とデザインパターン記事一覧

関連記事

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。