11

私は Service Layer を使用しており、これまで ServiceObject (ArrayAccess、Iterator、Countable を実装) を使用していましたが、それが良いアイデアかどうか疑問に思っています。

あなたはしますか:

ArticleService::createArticle($articleData, $userId);

また

ArticleService::createArticle(ServiceObject $data);

どこ$dataにある:

array(
  'title' => 'Lorem ipsum',
  'body'  => 'Dolor sid amet',
  'userId' => 55,
);

ServiceObject には、すべてのメソッドに共通の署名を提供するという利点がありますが、効率的に見えない場合があり、広く使用されておらず、興味を失います。

フィードバックはありますか?

4

6 に答える 6

2

ここでの最善のアプローチは、次のようなものを持つことだと思います

$article = new Article;
$article->title = "Lorem ipsum"
$article->body = "Dolor sit amet"
$article->creator = $userID
ArticleService::createArticle($article)

おそらく「createArticle」は、Article オブジェクトが既に作成されていることを考えると、もはや関数の最適な名前ではありません。ArticleService::publishArticle($article)あなたが何を作っているのかわかりませんが、おそらく次のようなものがあるでしょう。

Article必要なのは、データの構築 ( ) とその使用( )を分離することですArticleService

私が本当に言おうとしているのは、createArticle の引数をジェネリック配列または「ServiceObject」にしないでください。どちらも引数リストの役に立たない抽象化であり、関連するエンティティを実際に表すクラスにします。

于 2011-06-17T18:51:34.483 に答える
0

より良いアプローチは、オブジェクトを注入することだと思います。しかし、なぜServiceObjectがあるのでしょうか。createArticleメソッドがある場合、それに記事オブジェクトを渡すのは論理的ですよね?このように、検証プロセスを整理する方が簡単です。注釈で検証するフィールドにマークを付けるだけで済みます。

また、それはあなたが使用しているアプローチの問題です。サービスレイヤーでデータマッパーパターンを使用する場合は、明らかにオブジェクトを渡す必要があります。

オブジェクトを使用すると、オブジェクト間の通信の透過的で明確なインターフェイスが得られます。配列を使用すると、転送するデータの種類やフィールドの種類などが明確になりません。

于 2011-06-17T22:44:58.603 に答える
0

2 番目の方法の方がはるかに優れています。メソッドを間違った方法で呼び出す人に問題が発生することはありません。また、読みやすく、必要なものを確認するのもはるかに簡単です。開発者としての私にとって、型のオブジェクトを渡さなければならないことは明らかです。ServiceObjectその後、このクラスのドキュメント、例、またはインターフェイスを検索し始めます。しかし、最初の例では、createArticle両方のパラメーターがどのように処理されるかを理解するために のコードを読む必要があります。

2 番目のアプローチは、API や署名を長期にわたってクリーンに保つのにも役立ちます。内部で追加のデータが必要な場合はcreateArticle、それらを に渡すだけでServiceObject、署名を変更する必要はありません!

最初の例のもう少し良い署名は次のようになります。

ArticleService::createArticle(array $articleData, $userId);

この場合$articleData、配列でなければなりません。これにより、エラーが防止されます。PHP 関数のパラメーターでは、キャストに使用できるのは配列とクラス名のみです。

于 2011-06-11T00:51:34.250 に答える
0

複雑なシステムでのコード補完は非常に良いことであり、オブジェクトの種類を知っている場合は何らかの方法で検証できるため、自動検証も行われるため、私はオブジェクトに投票します。ただし、createSomething に複雑なロジックがない場合は、配列も適合する可能性があります。

于 2011-05-15T22:00:22.013 に答える