2010-01-31 16 views
8

यह निम्नलिखित तरीके से नाम DAOs को ठेठ है:स्प्रिंग-हाइबरनेट डीएओ नामकरण सम्मेलन?

UserDAO - interface 
UserDAOImpl - implements UserDAO 

मैं अगर अपने मानक लागू करने के लिए या यदि और अधिक सार्थक कुछ सबसे अच्छा अभ्यास है प्रत्यय 'Impl' का उपयोग करने सोच रहा हूँ। धन्यवाद।

उत्तर

7

कि आम तौर पर मैं क्या उपयोग है। कभी-कभी डिफ़ॉल्टDefaultUserDAO जैसे उपसर्ग अधिक समझ में आ सकता है यदि आप एक इंटरफ़ेस बना रहे हैं जिसे आप दूसरों को लागू करने की अपेक्षा करते हैं लेकिन आप संदर्भ कार्यान्वयन प्रदान कर रहे हैं।

अधिकांश समय मुझे लगता है कि उन दोनों को एक दूसरे के लिए इस्तेमाल किया जा सकता है लेकिन कुछ स्थितियों में से एक दूसरे की तुलना में थोड़ा अधिक स्पष्टता प्रदान करता है। इंटरफेस और FooDaoImpl इंटरफेस और FooDao कार्यान्वयन

पूर्व है के लिए के लिए कार्यान्वयन

  • IFooDao के लिए के लिए

    1. FooDao:

  • +0

    धन्यवाद! साथ ही, क्या यह मेरे डीएओ इंटरफेस को दाओ पैकेज में डालने और डाओ.hibernate पैकेज में कार्यान्वयन करने के लिए समझ में आता है (ताकि कार्यान्वयन बाद में बदला जा सके)? – oym

    +0

    यह समझ में आता है – Kevin

    4

    सबसे पहले - आपको अपने प्रत्येक वर्ग के लिए वास्तव में डीएओ कक्षा की आवश्यकता नहीं हो सकती है। Don't repeat the DAO! आलेख बताता है कि एक सामान्य डीएओ क्या है। बॉयलरप्लेट कोड का नाम कैसे लें, यह उत्पादक नहीं है।

    अब, आप एक सामान्य डीएओ हो तब आप के लिए जा सकते हैं:

    • DAO (इंटरफेस)
    • SessionDAO और EntityManagerDAO - या तो Session या EntityManager

    और, प्रयोग करने के लिए पाठ्यक्रम, केवल इंटरफेस द्वारा डीएओ का उपयोग करें। आप आसानी से कार्यान्वयन के बीच स्विच कर सकते हैं।

    (मैं वास्तव में यह लोवरकेस पसंद करते हैं - Dao है, हालांकि यह एक संक्षिप्त नाम है, और Impl प्रत्यय)

    8

    दो सम्मेलनों कि मैंने देखा है रहे हैं कॉर्बा में इसकी जड़ें; उत्तरार्द्ध एक माइक्रोसॉफ्ट COM/.NET सम्मेलन है। (सुधार के लिए पास्कल के लिए धन्यवाद।)

    "डीएओ दोहराएं मत" एक अच्छा विचार है। मैं व्यक्तिगत रूप से सोचता हूं कि लेख की तुलना में अधिक जटिल है। खोजकर्ताओं में प्रतिबिंब के बिना ऐसा करने का एक तरीका है जो मुझे पसंद है। यदि आप हाइबरनेट का उपयोग करते हैं, उदाहरण के लिए क्वेरी इसे करने का एक शानदार तरीका हो सकता है। इंटरफ़ेस अधिक इस प्रकार दिखाई देगा:

    package persistence; 
    
    import java.io.Serializable; 
    import java.util.List; 
    
    public interface GenericDao<T, K extends Serializable> 
    { 
        T find(K id); 
        List<T> find(); 
        List<T> find(T example); 
        List<T> find(String queryName, String [] paramNames, Object [] bindValues); 
    
        K save(T instance); 
        void update(T instance); 
        void delete(T instance); 
    } 
    
    +0

    नाइटपिक: उत्तरार्द्ध एक माइक्रोसॉफ्ट ** COM ** सम्मेलन है। –

    +0

    सुधार के लिए धन्यवाद, पास्कल। मैं माइक्रोसॉफ्ट की सभी चीजों के लिए देर से हूं, इसलिए मुझे हाल ही में सी # के माध्यम से इसके बारे में पता चला है। – duffymo

    +0

    कोई समस्या नहीं, और +1 बीटीडब्ल्यू –

    1

    मैं भी सामान्य सहायक वर्गों से कुछ समर्थन के साथ GenericDao और GenericDaoImpl -convention का प्रशंसक रहा हूँ, बचाने या हटाने के कुछ लगातार कक्षाओं के लिए अतिरिक्त कार्रवाई की आवश्यकता पड़ती चाहिए:

    public interface PersistListener<T> { 
        void onPersist(T item); 
    } 
    

    इसी तरह की संरचनाओं को हटाने के लिए भी उपयोग किया जा सकता है। यह विशेष रूप से उपयोगी होता है यदि आपको प्रत्येक गतिविधि को लिखने के लिए किसी प्रकार का इवेंट लॉग चाहिए और आप इसके लिए एओपी का उपयोग नहीं करना चाहते हैं।

    मेरे GenericDaoImpl कुछ इस तरह दिखेगा:

    public class GenericDaoImpl<T> extends HibernateTemplate { 
        public void setPersistListeners(List<PersistListener> listeners) { 
        this.persistListeners = new GenericInterfaceHandler(listeners, 
         PersistListener.class); 
        } 
    
        // hibernate updates the key to the object itself 
        public T save(T item) { 
        getSession().save(item); 
        List<PersistListener<T>> listeners = this.persistListeners.getAll(item); 
        for (PersistListener<T> listener : listeners) 
         listener.persist(item); 
        } 
    
        // ... 
    } 
    

    क्या ऊपर के उदाहरण में क्या करेंगे persistListener वर्ग एक पैरामीटर के रूप में दिया की है कि सामान्य वर्ग मिलान के साथ एक PersistListener मिल रहा है। ऐसा पाया जाता है, फिर उचित श्रोता (ओं) को कॉल किया जाता है। My GenericInterfaceHandler का उपयोग वर्तमान में दिए गए वर्ग के लिए केवल सबसे विशिष्ट हैंडलर या केवल हैंडलर को वापस करने के लिए किया जा सकता है।

    यदि आप रुचि रखते हैं, तो मैं जेनेरिकइंटरफेस हैंडलर कार्यान्वयन भी पोस्ट कर सकता हूं क्योंकि यह कई अवसरों पर काफी शक्तिशाली निर्माण है।

    संबंधित मुद्दे