2011-08-29 9 views
38

DAOクラスを設計する最良の方法は何ですか?DAOクラスの設計方法は?

アプローチ#1:デザインDAOクラスオブジェクトとして。

class Customer { 
//customer class 
} 

class CustomerDAO { 
    public void saveCustomer(Customer customer) { 
    //code 
    } 

    public Customer getCustomer(int id) { 
    //code 
    } 
} 

//Client code 
class client { 
    public static void main(String[] args) { 

    CustomerDAO customerDAO = new CustomerDAO(); 
    Customer customer = new Customer(); 
    customerDAO.saveCustomer(customer); 
    } 
} 

アプローチ#2:アプローチ#1の静的メソッド(別名静的クラス)とデザインDAOクラス

class Customer { 
//customer class 
} 

class CustomerDAO { 
    public static void saveCustomer(Customer customer) { 
    //code 
    } 

    public static Customer getCustomer(int id) { 
    //code 
    } 
} 

//Client code 
class client { 
    public static void main(String[] args) { 

    Customer customer = new Customer(); 
    CustomerDAO.saveCustomer(customer); 
    } 
} 

、Iは、でDAOクラスのオブジェクトを作成する必要がありますすべてのクライアントコード(他のオプションはDAOの参照をすべて渡すことです)。アプローチ#2ではオブジェクトを作成する必要はなく、ステートトラッキングなしでスタティックメソッドを設計できます。

どのアプローチがDAOクラスの設計において最高ですか?

+4

使用アプローチ#1をとへの参照を注入しますそれは春のようなIOCコンテナを使用して –

+3

それは奇妙な誰も[BalusC](そのような有益な有益なチュートリアルを参照してください誰かが言った:http://stackoverflow.com/users/157882/balusc):[DAOチュートリアル - dat層](http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html)を参照してください。それを読むと、多くのDAOの設計と実装に関連する質問に対する回答が見つかります。 – informatik01

答えて

37

私はアプローチ#1を推奨しますが、DAOを直接インスタンス化するのではなく、依存性注入にSpringを使用します。

このようにして、クライアントコードを単体テストするには、疑似DAOの代わりに適切な引数を指定して正しいDAOを呼び出すことができます。

静的メソッドを使用する場合は、静的メソッドをオーバーライドできないため、単体テストははるかに難しくなります。

+5

+1私はこの答えを自分で書くのは面倒です。しかしそれはこれとかなり同じです:-) –

+0

DAOオブジェクトの顧客(ユーザ)の1人が現在ログインしている顧客(ユーザ)を表している場合はどうなりますか?あなたはgetCurrentCustomer()のようなメソッドを提供するか、それともDAOクラスに対して透過的で、このユーザーは常にIDによって取得されますか? – Piotr

+1

@Piotr私は、DAOは要求が誰から由来したものであってはならないと思うでしょう。 –

6

私はオプション1にも行くつもりですが、私はまた、インターフェイスをプログラミングすることをお勧めします。 DAOが提供しなければならない関数を設定し、必要に応じて異なるクラスの関数を実装できるインターフェイスを作成します。

public interface CustomerDao { 
    public void saveCustomer(Customer customer); 

    public Customer getCustomer(int id); 
} 

次に、class SimpleCustomerDao implements CustomerDAO {/*code here*/}に設定できます。

あなた main

(および他のどこでも、あなたがそれを必要とする)あなたが持っているでしょう:

//Note that you have an interface variable and a real class object 
CustomerDao customerDao = new SimpleCustomerDao(); 

あなたがこれを行うことのメリットを把握することができます!

SpringまたはGuiceを使用する場合は、依存性注入を使用してください。

5

(春AOPを使用して)一般的なDAOを作成する方法の記事を参照してください。 Don't repeat the DAO!

あなたの技術スタックのための一般的なDAOの実装の例を見つけることができます(単に「DAOのmy_technologyを繰り返してはいけない」グーグル) 。

+0

参考になりました。 – nibin012

0

私は、階層化アプローチを優先し、何このアプローチは、単に教えてことはあるでしょう:あなたはあなたがインターフェイスCustomerDAO

を介してクライアントとの契約を持っている
  • モデルクラスのカスタマー持っている

    1. public interface CustomerDAO{ 
      
          public void saveCustomer(Customer customer); 
          public Customer getCustomer(int id); 
      } 
      
    2. あなたはCustomerDAOImplのような具体的な実装を持っています

      public class CustomerDAOImpl extends CustomerDAO{ 
      
          public void saveCustomer(Customer customer){ 
           saveCustomer(customer); 
          } 
      
          public Customer getCustomer(int id){ 
           return fetchCustomer(id); 
          } 
      } 
      

    そして、これらを管理するマネージャを書くかのようないくつかの他のDAOのカプセル化する:

    public static void main(String... ar){ 
        Manager manager = new ManagerImpl(); 
        manager.saveCustomer(); 
        // or manager.doBillingOfCustomer(); // etc 
    } 
    
  • +0

    'public void saveCustomer(顧客顧客){saveCustomer(顧客); } 'LOL +あなたは' public Customer getCustomer(int id); 'と' customerDAOObj.fetchCustomer'のようなエラーがあります。あなたの書式は言うまでもありません...それらを修正します - それまで-1 –

    11

    public class ManagerImpl extends Manager{ 
        CustomerDAO customerDAOObj; 
    
        // maybe you need to collect 
        // all the customer related activities here in manger 
        // because Client must not bother about those things. 
    
        UserBillingDAO userBillingDAOObj; 
    
        public void saveCustomer(Customer customer){ 
         customerDAOObj.saveCustomer(customer); 
        } 
    
        public Customer getCustomer(int id){ 
         return customerDAOObj.fetchCustomer(id); 
        } 
    
        // Note this extra method which is defined in 
        //UserBillingDAO which I have not shown, but you are exposing 
        //this method to your Client or the Presentation layer. 
    
        public boolean doBillingOFCustomer(id) { 
         return userBillingDAOObj.doBilling(id); 
        } 
    } 
    

    は今プレゼンテーション層またはメインクラスは、このようなコードが含まれますより抽象化する:

    interface IDAO<T> { 
    
        public save(T t); 
        public T getById(int id); 
        //...etc 
    
    } 
    

    は、

    とDAO今、別のドメイン

    public UniversityDao implements IDAO<University>{ 
    
        public save(University u){ 
         //Code here 
         } 
        public University getById(int id){ 
         //Code here 
        } 
    } 
    

    プレゼンテーション層またはメインクラスには、このようなコードが含まれます。

    IDAO dao; 
    dao=new CustomerDao(); 
    //... 
    dao=new UniversityDao();