18

Webで見つかった例( Spring&Hibernate(point ))について少し混乱しています4. Model & BO & DAO。Model、DAO、およびBOクラス(+ DAOおよびBOインターフェース)があります。私がはっきりと理解していないのは、DAOとBOがまったく同じ機能を共有している場合に、それらが異なるクラスに分離される理由です(唯一の違いは、BOにDAOセッターがあることです)。

著者は、そのパターンについてのみ説明しています。

プロジェクト構造の混乱を避けるために、レイヤーを明確に識別するのに役立ちます

しかし、それは私には過剰に設計されているようです(少なくともこの場合)。この例は非常に単純ですが、このクラスの分離は何に役立つでしょうか?誰かが例を提供できますか?

4

1 に答える 1

33

彼らがBOと呼んでいるのはビジネスサービスのようです。DAOの仕事は、データベースの挿入、更新、クエリなどの永続性関連のコードを含めることです。

サービスはトランザクションの境界を定め、ビジネスロジックを含み、通常は1つまたは複数のDAOを使用してこのロジックを実装します。一部のユースケースでは、サービスはDAOに委任するだけです。その他の場合は、1つまたは複数のDAOのいくつかのメソッドを呼び出します。

古典的な例は、送金サービスです。

public void transferMoney(Long sourceAccountId, Long targetAccountId, BigDecimal amount) {
    Account source = accountDAO.getById(sourceAccountId);
    Account target = accountDAO.getById(targetAccountId);
    if (source.getBalance().compareTo(amount) < 0) {
        throw new NotEnoughMoneyException();
    }
    source.decrementBalance(amount);
    target.incrementBalance(amount);
    auditDAO.insertTransaction(sourceAccountId, targetAccountId, amount);
    // other business logic
}
于 2013-02-17T17:19:47.050 に答える