-
Notifications
You must be signed in to change notification settings - Fork 1
ja Entity helpers
USAMI Kenta edited this page May 5, 2017
·
1 revision
あなたに手続きを…
Entity
の構築とシリアライズのために汎用的に利用される処理を集めたファイル。
この手の共通処理を書く場所として、まあだいたい以下のようなパターンがある。(ざっと挙げただけで全然網羅的ではないです)
-
a)
abstract
クラスの実装として持たせて、全クラスに継承させる -
b) 実装を
trait
に分割して、利用する全クラスにuse
させる - c) ユーティリティクラスの静的メソッドとして実装する
- d) 完全に独立したクラスのインスタンスメソッドとして実装する
- e) 函数として実装する
で、今回は e にしてみました。それぞれのメリットデメリットはいろいろあるけど、 a, b はあまりやりたくなかった。
とは言っても名前空間入りの函数で、ほかのEntityクラスと同じBaguette\Mastodon\Entity
名前空間に置かれてるので、ユーザーはあまり意識しなくても名前空間修飾なしで呼べることになるので、ちょっとべんり。
この名前空間にある二つの函数は、対になってるように見えても、実は実装上の共通点は全然ない。
この函数は以下のように利用する
<?php
use Baguette\Mastodon\Entity as e;
$array = [
'name' => 'たっどさんあぷり',
'website' => 'https://github.com/BaguettePHP/mastodon-api'
];
/** @var e\Application */
$obj = e\map(e\Application::class, $array);
これは以下のコードと同じ意味だ。
$obj = new e\Application($array);
あれ、短くなった… (わざわざmap
しない方が)
<?php
use Baguette\Mastodon\Entity as e;
$array = [
[
'name' => 'たっどさんあぷり 1',
'website' => 'https://github.com/BaguettePHP/mastodon-api',
],
[
'name' => 'たっどさんあぷり 2',
'website' => 'https://github.com/BaguettePHP/mastodon-api',
],
[
'name' => 'たっどさんあぷり 3',
'website' => 'https://github.com/BaguettePHP/mastodon-api',
],
];
/** @var e\Application[] */
$obj = e\map([e\Application::class], $array);
これは、以下のようになるかな。
/** @var e\Application[] */
$obj = [];
foreach ($array as $a) {
$obj[] = new e\Application($array);
}
こんどはmap
を使った方が文の数が減らせましたね。
特に語るところがない気が… \Teto\Object\Helper::toArray()
に横流ししてるだけです。
ちなみになんですけど、\Teto\Object\Helper::toArray()
の方は、先述の例だと c に相当するユーティリティクラスが選択されてますね。