2008-11-28 14 views
6

जब मैं पहली बार प्रोग्रामिंग शुरू कर दिया, मैं मुख्य में सब कुछ लिखा था। लेकिन जैसा कि मैंने सीखा है, मैं अपने main() तरीकों में यथासंभव कम करने की कोशिश की।कैसे मुख्य लिखने के लिए() एक OOP तरह से?

लेकिन जहाँ आप अन्य वर्ग/विधि जिम्मेदारी main() से कार्यक्रम को टेक ओवर करने देने का फैसला करते हैं? आप इसे कैसे करते हो?

class Main 
{ 
    public static void main(String[] args) 
    { 
    new Main(); 
    } 
} 

और कुछ की तरह:

class Main { 

    public static void main(String[] args) { 

    GetOpt.parse(args); 

    // Decide what to do based on the arguments passed 
    Database.initialize(); 
    MyAwesomeLogicManager.initialize(); 
    // And main waits for all others to end or shutdown signal to kill all threads. 
    } 
} 

क्या और main() में नहीं किया जाना चाहिए चाहिए

मैं इसे करने के कई तरीके हैं, इस तरह देखा है? या कोई चांदी की गोलियाँ नहीं हैं?

समय के लिए धन्यवाद!

उत्तर

7

मेरी राय में, एक बड़े आकार का परियोजना के "मुख्य" शामिल करना चाहिए लगभग 3 फ़ंक्शन को कॉल:

  • एक प्रारंभ समारोह है कि आवेदन के लिए सभी आवश्यक सेटिंग्स, भाषाएं, आदि सेट कॉलिंग।
  • आवेदन के मुख्य "नियंत्रक" को शुरू करना
  • मुख्य नियंत्रक को समाप्त करने की प्रतीक्षा कर रहा है, और उसके बाद टर्मिनेशन फ़ंक्शन को कॉल करना जो "मुख्य" में साफ किए जाने वाले किसी भी चीज़ को साफ़ करता है (हालांकि नियंत्रक के पास होगा पहले से ही अधिकांश सफाई का ख्याल रखा)।

कोई भी बड़ा आवेदन कार्यक्षमता के टुकड़ों में विभाजित किया जाएगा, आमतौर पर कुछ पदानुक्रम के साथ। मुख्य नियंत्रक में विशिष्ट विशेषताओं के लिए कई बाल नियंत्रक हो सकते हैं।

इसे इस तरह करने से यह बहुत आसान विशिष्ट कार्यक्षमता का पता लगाने के लिए बनाता है, और जुदाई के- चिंताओं बेहतर है।

बेशक

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

0

मुझे लगता है कि मुख्य विधि की व्याख्या करनी चाहिए, क्या कार्यक्रम शुरू में करता है। तो यह तरीकों initialzing कॉल कर सकते हैं, लेकिन तर्क के तरीकों में निकाला जाना चाहिए।

अपने उदाहरण में, मैं एक मुख्य() विधि का निर्माण नहीं होगा, लेकिन यह मूल एक में डाल दिया।

4

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

class Main का एक उदाहरण बनाना और फिर इंस्टेंस विधि Main() को कॉल करना जो सभी काम सीधे मुख्य विधि में सब कुछ लिखना उतना ही अच्छा है।

0

अपने कार्यक्रम अपने "मुख्य" के आकार तय करेगा की डिजाइन।

"नियम" होने के बाद यह कहता है कि आपका मुख्य कार्य कैसे होना चाहिए, आईएमएचओ - एक गैर-अर्थ है।

2

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

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

तब आसानी से देख सकते हैं कि तंत्र में थोड़ा गहरा खोदने के लिए कहां जाना है?

क्या प्रत्येक कार्यात्मक अनुभाग आप प्रक्रियाओं का केवल तार्किक ब्लॉक कर रहे हैं? इसे केवल एक चीज करने की ज़रूरत नहीं है, लेकिन यह सब कुछ प्लस रसोई सिंक नहीं करनी चाहिए।

अपने कोड को इस तरह से तोड़ दें कि यह बाहरी स्रोत द्वारा बनाए रखा जा सके।

कारण आकाश अवगत है, लेकिन यह सही यह करने के लिए नीचे आता है, अगर किसी को -else- बग को ठीक कर सकते हैं, यह सब बेहतर =)

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

मुख्य कार्य में
17

कोड:

  • इकाई परीक्षण नहीं हो सकता।
  • इंजेक्शन द्वारा निर्भरता प्राप्त नहीं कर सकता है।
  • आपके द्वारा लिखे गए पहले के समान अन्य एप्लिकेशन द्वारा पुन: उपयोग नहीं किया जा सकता है।

इसलिए मुख्य कार्य में कोड:

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

प्रैक्टिस में, इसका मतलब है कि वास्तविक ऐप्स में मुख्य में बहुत कुछ नहीं है। खिलौने के ऐप्स और एक-शॉट प्रोग्राम में मुख्य रूप से काफी कुछ हो सकता है, क्योंकि आप उन्हें वैसे भी परीक्षण या पुन: उपयोग करने की योजना नहीं बना रहे हैं।

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

[संपादित करें: किसी ने इस प्रश्न से "सी ++, जावा" टैग हटा दिए हैं। तो: मैं ऊपर क्या कहता हूं सी ++ और जावा विशिष्ट है।अन्य भाषाएं मुख्य रूप से इस तरह से इलाज कर सकती हैं जो कम विशेष है, इस मामले में विशेष रूप से इसका इलाज करने के लिए कोई विशेष कारण नहीं हो सकता है।]

2

देखो, "मुख्य" विधि की सामग्री और रूप बहुत भाषा है और पर्यावरण निर्भर। जावा में, प्रत्येक वर्ग में public static void main() विधि हो सकती है, इसलिए यह एक से अधिक होने के लिए पूरी तरह से व्यवहार्य है।

लेकिन अब, के modularization की Parnas के कानून के माध्यम से इस बारे में सोचते हैं: "। हर मॉड्यूल एक गुप्त छिपा है, और उस गुप्त कुछ है कि बदल सकते हैं कि" बहस हो रही है और अनियमित समाप्ति से निपटने तरह बातें: मॉड्यूल है कि शुरू में कहा जाता है की "गुप्त" ऑपरेटिंग सिस्टम के साथ प्रक्रिया इंटरफ़ेस का ब्यौरा है। अजगर में, यह कुछ इस तरह की ओर जाता है:

def main(args=None): 
    #argument processing 
    #construct instances of your top level objects 
    #do stuff 

if __name__ == "__main__": 
    try: 
     main(Sys.Argv) 
    except: # everything 
     # clean up as much as you can 
    else: 
     # normal cleanup, no exceptions 

यहां मुद्दा यह है कि आप पर्यावरण से सब कुछ प्राप्त हो, फिर मुख्य() फ़ंक्शन कॉल कर सकते हैं किया जा रहा है; आप सभी बेजोड़ अपवादों को पकड़ते हैं और प्रोग्राम मरने से पहले आप उनके साथ कुछ बुद्धिमान करते हैं।

0

याद रखें कि यदि किसी को कैसे अपने कार्यक्रम काम करता है की एक विचार प्राप्त करना चाहता है, पहले स्थान पर वे शायद गौर करेंगे मुख्य में है (कम से कम मैं करूंगा)। इसलिए, मुझे नहीं लगता कि जितना संभव हो उतना कम रखना अच्छा विचार है। लेकिन मैं कहूंगा कि आपका कार्यक्रम कैसे काम करता है इस बारे में पक्षियों के नजरिए को प्राप्त करने के लिए जरूरी है।

इस प्रकार, मैं एक मुख्य कार्य को लागू करने पठनीयता होना चाहिए में अपने एक सबसे बड़ा चिंता का विषय लगता है।