दिलचस्प पोस्ट
stream_socket_client कनेक्ट करने में असमर्थ (कनेक्शन का समय समाप्त) सी में सरणियों की गतिशील आवंटित सरणी आईफ़ोन: अंतिम स्क्रीन स्पर्श के बाद उपयोगकर्ता निष्क्रियता / निष्क्रिय समय का पता लगा रहा है rpy2 विंडोज 7 पर स्थापित करें MongoDB संग्रहीत प्रक्रिया समतुल्य कर्तव्यों या अपवादों का उपयोग कर अनुबंध द्वारा डिजाइन? MySQL पूर्णांक फ़ील्ड को PHP में स्ट्रिंग के रूप में लौटाया गया है सादा पाठ के रूप में HTML टैग कैसे प्रदर्शित करें एल 1 कैश में Haswell पर चोटी बैंडविड्थ प्राप्त करना: केवल 62% प्राप्त करना "अनअसाइन किए गए स्थानीय चर का उपयोग" क्या मतलब है? कोणीय UI- राउटर $ urlRouterProvider। जब मैं कार्य नहीं करता <a ui-sref="…"> क्लिक करता हूँ स्ट्रिंग को पूर्णांक में कनवर्ट करने के लिए sscanf या atoi में क्या अंतर है? एंड्रॉइड: कोई पूर्ण पाठ दर्ज नहीं होने पर स्वत: पूर्ण पाठक सुझाव दिखाएं मेरी कस्टम छवि के साथ फेसबुक लॉगइन बटन को कैसे बदला जाए शेल में एक वेरिएबल में एक फ़ाइल कैसे पढ़ सकती है?

जावा इंटरफेस / कार्यान्वयन नामकरण सम्मेलन

आपके द्वारा बनाए गए विभिन्न वर्गों / इंटरफेसों को आप कैसे नाम देते हैं? कभी-कभी मेरे कार्यान्वयन के नाम को जोड़ने के लिए कार्यान्वयन की जानकारी नहीं है – जैसे इंटरफ़ेस FileHandler और क्लास SqlFileHandler

जब ऐसा होता है तो मैं आमतौर पर "सामान्य" नाम में इंटरफ़ेस का नाम देता हूं, जैसे कि Truck और वास्तविक श्रेणी Truck क्लास का नाम TruckClass

इस संबंध में आप इंटरफेस और कक्षाओं का नाम कैसे देते हैं?

Solutions Collecting From Web of "जावा इंटरफेस / कार्यान्वयन नामकरण सम्मेलन"

अपने Interface नाम दें Truck ITruck नहीं क्योंकि यह एक ITruck नहीं है, यह एक Truck

जावा में एक Interface एक प्रकार है । तब आपके पास DumpTruck , TransferTruck , WreckerTruck , CementTruck , आदि हैं जो implement Truck

जब आप एक उप-वर्ग के स्थान पर Interface का उपयोग कर रहे हैं तो आप उसे Truck पर TruckList<Truck> रूप में I सामने लाना बस गंदे हंगरी शैली संकेतन तुलनशास्त्र है जो आपके कोड में टाइप करने के लिए और अधिक कुछ भी नहीं जोड़ता है।

सभी आधुनिक जावा आईडीई के निशान इंटरफेस और कार्यान्वयन और जो इस मूर्खतापूर्ण संकेत के बिना नहीं। इसे TruckClassTruckClass जो कि TruckClass रूप में खराब है जैसे कि IInterface तालुका।

अगर यह कार्यान्वयन है तो यह एक क्लास है। इस नियम में केवल एकमात्र अपवाद है, और अपवाद हमेशा अपवाद होते हैं, AbstractTruck । चूंकि केवल उप-वर्ग कभी इसे देख पाएंगे और आपको एक Abstract कक्षा में कभी नहीं डालना चाहिए, यह कुछ जानकारी जोड़ता है कि वर्ग सारभूत है और इसका उपयोग कैसे किया जाना चाहिए। आप अभी भी BaseTruck से बेहतर नाम प्राप्त कर सकते हैं और इसके बजाय BaseTruck उपयोग कर BaseTruck हैं। परन्तु जब से Abstract वर्ग किसी भी सार्वजनिक सामना करना पड़ता इंटरफ़ेस का हिस्सा नहीं हो, यह नियम के लिए स्वीकार्य अपवाद है। कंसल्टेंट्स protected करना इस विभाजन को पार करने का एक लंबा रास्ता तय करता है।

और Impl प्रत्यय सिर्फ उतना ही शोर है अधिक तालुनी जो कुछ भी एक इंटरफ़ेस नहीं है वह कार्यान्वयन है, यहां तक ​​कि समस्त कक्षाएं जो आंशिक कार्यान्वयन हैं। क्या आप हर क्लास के हर नाम पर उस मूर्ख Impl प्रत्यय को डालने जा रहे हैं?

Interface एक ऐसा अनुबंध है जो सार्वजनिक विधियों और गुणों का समर्थन करता है, यह भी प्रकार की जानकारी भी है। सब कुछ जो Truck लागू करता है Truck का एक प्रकार है।

जावा मानक लाइब्रेरी को स्वयं देखें क्या आप IList , ArrayListImpl IList , ArrayListImpl IList देखते हैं? नहीं, आप List और ArrayList List देखते हैं, और LinkedList । यहां इस सटीक प्रश्न के बारे में एक अच्छा लेख है । इन मूर्खतापूर्ण उपसर्ग / प्रत्यय नामकरण सम्मेलनों में से कोई भी सभी DRY सिद्धांत का उल्लंघन भी करता है

इसके अलावा, यदि आप अपने आप को DTO , JDO , BEAN या वस्तुओं के अन्य मौन दोहराए जाने वाले प्रत्यय जोड़ते हैं, तो शायद वे सभी प्रत्ययों के बजाय पैकेज में हैं। उचित तौर पर पैक किए गए नामस्थान स्वयं को दस्तावेज़ीकृत कर रहे हैं और वास्तव में खराब स्वामित्व वाली नामकरण योजनाओं में सभी बेकार निरर्थक जानकारी को कम करते हैं, जो अधिकांश स्थानों में आंतरिक रूप से एक सुसंगत तरीके से पालन नहीं करते हैं।

यदि आप सभी को अपने Class नाम अनूठा बनाने के लिए आ सकते हैं, तो Impl साथ यह Impl , फिर आपको एक Interface पर फिर से सोचने की जरूरत है। इसलिए जब आपके पास ऐसी स्थिति होती है जहां आपके पास एक Interface और एकल Implementation होता है जो Interface से विशिष्ट नहीं है, तो संभवत: Interface आवश्यकता नहीं है

मैंने जवाब यहां देखा है कि यह सुझाव देता है कि यदि आपके पास केवल एक कार्यान्वयन है तो आपको इंटरफ़ेस की आवश्यकता नहीं है। यह निरोधक इंजेक्शन / नियंत्रण सिद्धांत के उलटापन के चेहरे पर मक्खियों (हमें बुलाओ, हम आपको बुलाओ!)।

तो हाँ, ऐसे परिस्थितियां हैं जिनमें आप अपने कोड को सरल बनाना चाहते हैं और इंजेक्ट किए गए इंटरफ़ेस लागूकरण (जो भी प्रॉक्सी हो सकता है – आपका कोड नहीं जानता है!) पर निर्भर करते हुए इसे आसानी से परीक्षण योग्य बनाते हैं। यहां तक ​​कि अगर आपके पास केवल दो कार्यान्वयन हैं – एक परीक्षण के लिए एक नक़ाब, और एक जो वास्तविक उत्पादन कोड में इंजेक्ट हो जाता है – यह एक इंटरफ़ेस ज़रूरत से ज़्यादा ज़रूरत नहीं बना रहा है एक अच्छी तरह से प्रलेखित इंटरफ़ेस एक अनुबंध स्थापित करता है, जिसे परीक्षण के लिए सख्त नकली कार्यान्वयन द्वारा भी रखा जा सकता है।

वास्तव में, आप ऐसे परीक्षणों की स्थापना कर सकते हैं जो मोज़े में सबसे सख्त इंटरफ़ेस अनुबंध लागू करते हैं (तर्क के लिए अपवाद फेंकना, नल नहीं होना चाहिए आदि) और परीक्षण में त्रुटियों को पकड़ना, उत्पादन कोड में अधिक कुशल कार्यान्वयन का उपयोग करना नकली होने के लिए रिक्त नहीं होने के कारण नकली ने अपने परीक्षणों में अपवाद फेंक दिया और आप जानते हैं कि उदाहरण के लिए, इन परीक्षणों के बाद कोड को फिक्स करने के बावजूद बहस नहीं हैं।

निर्भरता इंजेक्शन / आईओसी एक नवागंतुक के लिए समझना कठिन हो सकता है, लेकिन एक बार जब आप इसकी क्षमता को समझते हैं, तो आप इसे पूरे स्थान पर उपयोग करना चाहेंगे और आपको हर वक्त इंटरफ़ेस बनाना होगा – भले ही केवल एक ही हो ( वास्तविक उत्पादन) कार्यान्वयन

इस एक कार्यान्वयन के लिए (आप अनुमान लगा सकते हैं, और आप सही होंगे, मुझे विश्वास है कि परीक्षण के लिए मॉक को मॉक (इंटरफ़ेसनाम) कहा जाना चाहिए), मैं नाम डिफ़ॉल्ट (इंटरफ़ेसनाम) को पसंद करता हूं। यदि एक अधिक विशिष्ट कार्यान्वयन के साथ आता है, तो इसे उचित नाम दिया जा सकता है यह इम्प्ल प्रत्यय को भी टालता है जिसे मैं विशेष रूप से नापसंद करता हूं (यदि यह एक अमूर्त वर्ग नहीं है, तो यह एक "निहितार्थ" है!)।

मैं "सार (इंटरफेसनाम)" के विरोध में "बेस (इंटरफ़ेस-नाम)" पसंद करता हूं, क्योंकि कुछ ऐसी परिस्थितियां हैं जिसमें आप चाहते हैं कि आपका बेस क्लास बाद में तत्काल बन जाए, लेकिन अब आप "सार (इंटरफ़ेस-नाम)" नाम से अटक जाते हैं। , और यह आपको वर्ग का नाम बदलने के लिए मजबूर करता है, संभवत: थोड़ा मामूली भ्रम पैदा करता है – लेकिन अगर यह हमेशा बेस (इंटरफ़ेसनाम) होता, तो अमूर्त संशोधक को हटाने से वह वर्ग नहीं बदलता है जो वर्ग था।

इंटरफ़ेस का प्रतिनिधित्व करने वाले इंटरफ़ेस का संक्षिप्त विवरण अवधारणा का नाम होना चाहिए। किसी भी कार्यान्वयन वर्ग में कुछ खास विशिष्ट लक्षण होना चाहिए जो इसे अधिक विशिष्ट नाम देने के लिए उपयोग किया जा सकता है।

यदि केवल एक कार्यान्वयन वर्ग है और आप किसी भी चीज के बारे में सोच नहीं सकते हैं जो इसे विशिष्ट बनाता है (इसका नाम -Impl करना चाहते हैं), तो ऐसा लगता है कि अंतरफलक के लिए कोई औचित्य नहीं है।

मैं जावा कोर / सूर्य द्वारा स्थापित छद्म-सम्मेलनों का पालन करते हैं, जैसे संग्रह वर्गों में:

  • List – "वैचारिक" ऑब्जेक्ट के लिए इंटरफ़ेस
  • ArrayList – इंटरफ़ेस का ठोस कार्यान्वयन
  • LinkedList – अंतरफलक के ठोस कार्यान्वयन
  • AbstractList – कस्टम कार्यान्वयन में सहायता करने के लिए सार "आंशिक" कार्यान्वयन

मैं AWT ईवेंट / श्रोता / एडाप्टर प्रतिमान के बाद मेरी ईवेंट कक्षाओं को मॉडलिंग करने के लिए एक ही काम करता था।

मानक सी # सम्मेलन, जो जावा में अच्छी तरह से काम करता है, सभी इंटरफेस को एक के साथ IFileHandler – इसलिए आपका फ़ाइल हैंडलर इंटरफ़ेस IFileHandler होगा और आपका ट्रक इंटरफेस ITruck होगा। यह संगत है, और वर्गों से इंटरफेस को बताना आसान बनाता है

मुझे इंटरफ़ेस नाम पसंद है, जो इंगित करते हैं कि अंतरफलक किस अनुबंध का वर्णन करता है, जैसे "तुलनात्मक" या "सीरियलिज़ेबल" "ट्रक" जैसे नायकों में वास्तव में ट्रकों का वर्णन नहीं होता – एक ट्रक की क्षमता क्या है?

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

कुछ लोगों को यह पसंद नहीं है, और जावा की तुलना में यह एक .NET सम्मेलन से अधिक है, लेकिन आप अपने इंटरफेस को पूंजी I उपसर्ग के साथ नाम दे सकते हैं, उदाहरण के लिए:

 IProductRepository - interface ProductRepository, SqlProductRepository, etc. - implementations 

इस नामकरण सम्मेलन का विरोध करने वाले लोग यह तर्क दे सकते हैं कि आप परवाह नहीं करनी चाहिए कि आप अपने कोड में एक इंटरफ़ेस या कोई ऑब्जेक्ट के साथ काम कर रहे हैं, लेकिन मुझे मक्खी को पढ़ना और समझना आसान लगता है।

मैं एक "कक्षा" प्रत्यय के साथ कार्यान्वयन वर्ग का नाम नहीं होगा इससे भ्रम हो सकता है, क्योंकि आप वास्तव में अपने कोड में "वर्ग" (यानी टाइप) ऑब्जेक्ट्स के साथ काम कर सकते हैं, लेकिन आपके मामले में, आप क्लास ऑब्जेक्ट के साथ काम नहीं कर रहे हैं, आप बस एक सादा-पुरानी ऑब्जेक्ट के साथ काम कर रहे हैं ।

Truck क्लास लगता है कि यह Truck की एक श्रेणी थी, मुझे लगता है कि Impl प्रत्यय को जोड़ने के लिए अनुशंसित समाधान है। मेरी राय में सबसे अच्छा समाधान कार्यान्वयन के नाम में कुछ सूचनाओं को शामिल करना है, उस विशेष कार्यान्वयन में क्या हो रहा है (जैसे कि हम List इंटरफ़ेस और कार्यान्वयन: ArrayList या LinkedList ) के साथ हैं, लेकिन कभी-कभी आपके पास केवल एक कार्यान्वयन है और इंटरफ़ेस का कारण है दूरस्थ उपयोग (उदाहरण के लिए), तब (जैसा कि शुरुआत में उल्लिखित है) Impl समाधान है

मैं दोनों सम्मेलनों का उपयोग करता हूं:

अगर अंतरफलक एक विशिष्ट ज्ञात पैटर्न (उदाहरण के लिए सेवा, डीएओ) का एक विशिष्ट उदाहरण है, तो उसे "I" के बिना एक "I" (उदाहरण उपयोगकर्ता सेवा, ऑडिट सेवा, यूज़रडाओ) की आवश्यकता नहीं हो सकती है, क्योंकि पोस्ट-फिक्स मेटा पैटर्न को निर्धारित करता है

लेकिन, यदि आपके पास एक बंद या दो-ऑफ (आमतौर पर कॉलबैक पैटर्न के लिए) है, तो यह इसे किसी वर्ग से अलग करने में मदद करता है (जैसे IAsynchCallbackHandler, IUpdateListener, IComputeDrone) ये आंतरिक प्रयोजन के लिए डिज़ाइन किए गए विशेष प्रयोजन इंटरफेस हैं, कभी-कभी IiNterface इस तथ्य पर ध्यान केंद्रित करता है कि एक ऑपरेंड वास्तव में एक इंटरफ़ेस है, इसलिए पहली नज़र में यह तुरंत स्पष्ट होता है

अन्य मामलों में आप अन्य सामान्यतः ज्ञात कंक्रीट वर्गों (ISubject, IPrincipal बनाम विषय या प्रिंसिपल) के साथ टकराने से बचने के लिए I का उपयोग कर सकते हैं।