क्या मुख्य विधि केवल ऑब्जेक्ट क्रिएशन और मेथड कॉल से युक्त होनी चाहिए?


12

मेरे एक दोस्त ने मुझे बताया कि, सबसे अच्छा अभ्यास वर्ग युक्त mainविधि का नाम होना चाहिए Mainऔर केवल mainविधि शामिल होनी चाहिए । इसके अलावा mainविधि केवल इनपुट को पार्स करना चाहिए, अन्य ऑब्जेक्ट बनाएं और अन्य तरीकों को कॉल करें। Mainवर्ग और mainविधि और कुछ मत करना चाहिए। मूल रूप से वह क्या कह रहा है कि वर्ग युक्त mainविधि इस प्रकार होनी चाहिए:

public class Main
{
    public static void main(String[] args)
    {
        //parse inputs
        //create other objects
        //call methods
    }
}

क्या यह सबसे अच्छा अभ्यास है?


6
और क्या कर सकता है?
पबबी

जवाबों:


11

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

public static void main(String[] args){
    new Foo().start(args[0]);
}

यह विचार है कि आपको आरंभ करने के लिए मुख्य विधि की आवश्यकता नहीं है Foo। यह आपको आसानी से आरंभ करने और Fooएक और संदर्भ में शुरू करने की अनुमति देता है, संभवतः विभिन्न शब्दार्थों के साथ।

public Foo initSomewhereElse(String arg){
    Foo f = new Foo();
    f.start(arg);
    return f;
}

7

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

इसलिए, अधिकांश विशेषज्ञ कहते हैं कि मुख्य () फ़ंक्शन का LOC जितना संभव हो उतना कम होना चाहिए। एक दृष्टिकोण है (जो मुझे लगता है कि थोड़ा ओवरकिल है) जिसमें मुख्य () फ़ंक्शन में एक पंक्ति है:

public class Program
{
   private Program(string[] args)
   {
      //parse args and perform basic program setup
   }

   //Reduce the ugliness to the absolute minimum
   public static void main(string[] args)
   {
      new Program(args).Run();  
   }

   private void Run()
   {
      //kick off the driving O-O code for the app; i.e. Application.Run()
   }    
}

यह थोड़ा बहुत है, लेकिन मैं मूल सिद्धांत से सहमत हूं; मुख्य () को आपके ऑब्जेक्ट-ओरिएंटेड, इवेंट-संचालित एप्लिकेशन को "तैयार" स्थिति में लाने के लिए जितना संभव हो उतना कम होना चाहिए।


मैं असहमत हूं। यह mainअन्य संदर्भों से कॉल करने के लिए उपयोगी हो सकता है- उदाहरण के लिए, पुनरावृत्ति।
डेडजैम

4
व्यक्तिगत रूप से यदि आप अपनी मुख्य विधि का पुनरावर्ती कर रहे हैं, तो मुझे लगता है कि आपको इसके बजाय किसी अन्य विधि को कॉल करना चाहिए और पुनरावर्ती करना चाहिए। केवल सबसे सरल संदर्भों में (लगभग होमवर्क-स्तरीय जटिलता / कठिनाई का कंसोल ऐप) यह आपके कार्यक्रम के भीतर से मुख्य () को कॉल करने के लिए स्वीकार्य होगा, और मैं उस तुच्छ स्थिति को कॉल करूंगा।
कीथ्स

1

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

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

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