回答:
行は少しぼやけている場合がありますが、次のように表示されます。
サービスクラス/インターフェイスは、クライアントがアプリケーションの一部の機能と対話する方法を提供します。これは一般に公開されており、ビジネス上の意味があります。たとえば、TicketingService
インターフェイスを使用するとbuyTicket
、sellTicket
などが可能になります。
ヘルパークラスはクライアントから隠される傾向があり、ビジネスドメインの意味を持たないボイラープレート作業を提供するために内部的に使用されます。たとえば、特定のデータストアに保存するために、日付をタイムスタンプに変換したいとします。この処理を実行DateConvertor
するconvertDateToTimestamp
メソッドで呼び出されるユーティリティクラスがある場合があります。
サービスは単純にDAOと密接に結合されているのではなく、永続性よりも幅広い用語/使用パターンです
ヘルパークラスは、その原則に従ってコーディングされている場合、SRPに違反しません。つまり、各メソッドは1つのことと1つのことをうまく行う必要があり、クラスは1つのタイプのユーティリティヘルプ(たとえば、日付変換)を実行し、それをうまく行う必要があります。
科学的な定義ではありませんが、私の一般的な考え方は、サービスクラスがアプリケーション内に何らかのコンテキストを持っているのに対して、ヘルパーはより一般的で、どのアプリを支援しているか気にしません。
私にとっては、エリック・エヴァンスの定義によると、service
これは次のようなものです。
一般に、適切に設計されたシステムでは、ほとんどのクラス(ドメインモデル内)は、モデル内の特定のエンティティまたはエンティティセットを処理するという点で、明確な責任または機能を持っています。
すなわち
特定のエンティティに属さない機能を使用している場合、適切な場所を見つけることは困難です。つまり、Account
ANDとの両方を含むプロセスをカプセル化するものですCustomer
。
だから、そこがaのservice
出番です。それは、ドメインモデルにあるが、本来は1つのエンティティ/コンポーネントに属していないコードを置く場所です。
私helper
は一種の戦略クラスと考えています。私にとっては、さまざまなクラスで再利用する必要があるが、それを使用するクラスの階層内の抽象メソッドとしてはあまり適切ではないコードを置く場所です。個人的には、この用語helper
は少し曖昧であると思いますが、私のモデルには実際にはありません。それらは私が使用するライブラリに存在しますが。
サービスクラス:ビジネスロジックが含まれます。
ヘルパークラス:このクラスは、再利用可能なコンポーネントの一種です。
2つの無関係なプリンシパルを混同しました。サービスとヘルパークラスは接続されていません。特に「サービスクラス」という用語は誤解を招きやすい-クラスよりも抽象化のレベルが高い「サービス」を指していると思います。サービスの特徴は
「1つ以上の機能へのアクセスを可能にするメカニズム。アクセスは規定のインターフェイスを使用して提供され、サービスの説明で指定された制約とポリシーに従って一貫して実行されます。」
この定義は、コンテキストに応じてわずかに変わります。ただし、重要な点は、「サービス」という用語が抽象レベル、つまりアーキテクチャとドメインの知識のレベルにあるということです。「ヘルパークラス」は、一般的な操作をカプセル化するクラスを参照するデザインパターンです(ブロブまたは神のクラスに進化する傾向があるため、アンチパターンです)(抽象化の下位レベルにあり、接続されていることに注意アプリケーション/ソリューションの知識)。ヘルパークラスを一切含まないソフトウェアはほとんど存在しないという事実を知っていますが、それでも悪い習慣です。
注意すべきことの1つは、DDDの「サービス」の複数の定義です。
アプリケーションサービス:これらはアプリケーション層に位置し、ドメインおよびデータ層と通信します。これらは外部システム/ UIがDDDシステムと対話するためのインターフェースです。
ドメインサービス:これはドメインまたはアプリケーション層で使用でき、特定の1つのエンティティにうまく収まらないビジネスロジックを含みます。
インフラストラクチャサービス:これらは、外部リソースと通信するためにドメインによって使用されます。
ヘルパークラスには、複数のエンティティで再利用されるコードまたはアルゴリズムの一部が含まれる傾向があるため、DRYの原則に違反しない限り、エンティティに実際に入ることはできません。おそらく、ドメインサービスに最も近いのは、同じ目的(エンティティからのビジネスロジックの外部化)を実行するという点で、ソートは異なる理由のためです。