क्या पाइथोनिक को एक ही फाइल में कई वर्गों में परिभाषित किया गया है?


31

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

आमतौर पर, ये वर्ग 1 सार आधार वर्ग से बने होते हैं, 1-2 ठोस कार्यान्वयन के साथ जिनका उपयोग थोड़ा भिन्न होता है। मैंने ऐसी एक फ़ाइल नीचे पोस्ट की है:

class Logger(object):

    def __init__(self, path, fileName):
        self.logFile = open(path + '/' + filename, 'w+')
        self.logFile.seek(0, 2)

    def log(self, stringtoLog):
        self.logFile.write(stringToLog)

    def __del__(self):
        self.logFile.close()

class TestLogger(Logger):   

    def __init__(self, serialNumber):
        Logger.__init__('/tests/ModuleName', serialNumber):

    def readStatusLine(self):
        self.logFile.seek(0,0)
        statusLine = self.logFile.readLine()
        self.logFile.seek(0,2)
        return StatusLine

    def modifyStatusLine(self, newStatusLine):
        self.logFile.seek(0,0)
        self.logFile.write(newStatusLine)
        self.logFile.seek(0,2)

class GenericLogger(Logger):

    def __init__(self, fileName):
        Logger.__init__('/tests/GPIO', fileName):

    def logGPIOError(self, errorCode):
        self.logFile.write(str(errorCode))

जैसा कि ऊपर देखा गया है, मेरे पास एक लॉगर बेस क्लास है, जिसमें कार्यान्वयन के कुछ अंतर नीचे दिए गए हैं।

प्रश्न: क्या यह मानक अजगर के लिए है, या किसी भी भाषा के लिए? इस कार्यान्वयन का उपयोग करने से क्या समस्याएं पैदा हो सकती हैं यदि कोई हो?

संपादित करें: मैं वास्तव में इस विशिष्ट फ़ाइल पर मार्गदर्शन की तलाश में नहीं हूं , लेकिन अधिक सामान्य अर्थों में। क्या होगा यदि कक्षाएं 3-5 मामूली जटिल तरीकों से समाप्त हो गईं? यह तो उन्हें विभाजित करने के लिए समझ में आता है? यह कहने के लिए कटऑफ कहां है कि आपको फ़ाइल को विभाजित करना चाहिए?


3
प्रति फ़ाइल एक कक्षा तक सीमित करना C ++ बात नहीं है। जावा एकमात्र ऐसी भाषा है, जिसके बारे में मुझे पता है कि इसे कहाँ टाला जाना चाहिए। C ++ में, यह एक .h / .cpp फ़ाइल के लिए एक सामान्य वर्ग और बहुत से सहायक वर्गों के लिए बेहद सामान्य है, जो प्राथमिक वर्ग के लिए निजी हो सकता है या नहीं भी हो सकता है।
रोबोट

@StevenBurnap मैंने c ++ को एक उदाहरण के रूप में हटा दिया, जैसा कि आप सही हैं।
Ampt

1
यह ऑटो-लोडिंग की सुविधा के लिए php में भी किया जाता है। दूसरी ओर php में आप स्पष्ट रूप से नाम स्थान की घोषणा कर सकते हैं।
बोडो

जवाबों:


24

यह ठीक है। यह संदर्भ के लिए C ++ में भी ठीक है।

कसकर-युग्मित चीजों को एक साथ रखना समझदारी का अभ्यास है। अनुचित कपलिंग से बचना भी अच्छा अभ्यास है। सही संतुलन कायम रखना सख्त नियमों का मामला नहीं है, लेकिन, ठीक है, विभिन्न चिंताओं के बीच संतुलन बनाना।

अंगूठे के कुछ नियम:

  1. आकार

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

  2. चिंताओ का विभाजन

    यदि आपके ठोस कार्यान्वयन में बहुत भिन्न आंतरिक चिंताएँ हैं, तो आपकी एकल फ़ाइल उन सभी चिंताओं को जमा करती है। उदाहरण के लिए, गैर-अतिव्यापी निर्भरता वाले कार्यान्वयन आपकी एकल फ़ाइल को उन सभी निर्भरताओं के मिलन पर निर्भर करते हैं।

    इसलिए, कभी-कभी यह निर्भर हो सकता है कि उप-वर्गों की कपलिंग पर उनकी निर्भरता इंटरफ़ेस के प्रति उनके युग्मन को कम कर देती है (या इसके विपरीत, एक इंटरफ़ेस को लागू करने की चिंता उस कार्यान्वयन के लिए आंतरिक चिंताओं से कमज़ोर है)।

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

  3. encapsulation

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

    यह सिर्फ घटिया शैली है जो मुझे लगता है, लेकिन आप मॉड्यूल को विभाजित करके बेहतर अनुशासन लागू कर सकते हैं यदि आप वास्तव में आदत नहीं तोड़ सकते हैं।


2
अगर यह बाहरी संदर्भों को एक फ़ाइल में कक्षाओं के संयोजन की सामान्यता को प्रदर्शित करता है, या यह बताता है कि क्यों ठीक है तो अधिक स्पष्टीकरण प्रदान करके आपका उत्तर अधिक मजबूत होगा।

1
मैंने प्रश्न को संपादित करने के लिए कहा है कि यह केवल एक उदाहरण है कि मेरा क्या मतलब है, और यह वास्तव में प्रश्न की प्रकृति का प्रतिनिधित्व नहीं करता है। जहां जरूरत है, वहां उन्हें आयात करने से बेहतर उसी फाइल में क्यों रखा गया है?
Ampt

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

1
@ GlenH7 - मैं संदर्भों के बारे में निश्चित नहीं हूं, क्योंकि वे मुझसे सीधे दावा करने के लिए मेरे पास जाते हैं, मेरे लिए दावा करते हैं कि मेरा चयन पूर्वाग्रह मान्य है। मैंने इसके बजाय स्पष्टीकरण पर ध्यान देने की कोशिश की है।
बेकार

7

पाइथोनिक क्या है, यह जानने के लिए मेरा सामान्य संदर्भ दस्तावेज।

सरल जटिल से बेहतर है।

फ्लैट नेस्टेड से बेहतर है।

से ज़ेन अजगर का

लगभग अपवाद के बिना, वर्ग के नाम कैपिसन सम्मेलन का उपयोग करते हैं।

पैकेज और मॉड्यूल नाम मॉड्यूल में छोटे, सभी-लोअरकेस नाम होने चाहिए। [...] मॉड्यूल नामों को नाम दर्ज करने के लिए मैप किया जाता है

से पीईपी 8

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


7
क्या आप सवाल के लिए प्रासंगिक भागों को कम कर सकते हैं? मैंने इन दोनों को कई बार पढ़ा है, लेकिन मुझे एक कठिन समय है जो विशेष रूप से मेरे वर्तमान प्रश्न से संबंधित है।
Ampt

1
वास्तव में, मैंने अपना उत्तर संपादित कर लिया है।
सिल्वेनड

1

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


0

यह निश्चित रूप से ठीक है और जब तक वे साकार होते हैं मैं आपको एक फाइल में कई कक्षाएं देने के लिए प्रोत्साहित करूंगा। सामान्य तौर पर आपकी कक्षाएं संक्षिप्त और संक्षिप्त रहनी चाहिए और आपको विशाल अखंड साहित्य के निर्माण के बजाय व्यवहार को दो या अधिक वर्गों में विभाजित करना चाहिए। कई छोटी कक्षाओं को लिखते समय यह वास्तव में आवश्यक और सहायक होता है जो एक ही फाइल में संबंधित होते हैं।


-1

संक्षेप में - नरक हाँ।

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


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