4

ドメイン モデルで動作するサービス レイヤーを備えたアプリケーションを開発しています。Employee現在の設計では、ドメイン オブジェクトをサービス レイヤーに渡しています (たとえば、 を呼び出すときにドメイン オブジェクトを返しますEmploymentService.getEmployee()が、オブジェクトに対して実行される操作はサービスを経由する必要がありEmploymentService.transferEmployee( int employeeId, int newLocationId)ます (例はでたらめです)。

これは私には少し間違っているように感じます。1つは、手続き型プログラミングのようです。2 つ目は、ドメイン オブジェクトにはEmployee.setLocationId、従業員を仮想的に異動させるために必要なさまざまなシステムを調整するための複雑な操作のすべてがサービス層にあるため、クライアントが呼び出すことができるセッターがあり、従業員を新しい場所に異動させることはもちろんありません。

セッターをクライアントから隠すことができれば、これについては気分が良くなりますが、異なるパッケージの ServiceLayer と DAO の両方がドメイン オブジェクトのセッターにアクセスできる必要があります。

この種のものは大丈夫ですか、それとももっと良い方法がありますか?(また、基礎となるドメイン モデルを備えたサービス レイヤーの実際の例を歓迎します!)

また、Anemic Domain Model アンチパターンを読んだことがありますが、その罠に陥っているとは思いませんが、完全にはわかりません!

4

3 に答える 3

3

まず、実際には必要のないEmployee.Transfer()を呼び出すクライアントの問題:サービスレイヤーからDTOのみを返すのが好きです。これらのDTOにはデータが含まれ、メソッドは含まれていません。これにより、クライアントがEmployee.Transfer()を呼び出す問題が解決されます。

次に、EmploymentService.transferEmployee()にすべてのコードがあるという問題。手続き型プログラミングのように見えるので、気分が悪いとあなたは言います。解決策は、サービスに配置するロジックとドメインオブジェクトに配置するロジックの適切な組み合わせを見つけることです。例えば:

ドメインオブジェクトは次のことを行います。

  • 削除されていないか確認してください
  • それがまだその場所にないかどうかを確認してください
  • etcetera

サービスレイヤーは次のことを行います。

  • 従業員をロード
  • Employee.Transferに電話する
  • 従業員にメールを送信する
  • ロケーションマネージャーにメールを送信する
  • etcetera

私はおそらくこのコードでLocationDomainオブジェクトを使用します:

public class Location
{
   public void AddEmployee(Employee emp)
   {
      if(!IsFull)
         Employees.Add(emp);
   }

   public void RemoveEmployee(Employee emp)
   {
      Employees.Remove(emp);
      If(Employees.Count < 100)
         IsFull = false;
   }
}
于 2012-04-08T12:18:44.110 に答える
2

EmploymentService.transferEmployee(int employeeId, int newLocationId)まず第一に、あなたの例はでっち上げだとおっしゃいましたが、それはちょっと奇妙だと言いたいです。通常、 を に転送しEmployeeますLocation。Java コードで ID を処理しなければならないことはめったにありません。ほとんどの ORM がそれを処理します。

あなたの質問については、を転送するためのロジックをそれ自体Employeeに入れます。そうすれば、適切な変更が行われずにEmployee誰かが電話をかける可能性はありません。Employee.setLocation(Location)これは、特定のオブジェクトからセッターを隠蔽しようとしてフープをジャンプするよりもはるかに優れています。

ウィキペディアのAnemic Domain Modelのページに記載されているように、このパターンは、ドメインの変換が個別のオブジェクトによって制御されるシステムを表しています。個人的には、 を転送することEmployeeは確かに変換であり、そのような変換のロジックはドメイン層にある可能性があり、そうあるべきだと思います。もちろん、これらの問題は常に多少の好みの問題であるため、別の考え方をすることもできます。

この問題に関するMartin Fowler の元の記事は、 Domain オブジェクトを自分自身で変換できるようにするための非常に良い議論であることがわかりました。

于 2012-04-07T00:16:54.270 に答える
1

クライアントからセッターを隠す一般的な方法の 1 つは、クライアントが必要とするすべてのゲッターをインターフェイスにカプセル化しIEmployee、サービス API をそのインターフェイスにコーディングすることです。このようにして、セッターはクライアントから隠されますが、それらを必要とするサービスと DAO のために存在します。

于 2012-04-06T21:51:20.653 に答える