1.DTOについて
はじめにDTOについてご紹介します。DTOとは「Data Transfer Object」の略で、デザインパターンの一種です。
デザインパターンとは主にJavaなどのオブジェクト指向言語で使われる設計パターンの事ですね。
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パターンです。まず、こちらはどういった場合に使用するのかを説明いたします。
下の図のようなクラスがあるとします。
学生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(); } }
子クラスは親クラスを継承して使います。結果は以下のようになります。
Template Methodパターンはフレームワークでもよく使われています。
DTOやTemplate Methodのようなデザインパターンを使うメリットはなんでしょうか。
よく言われているのが
1.開発者の共通言語となる
2.コードが読みやすくなる、拡張性が高くなる、メンテナンス性が向上する
3.再利用しやすい
あたりです。多くの人が開発に参加する、人の出入りがある大きいプロジェクトに向いていると思います。
逆にデメリットとしては
1.デザインパターンを知らない場合、共通言語とならない
2.学習コストがかかる。知っているとしても、使ったことがない場合は実際の開発時に時間がかかる
簡単なシステムを作る場合はそこまでデザインパターンにこだわる必要はないかと思います。
デザインパターンは他にもありますので、今後自分でも勉強していきたいです。
最後に
スタイル・エッジLABOでは、一緒に働く仲間を募集しています。 もし興味を持っていただけましたら、ぜひ採用サイトものぞいてみてください!