ओओपी सिद्धांत और विधि के नाम


22
class Boxer:

    def punch(self, punching_bag, strength):
        punching_bag.punch(strength)


class PunchingBag:

    def punch(self, strength):
        print "Punching bag punched with strength", strength

boxer = Boxer()
punching_bag = PunchingBag()

boxer.punch(punching_bag, 2)

कोई संदेह नहीं है कि punchएक बॉक्सर के मामले में एक अच्छा तरीका नाम है। लेकिन punchपंचिंग बैग की विधि के लिए भी नाम अच्छा है? दोनों ही मामलों में मेरा मतलब है एक कमांड के रूप में पंच (यानी पंच करते हैं)।

जवाबों:


23

अंगूठे का एक अच्छा नियम यह है कि विधि के नाम क्रिया या ऐसे होने चाहिए, जैसे कि आप उन्हें ( selfमानक पायथन सम्मेलन में, thisअधिकांश अन्य भाषाओं में) कहते हैं।

इस नियम से, file.closeगलत तरह का है, जब तक कि आप उस मानसिक मॉडल के साथ नहीं जाते हैं जो फ़ाइल स्वयं बंद हो जाती है, या यह कि fileऑब्जेक्ट फ़ाइल का प्रतिनिधित्व नहीं करता है, बल्कि फ़ाइल हैंडल या किसी प्रकार की प्रॉक्सी ऑब्जेक्ट को संभालता है।

एक पंचिंग बैग कभी भी खुद को घूंसा नहीं मारता है, इसलिए punchingBag.punch()यह गलत भी है। be_punched()तकनीकी रूप से सही है, लेकिन बदसूरत है। receive_punch()काम कर सकते हैं, या handle_punch()। एक अन्य दृष्टिकोण, जावास्क्रिप्ट में काफी लोकप्रिय है, इस तरह के तरीके कॉल को घटनाओं के रूप में माना जाता है, और वहां होने वाले अधिवेशन को इवेंट नाम के साथ जाना है, जो कि 'ऑन' के साथ उपसर्गित है, इसलिए यह होगा on_punched()या on_hit()। वैकल्पिक रूप से, आप उस अधिवेशन को अपना सकते हैं जिसमें पिछले प्रतिभागी निष्क्रिय आवाज़ का संकेत देते हैं, और उस सम्मेलन से, विधि का नाम सिर्फ होगा punched()

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


4
@ असुर: हाँ और नहीं। फ़ाइलें (वैचारिक रूप से बोलना) खुद को पूछने पर बंद कर सकती हैं; arrays खुद को सॉर्ट कर सकते हैं; लेकिन छिद्रण बैग खुद को पंच नहीं करते हैं।
tdammers

2
ठीक है, अगर हमारा पंचिंग बैग पागल गति से दीवार से टकराता है, तो क्या वह दीवार है जो उस पर मुक्का मारती है, या क्या वह अपने आप पर और वास्तव में खुद को हिट कर रहा है?

1
@tdammers: सामान्यीकरण के आपके सुझाव को एक इंटरफ़ेस भी कहा जा सकता है Hitable
जेन्स पीगा

2
@Artur: मुझे लगता है कि यह वह जगह है जहां ओओपी ने यह माना है कि हर वाक्य का एक स्वाभाविक विषय है, और यह विचार प्रोग्रामिंग पर लागू होता है, टूट जाता है।
tdammers

1
तो मुख्य सवाल यह है। यदि फाइलें खुद को बंद कर सकती हैं, तो सरणियां खुद को छाँट सकती हैं, आदि, क्यों पंचिंग बैग खुद को पंच नहीं कर सकते? क्या कोई वास्तविक अंतर है या यह सिर्फ इतना है कि पहले मामले में, हम इसके लिए उपयोग किए जाते हैं और दूसरे में, हम नहीं हैं?
क्लेम

6

मुझे लगता है कि यह एक वैचारिक मुद्दा है (हम दुनिया के बारे में कैसा सोचते हैं)। यह कहना ठीक है:

  • देखो, दरवाजा बंद हो रहा है। door.close()
  • वाह, कागज अपने दम पर गुना है। paper.fold()
  • क्या बकवास है?! डेस्क पर वह फ़ाइल अभी बंद है, कोई भी आसपास नहीं है। file.close()

यह कहना अजीब है:

  • जिम में उस पंचिंग बैग ने सिर्फ पंच किया है। bag.punch()

यह पहली जगह (जैसे हथियार) के साथ खुद को पंच करने के लिए कुछ करने की आवश्यकता होगी। आप शायद कहेंगे:

  • पंचिंग बैग अपने आप हिलने लगा जैसे किसी ने मुक्का मारा हो। punching_bag.move()

यह प्रोग्रामेटिक ऑब्जेक्ट्स के लिए उन चीजों को करने के लिए ठीक है जो आम तौर पर अन्य लोग उनके साथ ("वास्तविक दुनिया में") करते हैं। लेकिन मुझे लगता है कि यह हमेशा कम से कम कुछ समझ में आ जाना चाहिए कि बात यह कर रहा है / खुद के साथ । आपको बिना अस्पष्ट (जैसे के मामले में punching_bag) आसानी से कल्पना करने में सक्षम होना चाहिए ।


2

यह स्वाद की बात है, मुझे लगता है। Punching bagकी punch()विधि कम से कम संगत है file.close()या frame.move()खुद पर कार्रवाई का अनुभव करने के अर्थ में है। अधिक से अधिक प्रश्न यह होगा कि आखिर विधि क्यों Boxerहै punch(something)?


मुझे file.close () के बारे में आपकी बात अच्छी लगी। मैं कुछ ऐसा कर रहा था। हो सकता है कि बॉक्सर के पास पंच विधि हो क्योंकि बॉक्सर को प्रशिक्षित करने वाला एक कोच भी होता है। ठीक है, वास्तव में, मैं बस एक वस्तु (क्रिया) के कुछ उदाहरण देने की कोशिश कर रहा था, जिसमें कई वस्तुओं के माध्यम से पिछले एक "कार्रवाई का उद्देश्य" हो। मुझे list.append (4), account.deposit (50), file.close (), paper.fold () बनाम boxer.punch (), dog.bark (), logger.log () आदि के साथ थोड़ी समस्या है। ।
क्लीमे

कई वस्तुओं से गुजरते समय, 2 मामले होते हैं: आप बाध्य संदर्भ (स्वयं) का उपयोग करते हैं, और आप नहीं करते हैं। यदि आप करते हैं, तो आपके तरीके होने चाहिए Coach.sayPunchToBoxer(), Boxer.punchNearestBag()और Bag.punch()। अन्यथा आपको यह अनुमान लगाना होगा कि आपके द्वारा कॉल करने पर हर बार क्या होगा Coach.punch()। सामान्य नियम है: यदि वस्तु जो क्रिया का अनुभव करती है, वह विधि नाम में निर्दिष्ट नहीं है, तो रिसीवर वह वस्तु है।

ठीक है, मुझे लगता है कि यह भी ठीक है: कोच.से_पंच (बॉक्सर, पंचिंग_बैग), बॉक्सर.पंच (पंचिंग_बैग)। यानी रिसीवर विधि नाम में नहीं है, लेकिन मापदंडों में है।
जलवायु

1
निश्चित रूप से, मेरा मतलब था कि एक्शन रिसीवर को कॉल स्टेटमेंट से अनुमान लगाया जाना चाहिए।

2

आपके पास दो अलग-अलग संदेश हैं: एक वस्तु को पंच करने के लिए और एक वस्तु को सूचित करने के लिए कि यह छिद्रित थी। इस बात पर विचार करें कि दोनों को जवाब देने के लिए एक बॉक्सर ऑब्जेक्ट की संभावना है । अलग ढंग से । यह उन्हें अलग नाम देने के लिए एक बहुत अच्छा कारण है।

मेरा झुकाव punch(boxer, object, strength)विपरीत पद्धति को रखने और नाम बदलने का होगा punched। आप इसे handle_punchया ऐसा कुछ कह सकते हैं लेकिन फिर भी यह अस्पष्ट है कि क्या यह एक पंच कमांड को संभालना है या अधिसूचना जो इसे छिद्रित हो गई है।


बॉक्सर को पंच और पंच_ जैसे कुछ की जरूरत के बारे में एक अच्छी बात ( defendइस विशेष मामले में होगी)। लेकिन पंचिंग बैग कभी भी इस तरह से अप्रत्यक्ष नहीं होगा। और वहाँ पहले से ही इस file.close () है ...
जलवायु

defendएक आदेश है। यह एक संभव कार्रवाई है जिसे एक वस्तु प्रतिक्रिया में ले सकती है punched, लेकिन आप नहीं चाहेंगे कि अन्य वस्तुएं defendसीधे आह्वान करें।
user2313838

2

आपका दृष्टिकोण अंततः बहुत युग्मित कोड को जन्म देगा।

एरिक लिपर्ट को आदर्श रूप से संक्षेप में प्रस्तुत करने के लिए आप चाहते हैं कि मुक्केबाज कई चीजों को पंच कर सके। बॉक्सिंग फंक्शन के सिग्नेचर के रूप में पंचिंग बैग होने का मतलब है कि बॉक्सर को ऑल (जो कि उपलब्ध नहीं है) का तत्काल ज्ञान है। एक पंच देने और एक पंच प्राप्त करने के लिए दो बहुत अलग चीजें हैं, इस प्रकार उन्हें एक ही नाम साझा नहीं करना चाहिए।

मैं इसे एक बॉक्सर के रूप में मॉडल करूंगा जो एक पंच बनाता है (दूसरी वस्तु जिसमें पंच गुण बल, पहुंच, दिशा आदि शामिल है)।

फिर ऑनिंग पंच जैसी विधि के साथ पंचिंग बैग लें जो इस पंच ऑब्जेक्ट को प्राप्त करता है, पंच के प्रभाव को स्वयं पर गणना कर सकता है।

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

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


1

यह वह समस्या है जिसे मैं "ऑब्जेक्ट / विषय" भ्रम कहता हूं और यह काफी प्रचलित है।

वाक्यों में आम तौर पर एक विषय होता है जो क्रिया को उनके लक्ष्य ऑब्जेक्ट पर करता है ।

अब प्रोग्रामिंग के संबंध में केवल एक चीज जो वास्तव में काम करती है वह है कंप्यूटर। या वस्तुतः एक प्रक्रिया, धागा या एक फाइबर। डिफ़ॉल्ट रूप से ऑब्जेक्ट चेतन नहीं हैं। उनके पास अपने स्वयं के धागे नहीं हैं, इसलिए वे वास्तव में कुछ भी नहीं कर सकते हैं।

इसका मतलब है कि विधियां उन पर काम करती हैं, वे कार्रवाई का लक्ष्य हैं जो कार्रवाई नहीं करता है। इसलिए हम उन्हें "वस्तु" नहीं "विषय" कहते हैं!

जब आप कहते हैं कि File.closeयह फ़ाइल अपने आप बंद नहीं होती है, तो यह चालू चालू थ्रेड होता है जो फ़ाइल को बंद कर देता है। यदि आप कहते हैं Array.sort, तो वर्तमान में चलने वाला धागा सरणी को सॉर्ट करता है। यदि आप कहते हैं HttpServer.sendRequest, तो वर्तमान में चलने वाला धागा सर्वर को अनुरोध भेजता है (इसके विपरीत नहीं!)। इसी तरह कहने का PunchingBag.punchमतलब है कि चालू रनिंग थैला पंच करता है।

इसका मतलब है कि यदि आप चाहते हैं कि Boxerपंच करने में सक्षम हो, तो यह एक उप-वर्ग होना चाहिए Threadताकि यह अपने थ्रेड फ़ंक्शन में बैग को छिद्रित करने जैसी चीजें कर सके।

हालाँकि कभी-कभी यह भी कहा जाता है कि पंचिंग बैग पंचों के मामले में ही ऐसा होता है, जहाँ प्रत्येक वस्तु का अपना धागा होता है जिसे आप दौड़ की स्थिति से बचना चाहते हैं और मैसेज पासिंग के रूप में विधि कॉल को लागू कर सकते हैं: आप बैग को punchसंदेश भेजकर पंच करते हैं , यह थ्रेड पंच है। स्वयं ही आपको punch successfulसंदेश वापस भेज देता है , लेकिन यह केवल एक कार्यान्वयन विवरण है।


0

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

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

हालांकि, यह मेरी व्याख्या है कि मैं तरीकों का नाम कैसे दूंगा। यह सब स्वाद का मामला है और आप किन मानकों का पालन कर रहे हैं।


3
isPunchedवास्तव में भ्रामक है (कम या ज्यादा, फ्रेमवर्क नामकरण योजना के आधार पर)।

यह सामान्य है कि विधि उस वस्तु पर लागू होती है, जिस पर इसे कहा जाता है। क्या गलत है बस punch()?

ठीक है, मैं पूरी तरह से समझता हूं कि कार्रवाई की दिशा निर्दिष्ट करने की आवश्यकता है लेकिन मुझे लगता है कि ओओपी और इसके दर्शन के बारे में कुछ है जो इसे अनावश्यक बनाता है। किसी प्रकार का अमूर्त जो उस प्रसिद्ध विवरण के साथ जुड़ा हुआ है जो ऑब्जेक्ट एक दूसरे को "संदेश भेजते हैं"।
जलवायु

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

-2

hmmmm। मैं एक वर्ग के रूप में पंचिंग बैग पर सवाल उठा रहा हूं, क्योंकि आप वास्तव में पंचिंग बैग की परवाह नहीं करते हैं - आप मुक्केबाजों के प्रभाव और ताकत की परवाह करते हैं। इसलिए पंच प्रभाव को मापने और रिपोर्ट करने के तरीकों के बारे में होना चाहिए। यहां तक ​​कि अगर यह 'पंचिंग बैग' से आ रहा है, तो भी नामकरण को जिम्मेदारी को प्रकट करना चाहिए - जैसे पंचइंपैक्ट मैटर आदि।


-3

मुक्केबाज ने पंचिंगबैग को घूंसा मारा -> बॉक्सर.पंच

पंचिंगबैग बॉक्सर द्वारा छिद्रित हो जाता है -> पंचिंगबैग.गेट_पंच


3
इससे पहले किए गए 6 अंकों से अधिक कुछ भी नहीं दिया गया है और पहले ही 6 जवाबों में समझाया गया है
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.