2008-09-20 9 views
217

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

+5

मुझे लगता है कि यह एक उचित * प्रश्न * है जो अन्य भाषाओं की आवश्यकताओं और सम्मेलनों को दिया गया है, और * उत्तर * "<पाइथन मॉड्यूल और संकुल को परिभाषित करता है> और इससे परे यह वरीयता (/ राय) का विषय है" - * वह उत्तर * खुद की राय नहीं है – d3vid

उत्तर

268

एक पायथन फ़ाइल को "मॉड्यूल" कहा जाता है और यह आपके सॉफ़्टवेयर को व्यवस्थित करने का एक तरीका है ताकि यह "समझ" बन सके। एक और निर्देशिका है, जिसे "पैकेज" कहा जाता है।

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

नियम यह है: एक मॉड्यूल पुन: उपयोग का यूनिट है।

आप आसानी से एक कक्षा का पुन: उपयोग नहीं कर सकते हैं। आप बिना किसी कठिनाई के मॉड्यूल का पुन: उपयोग करने में सक्षम होना चाहिए। आपकी लाइब्रेरी में सब कुछ (और जो भी आप डाउनलोड करते हैं और जोड़ते हैं) या तो मॉड्यूल या मॉड्यूल का पैकेज है।

उदाहरण के लिए, आप स्प्रेडशीट को पढ़ने वाले कुछ पर काम कर रहे हैं, कुछ गणना करता है और परिणामों को डेटाबेस में लोड करता है। आप अपने मुख्य कार्यक्रम की तरह दिखना चाहते हैं?

from ssReader import Reader 
from theCalcs import ACalc, AnotherCalc 
from theDB import Loader 

def main(sourceFileName): 
    rdr= Reader(sourceFileName) 
    c1= ACalc(options) 
    c2= AnotherCalc(options) 
    ldr= Loader(parameters) 
    for myObj in rdr.readAll(): 
     c1.thisOp(myObj) 
     c2.thatOp(myObj) 
     ldr.laod(myObj) 

अवधारणाओं या हिस्सों में अपना कोड व्यवस्थित करने के तरीके के रूप में आयात के बारे में सोचें। वास्तव में प्रत्येक आयात में कितनी कक्षाएं कोई फर्क नहीं पड़ती हैं। क्या मायने रखता है वह समग्र संगठन है जिसे आप अपने import कथनों के साथ चित्रित कर रहे हैं।

+16

हाहा, मुझे कोटेशन में "भावना" पसंद है। – cdleary

+21

@cdleary: एक व्यक्ति की भावना किसी अन्य व्यक्ति की पागलपन है। आमतौर पर, आप समझदार मॉड्यूल को परिभाषित कर सकते हैं। एक बड़े आवेदन में, हालांकि, हमेशा विश्लेषण के कई आयाम होते हैं और एक व्यक्ति किसी अन्य व्यक्ति के टुकड़े और कार्यक्षमता के आधार पर बाल विभाजित करेगा। –

+4

उपरोक्त सिफारिशें http://docs.python-guide.org/en/latest/writing/structure/ –

5

मैं कहूंगा कि उस फ़ाइल में बहुत से वर्गों को तर्कसंगत रूप से समूहीकृत किया जा सकता है, बिना इसे बहुत बड़ा और जटिल बना दिया जा सकता है।

35

चूंकि कोई कृत्रिम सीमा नहीं है, यह वास्तव में समझ में आता है कि क्या समझ में आता है। यदि आपके पास काफी कम, सरल वर्गों का समूह है जो तर्कसंगत रूप से समूहबद्ध हैं, तो 'em' के समूह में टॉस करें। यदि आपके पास बड़ी, जटिल कक्षाएं या कक्षाएं हैं जो समूह के रूप में समझ में नहीं आती हैं, तो प्रति कक्षा एक फ़ाइल पर जाएं। या बीच में कुछ चुनें। चीजों में बदलाव के रूप में रिफैक्टर।

13

यह पूरी तरह से इस बात पर निर्भर करता है कि परियोजना कितनी बड़ी है, कक्षाएं कितनी देर तक हैं, अगर उन्हें अन्य फाइलों से उपयोग किया जाएगा और इसी तरह।

उदाहरण के लिए मैं अक्सर डेटा-एस्ट्रस्ट्रक्शन के लिए कक्षाओं की एक श्रृंखला का उपयोग करता हूं - इसलिए मेरे पास 4 या 5 कक्षाएं हो सकती हैं जो केवल 1 लाइन लंबी हो सकती हैं (class SomeData: pass)।

यह अलग फ़ाइलों में इनमें से प्रत्येक विभाजित करने के लिए बेवकूफ हो सकता है - लेकिन जब से वे अलग अलग फ़ाइलों से इस्तेमाल किया जा सकता है, एक अलग data_model.py फ़ाइल में इन सभी डाल मतलब होता है, तो मैं from mypackage.data_model import SomeData, SomeSubData

कर सकते हैं यदि आप इसमें बहुत सारे कोड वाले वर्ग हैं, शायद कुछ फ़ंक्शंस केवल इसका उपयोग करते हैं, इस वर्ग और सहायक कार्यों को एक अलग फ़ाइल में विभाजित करना एक अच्छा विचार होगा।

आपको उन्हें ढांचा बनाना चाहिए ताकि आप from mypackage.database.schema import MyModel न करें, from mypackage.email.errors import MyDatabaseModel - यदि आप कहां से चीजों को आयात कर रहे हैं, और फाइलें हजारों लाइनों तक लंबी नहीं हैं, तो आपने इसे सही तरीके से व्यवस्थित किया है।

Python Modules documentation पैकेजों को व्यवस्थित करने पर कुछ उपयोगी जानकारी है।

+0

पाइथन मॉड्यूल दस्तावेज़ों के टूटी हुई लिंक के साथ अनुबंध में हैं। शायद [धारा 6.4 मॉड्यूल। पैकेज] (http://docs.python.org/2/tutorial/modules.html#packages) अब इच्छित लिंक है? – cod3monk3y

10

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

7

जब मैं फाइलों के संकेत से नाराज हो जाता हूं और जब स्वाभाविकता की वांछित संरचना स्वाभाविक रूप से उभरती है तो मुझे खुद को विभाजित चीजें मिलती हैं। अक्सर ये दो चरण मेल खाते हैं।

यदि आप चीजों को बहुत जल्दी विभाजित करते हैं तो यह बहुत परेशान हो सकता है, क्योंकि आपको यह महसूस करना शुरू हो जाता है कि संरचना का एक बिल्कुल अलग क्रम आवश्यक है।

दूसरी ओर, जब कोई .java या .py फ़ाइल लगभग 700 लाइनों से अधिक हो रही है, तो मुझे यह याद रखने की कोशिश की जाती है कि "वह विशेष बिट" कहां है।

आयात विवरणों के पाइथन/ज्योथन परिपत्र निर्भरता के साथ भी एक भूमिका निभाती है: यदि आप अलग-अलग फाइलों में बहुत अधिक सहयोगी मूल बिल्डिंग ब्लॉक को विभाजित करने का प्रयास करते हैं तो भाषा की यह "प्रतिबंध"/"अपूर्णता" आपको मजबूर करती है समूह चीजें, शायद एक समझदार तरीके से।

पैकेजों में विभाजित होने के नाते, मुझे वास्तव में पता नहीं है, लेकिन मैं शायद सामान्यता के सभी स्तरों पर परेशानी का एक ही नियम और खुश संरचना के उद्भव का कहना चाहूंगा।

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

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