2011-08-29 12 views
38

डीएओ कक्षा को डिजाइन करने का सबसे अच्छा तरीका क्या होना चाहिए?डीएओ कक्षा कैसे डिजाइन करें?

कार्य # 1: एक वस्तु के रूप मेंडिजाइन डीएओ वर्ग।

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:स्थिर तरीकों के साथ डिजाइन डीएओ वर्ग (उर्फ स्थिर वर्ग)

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); 
    } 
} 

# 1 दृष्टिकोण में, मैं में डीएओ वर्ग की एक वस्तु बनाने के लिए सभी ग्राहक कोड (अन्य विकल्प सभी के आसपास डीएओ के संदर्भ को पारित करना है)। जबकि दृष्टिकोण # 2 में, मुझे ऑब्जेक्ट बनाने की आवश्यकता नहीं है और स्थैतिक विधियों को बिना किसी राज्य ट्रैकिंग के डिज़ाइन किया जा सकता है।

तो डीएओ कक्षाओं के डिजाइन में कौन सा दृष्टिकोण सबसे अच्छा है?

+4

उपयोग दृष्टिकोण # 1 और के लिए संदर्भ इंजेक्षन यह स्प्रिंग –

+3

जैसे आईओसी कंटेनर का उपयोग कर रहा है यह अजीब बात है कि किसी ने भी [बालससी] (http://stackoverflow.com/users/157882/balusc) द्वारा इस तरह के एक अच्छा और सूचनात्मक ट्यूटोरियल का उल्लेख नहीं किया है: [डीएओ ट्यूटोरियल - डेटा एक परत] (http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html)। इसे पढ़ें और आपको कई डीएओ डिज़ाइन और कार्यान्वयन संबंधी प्रश्नों के उत्तर मिलेंगे। – informatik01

उत्तर

37

मैं दृष्टिकोण # 1 की सिफारिश करता हूं, लेकिन सीधे डीएओ को तुरंत चालू करने के बजाय वसंतता निर्भरता इंजेक्शन के लिए उपयोग करता हूं।

इस तरह, क्लाइंट कोड की इकाई परीक्षण के लिए, आप नकली डीएओ को प्रतिस्थापित कर सकते हैं और सत्यापित कर सकते हैं कि उचित डीएओ उचित तर्कों के साथ आवेदक हैं। (मॉकिटो यहां उपयोगी है।)

यदि आप स्थैतिक तरीकों का उपयोग करते हैं, तो यूनिट परीक्षण अधिक कठिन होता है, क्योंकि स्थैतिक विधियों को ओवरराइड नहीं किया जा सकता है।

+5

+1 मैं खुद को यह जवाब लिखने के लिए बहुत आलसी था। लेकिन यह इस के लिए काफी समान होता :-) –

+0

क्या होगा यदि डीएओ ऑब्जेक्ट से ग्राहक (उपयोगकर्ता) में से एक मौजूदा लॉग-इन ग्राहक (उपयोगकर्ता) का प्रतिनिधित्व कर रहा हो। क्या आप getCurrentCustomer() जैसी विधि प्रदान करेंगे या यह डीएओ कक्षा के लिए पारदर्शी होगा और यह उपयोगकर्ता हमेशा आईडी द्वारा प्राप्त किया जाएगा? – Piotr

+1

@Piotr मुझे लगता है कि डीएओ को इस बात से चिंतित नहीं होना चाहिए जिसके अनुरोध का उद्भव हुआ था। –

6

मैं विकल्प 1 के लिए भी जाऊंगा लेकिन मैं आपको इंटरफेस के लिए प्रोग्राम करने की भी सिफारिश करता हूं। एक इंटरफ़ेस बनाएं जो सेट करता है जो डीएओ को प्रदान करता है और फिर आप अपनी आवश्यकताओं के आधार पर विभिन्न वर्गों के साथ उन लोगों को लागू कर सकते हैं।

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 का उपयोग करते हैं तो निर्भरता इंजेक्शन का उपयोग करें! Don't repeat the DAO!

आप अपने प्रौद्योगिकी ढेर के लिए सामान्य डीएओ कार्यान्वयन के उदाहरण मिल सकते हैं (बस गूगल "डीएओ my_technology दोहराना नहीं"):

5

कैसे एक सामान्य डीएओ (स्प्रिंग AOP का प्रयोग करके) लिखने के लिए आलेख देखें ।

+0

संदर्भ के लिए धन्यवाद। – nibin012

0

मैं स्तरित दृष्टिकोण पसंद करते हैं, और क्या यह दृष्टिकोण बस हमें बताओ है:

  1. आप अपने मॉडल वर्ग ग्राहक
  2. आप इंटरफ़ेस CustomerDAO

    के माध्यम से ग्राहक के साथ एक अनुबंध कर रहे हैं कर रहे हैं
    public interface CustomerDAO{ 
    
        public void saveCustomer(Customer customer); 
        public Customer getCustomer(int id); 
    } 
    
  3. आप CustomerDAOImpl

    तरह +०१२३७८०७१०८ एक ठोस कार्यान्वयन कर रहे हैं

फिर इन प्रबंधित करने के लिए एक प्रबंधक लिखें या जैसे कुछ अन्य DAOs encapsulating:

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

'सार्वजनिक शून्य बचत ग्राहक (ग्राहक ग्राहक) {saveCustomer (ग्राहक); } 'एलओएल + आपके पास 'पब्लिक ग्राहक 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 

} 

तो

और डीएओ किसी अन्य डोमेन

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(); 
संबंधित मुद्दे