2009-06-26 10 views
12

मुझे पता है कि यह एक व्यक्तिपरक प्रश्न है, लेकिन मैं हमेशा कोडिंग शैली में सर्वोत्तम प्रथाओं के बारे में उत्सुक हूं। ReSharper 4.5 मुझे कीवर्ड "आधार" के लिए एक चेतावनी दे रहा है कार्यान्वयन कक्षाएं, यानी आधार विधि कॉल करने से पहले,"आधार" खराब अभ्यास का उपयोग कर रहा है भले ही यह पठनीयता के लिए अच्छा हो सकता है?

base.DoCommonBaseBehaviorThing(); 

जब मैं सराहना करते हैं "कम बेहतर है" मानसिकता, मैं भी समय डिबगिंग का एक बहुत खर्च किया है/अत्यधिक जंजीर अनुप्रयोगों को बनाए रखना, और ऐसा लगता है कि यह जानने में मदद मिल सकती है कि सदस्य कॉल केवल मूल वस्तु के आधार पर है। निश्चित रूप से ReSharper के नियमों को बदलने के लिए काफी आसान है, लेकिन आप क्या सोचेंगे? आधार सदस्यों को कॉल करते समय "आधार" का उपयोग किया जाना चाहिए?

+12

सब अपने आधार हैं संबंधित हमें – JoelFan

+0

IMHO यह है कि भविष्य पाठकों (डेवलपर्स) लगता है अच्छा पठनीयता है पर निर्भर करता है। उनसे पूछें और फिर अपने प्रश्न का उत्तर दें "यह इस बात पर निर्भर करता है कि कोड कौन बनाएगा।" – LosManos

उत्तर

21

एकमात्र बार आपको base.MethodCall(); का उपयोग करना चाहिए, जब आपके पास बाल वर्ग में एक ही नाम की ओवरराइड विधि है, लेकिन आप वास्तव में माता-पिता में विधि को कॉल करना चाहते हैं।

अन्य सभी मामलों के लिए, बस MethodCall(); का उपयोग करें।

कीवर्ड this और base की तरह कोड अधिक पठनीय नहीं कर सकता हूँ और सभी मामलों जब तक वे आवश्यक हैं के लिए बचा जाना चाहिए - इस तरह के मामले मैं ऊपर वर्णित के रूप में।

+4

+1। बहुउद्देश्यीय बटन कहां है? –

+3

"कोड को और अधिक पठनीय न करें और इससे बचा जाना चाहिए" ... कम से कम व्यक्तिपरक टैग –

+0

@ मैथ्यू व्हिट, अच्छा बिंदु, क्या पठनीय है या नहीं, बहुत व्यक्तिगत है ... वास्तव में वे लोग हैं जो PERL का आग्रह करते हैं पठनीय है –

3

यह वास्तव में व्यक्तिगत वरीयता का मामला है। यदि आप "आधार" देखना पसंद करते हैं। अपने सदस्यों की शुरुआत में, आप आसानी से नियम बंद कर सकते हैं (विकल्प> निरीक्षण गंभीरता> कोड रिडंडेंसी> रिडंडेंट 'आधार पर जाएं।' क्वालीफायर)। गैर-व्यवहारिक स्थिर कोड विश्लेषण नियमों को अपनी पसंदीदा कोडिंग शैली को प्रभावित न करने दें। विचार करने के लिए

संपादित

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

+0

मैं यह नहीं कहूंगा कि यह कोडिंग शैली या व्यक्तिगत वरीयता है। आधार पर कॉल। SomMethod() कुछ विधि() को एक कॉल बनाम कुछ मामलों में एक ही प्रभाव दे सकता है लेकिन दो कॉल मौलिक रूप से अलग हो सकती हैं। – BlackWasp

+0

उस परिदृश्य में, आप सही हैं। मैं उन मामलों का जिक्र कर रहा था जहां स्थैतिक कोड विश्लेषण "बेस" ध्वजांकित करता है। अनावश्यक होने के नाते। आपके उदाहरण में, यह ध्वजांकित नहीं किया गया होगा। –

4

मुझे लगता है कि आम तौर पर आपको पिछले कार्यक्षमता को ओवरराइड करते समय केवल base का उपयोग करना चाहिए।

कुछ भाषाएं (सी # नहीं) इस कार्यक्षमता को इसके आधार वर्ग के नाम से स्पष्ट रूप से इस तरह कॉल करके भी प्रदान करती हैं: Foo.common() (निश्चित रूप से Bar में कहीं से भी कहा जाता है)।

यह एकाधिक-विरासत के मामले में श्रृंखला में ऊपर की ओर जाने या कई कार्यान्वयन से चुनने की अनुमति देगा।

भले ही, मुझे लगता है कि आधार केवल तभी उपयोग किया जाना चाहिए जब आपके माता-पिता की कार्यक्षमता को स्पष्ट रूप से कॉल करने की आवश्यकता हो क्योंकि आप इस वर्ग में उस कार्यक्षमता को ओवरराइड कर चुके हैं या नहीं।

6

ध्यान में रखना एक और महत्वपूर्ण बात यह है कि जब आपने वर्तमान में उस विधि को ओवरराइड नहीं किया है, इसका मतलब यह नहीं है कि आप भविष्य में कभी भी नहीं होंगे और अपनी सभी कॉल को बेस के साथ प्रीफ़ेस कर देंगे। आपको अपनी सभी कॉल के लिए खोज करने और प्रतिस्थापित करने के बिना नई कार्यक्षमता नहीं मिलेगी।

इसके साथ कॉल का प्रीफ़ेस करते समय। पठनीयता में कमी/वृद्धि के अलावा कुछ भी नहीं करेगा (उस स्थिति को अनदेखा करते हुए जहां दायरे में दो चर समान नाम हैं) आधार। उपसर्ग कई सामान्य परिदृश्यों में आपके द्वारा लिखे गए कोड की कार्यक्षमता को बदल देगा। तो मैं कभी आधार नहीं जोड़ूंगा।जब तक इसकी आवश्यकता है।

16

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

+2

मैं निम्नलिखित को जोड़ना चाहता हूं: बेस को अनावश्यक रूप से उपयोग करके, यदि आप बाद में अपनी कक्षा में विधि को ओवरराइड करते हैं, तो आपका कोड आधार विधि को कॉल करेगा, न कि जिस पर आपने अभी ओवरराइड किया है। –

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

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