मुझे एक फाइल में कितनी कक्षाएं लगानी चाहिए? [बन्द है]


274

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


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

जवाबों:


333

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

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

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

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

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

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बयानों के साथ चित्रित कर रहे हैं ।


24
Haha, मैं उद्धरण में "समझ" पसंद है।
cdleary

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

4
उपरोक्त सिफारिशें docs.python-guide.org/en/latest/writing/structure
मयंक जायसवाल

4
जवाब जो वास्तव में सवाल का जवाब नहीं देता है, पठनीयता के बारे में क्या है, इसमें 500 से अधिक लाइनों वाली फाइलों को पढ़ना मुश्किल है।
वेदांत

38

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


23

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


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

खासकर यदि आप जावा से पायथन में आते हैं। वे पायथन में एक फ़ाइल में कई कक्षाएं फेंकते थे)
वेबकॉम

14

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

उदाहरण के लिए, मैं अक्सर डेटा-एब्सट्रैक्शन के लिए कक्षाओं की एक श्रृंखला का उपयोग करता हूं - इसलिए मेरे पास 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- यदि आप चीजों को समझ से बाहर कर रहे हैं, और फाइलें दसियों हजार लाइनों की लंबी नहीं हैं, तो आपने इसे सही तरीके से व्यवस्थित किया है।

अजगर मॉड्यूल प्रलेखन संकुल के आयोजन पर कुछ उपयोगी जानकारी है।


1
पायथन मॉड्यूल के टूटे हुए लिंक प्रलेखन। हो सकता है कि धारा 6.4 मॉड्यूल्स.पैकेज अभी इच्छित लिंक है?
cod3monk3y

9

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

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

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

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

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


6

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

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