スタイル・エッジLABO技術ブログ

士業集客支援/コンサルティングのスタイル・エッジグループ スタイル・エッジLABOのエンジニアによるブログです。

デザインパターンについて勉強してみた!

はじめに

こんにちは。スタイル・エッジLABOのOです。

今回は最近業務でよく関わるデザインパターンについて、自分の勉強もかねてご紹介したいと思います。

1.DTOについて

はじめにDTOについてご紹介します。DTOとは「Data Transfer Object」の略で、デザインパターンの一種です。
デザインパターンとは主にJavaなどのオブジェクト指向言語で使われる設計パターンの事ですね。

DTOはどういうデザインパターンかというと、データの入れ物としてのクラスを作成し、そのクラスにデータを入れて渡す、というパターンです。そのクラスには変数と変数の型を定義します。

実際に使う場合のイメージ図を見てもらうと、わかりやすいかと思います。

f:id:styleedge_tech:20200219131440j:plain
DTOイメージ図


データを受け渡す際に通るトンネルがDTO、というイメージです。

このDTOには何のメリットがあるのでしょうか?下記2点などがあるかと思います。

1.変数と変数の型が定義されたクラスを用意することで、可読性が向上する
2.DTOで型を指定することで、データの整合性を保つ

実際のサンプルコードとしては以下のようになります。

<?php

/**
 * Class TestViewDto
 * データベースから受け取ったデータをControllerからViewへ受け渡す時に使うDto
 */

class TestViewDto
{
    /**
     * @var int ID
     */
    private int $id;

    /**
     * @var string 名前
     */
    private string $name;

    /**
     * @var string 住所
     */
    private string $address;

    /**
     * @var int 電話番号
     */
    private int $tel;

    /**
     * @var string|null 備考
     */
    private ?string $comment = null;

    /**
     * @return int
     */
    public function getId(): int
    {
        return $this->id;
    }

    /**
     * @param int $id
     */
    public function setId(int $id): void
    {
        $this->id = $id;
    }

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName(string $name): void
    {
        $this->name = $name;
    }

    /**
     * @return string
     */
    public function getAddress(): string
    {
        return $this->address;
    }

    /**
     * @param string $address
     */
    public function setAddress(string $address): void
    {
        $this->address = $address;
    }

    /**
     * @return int
     */
    public function getTel(): int
    {
        return $this->tel;
    }

    /**
     * @param int $tel
     */
    public function setTel(int $tel): void
    {
        $this->tel = $tel;
    }

    /**
     * @return string|null
     */
    public function getComment(): ?string
    {
        return $this->comment;
    }

    /**
     * @param string|null $comment
     */
    public function setComment(?string $comment): void
    {
        $this->comment = $comment;
    }

}
?>

本当にシンプルな内容ですね。DTOにはプロパティとgetter/setterしか書きません。
このようなデザインパターンは他にもいくつも存在しています。もう一つ紹介しましょう。

2.Template Methodパターン

今回もう一つ紹介するのはTemplate Methodパターンです。まず、こちらはどういった場合に使用するのかを説明いたします。

下の図のようなクラスがあるとします。

f:id:styleedge_tech:20200219131502j:plain
学生クラス図

学生A、学生B、学生Cの各クラスは以下の順にメソッドを呼んでいきます。

1.朝起きて学校へ行くメソッド
2.学校で授業を受けるメソッド
3.放課後を過ごすメソッド

当然学生により、各々の行動は違います。
例えば学生Aさんは自転車で学校に通いますが、学生Bさんは徒歩、学生Cさんは電車です。
しかし、3人の学生さんは1~3のメソッドを順番に呼んでいく流れは共通です。

このような共通の流れをまとめたい場合にTemplate Methodパターンを使用します。

Template Methodパターンの場合、親クラスで基本的な処理の流れを実装します。
処理の流れで呼ばれる1~3のメソッドを抽象化として宣言します。
親クラスで宣言した抽象メソッドの具体的な処理は学生Aさん、学生Bさん、学生Cさんで実装していきます。

では実際のコードを見ていきましょう。親クラスは以下の通りです。

<?php


namespace App\Http\Controllers;


abstract class StudentController extends Controller
{
    //朝起きて学校へいく
    abstract public function goToSchool();

    //学校で授業を受ける
    abstract public function Study();

    //放課後を過ごす
    abstract public function SpendAfterSchool();

}


続いて子クラス(学生Aさん)です。

<?php


namespace App\Http\Controllers;


class StudentAController extends StudentController
{
    //朝起きて学校へいく
    public function goToSchool()
    {
        return '電車で通学';
    }

    //学校で授業を受ける
    public function Study()
    {
        return '数学・日本史・英語・物理・国語';
    }

    //放課後を過ごす
    public function SpendAfterSchool()
    {
        return '部活動:野球';
    }

    public function index()
    {
        echo $this->goToSchool()."<br />";
        echo $this->Study()."<br />";
        echo $this->SpendAfterSchool();
    }
}

子クラスは親クラスを継承して使います。結果は以下のようになります。

f:id:styleedge_tech:20200219123732j:plain
結果

Template Methodパターンはフレームワークでもよく使われています。
DTOやTemplate Methodのようなデザインパターンを使うメリットはなんでしょうか。
よく言われているのが

1.開発者の共通言語となる
2.コードが読みやすくなる、拡張性が高くなる、メンテナンス性が向上する
3.再利用しやすい

あたりです。多くの人が開発に参加する、人の出入りがある大きいプロジェクトに向いていると思います。

逆にデメリットとしては
1.デザインパターンを知らない場合、共通言語とならない
2.学習コストがかかる。知っているとしても、使ったことがない場合は実際の開発時に時間がかかる

簡単なシステムを作る場合はそこまでデザインパターンにこだわる必要はないかと思います。

デザインパターンは他にもありますので、今後自分でも勉強していきたいです。

最後に

スタイル・エッジLABOでは、一緒に働く仲間を募集しています。 もし興味を持っていただけましたら、ぜひ採用サイトものぞいてみてください!

recruit.styleedge-labo.co.jp