2017-07-21 9 views
1

私は自分のスキルを向上させるためにjavaSEの小さなアプリケーションを開発しています。だから私はいくつかのメソッドregisterUser(ユーザーユーザー)、addAmount(長いaccountId)のようなビジネスサービス(BSさらに)があります。 BSはdaoを使用します。 BSがWSまたは他のインタフェース要素から呼び出されると仮定します。DAOを複数のテーブルに使用できますか?

public interface UserDao { 

    User getUserByUsername(String username); 

    void saveUser(User user); 
} 

public interface AccountDao { 

    void saveAccount(Account account); 

    Account getAccountByUserId(Long userId); 
} 

私のBSが

public class FastAccountServiceImpl implements FastAccountService{ 

private UserDao userDao; 
private AccountDao accountDao; 

public void registerUser(User user, Account account) throws Exception { 
    if (user.getUsername() == null || user.getUsername().isEmpty()) { 
     throw new Exception("all params are mandatory"); 
    } 
    if (userDao.getUserByUsername(user.getUsername()) != null) { 
     throw new Exception("This user exists"); 
    } 
    userDao.saveUser(user); 
    accountDao.saveAccount(account); 
} 

public void withdrawAmount(Double amount, Long userId) throws Exception { 
    if (amount == null || userId == null) { 
     throw new Exception("amount and userId are mandatory"); 
    } 
    Account account = accountDao.getAccountByUserId(userId); 
    if (account.getAmount() == null || account.getAmount().compareTo(amount) < 1) { 
     throw new Exception("Insufficient amount in account"); 
    }...... 

}} 

だから私の最初の質問は、私がヌルなどのためのparamsをチェックする必要がありますされ

次のようになります。私は、次のDAOを持っていますか? BS? 2番目の質問は、なぜ私たちはすべてのテーブルのためのDAOを分離する必要がありますか?すべてのテーブルに対して1つのDAOを作成できますか?だからBSにはただ1つのDAOだけがあります。このDAOは以下に示される:

public interface MagicDao { 

User getUserByUsername(String username); 

void saveUser(User user); 

void saveAccount(Account account); 

Account getAccountByUserId(Long userId); 

}

+0

これは、より良い質問かもしれ - あなたはExceptionを投げている場所でIllegalArgumentExceptionを使用することができところで

StackExchang'es [ソフトウェアエンジニアリング](https://softwareengineering.stackexchange.com)のサイトでは、ガイドラインに従うようにルールとヘルプセンターを必ず確認してください。 –

+0

@DanielBickler他のサイトを参照しているときは、[クロスポストが嫌になっている](https://meta.stackexchange.com/tags/cross-posting/info) – gnat

+0

@ignat that sense ..私はこの質問が、トピックや意見に基づいているので、クロス・ポスティングではないと考えました。それは間違っていた? –

答えて

5

はいを​​ビジネスサービスでヌルをチェックこれは階層化アーキテクチャで、BSでチェックすることが先に起こることから、ダオでそれらをチェックするよりも優れています。

「テーブルごとに1つのDAO」 - なぜなら、Dao氏は時間の経過とともにはるかに複雑になる習慣があるので、今は「アカウント」テーブルで2つの操作を行っていると、将来的には10回または20回の操作が可能であるため、1対1の密接なアプローチがより管理しやすくなり、テストも容易になります。

私は確かにMagicDaoを避けるでしょう。テーブル全体を操作するという仕事は、サービスの役割(またはFacadeのような他のパターン)であり、Daoではなく、少なくとも共通の規約ではありません。

さらに、現代の依存性注入フレームワークは、サービスに必要なすべてのDaosを宣言して使用することを簡単にします。ビジネスサービス(テーブルあたり1つ)に5つ以上のDaosを持つことに問題はありません - 私はそれが私が扱っているコードではかなり一般的です。そのより明確ともRuntimeException(あなたがthrowsでそれを宣言する必要はありません)

+0

JavaSEでもhibernateバリデーターを使用できます。https://www.javacodegeeks.com/2015/07/using-hibernate-bean-validator-in-java-se.html –

+0

@vikingsteve、ありがとうございます。テーブルを横切るサービスの名前は何ですか?なぜ私たちはダオが必要なのですか?それはいつ使うのですか? –

+0

'FastAccountServiceImpl'は、テーブルをまたがるサービスの完璧な例です。 Dao(データアクセスオブジェクト)を抽象レイヤーとして使用して、「データベースコード」と「サービスコード」を分離することで、サービスクラスの複雑さを軽減し、コードの再利用を促進します(他のサービスクラスでも同じDao )。 – vikingsteve

関連する問題