سؤال

عندما بدأت لأول مرة البرمجة, كتب كل شيء في الرئيسية.ولكن كما علمت ، حاولت أن تفعل أقل قدر ممكن في بلادي main() الأساليب.

ولكن من أين لكم أن تقرر إعطاء فئة أخرى/طريقة المسؤولية لتولي البرنامج من 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()?أو هل هناك أي الفضة الرصاص ؟

شكرا على الوقت!

هل كانت مفيدة؟

المحلول

في رأيي, و "الرئيسي" من بأس به المشروع يجب أن تحتوي على حوالي 3 وظيفة المكالمات:

  • استدعاء وظيفة التهيئة أن يضع كافة الإعدادات والتفضيلات.... الخللتطبيق.
  • بدء الرئيسية "تحكم" من التطبيق
  • في انتظار الرئيسية التي تحكم إنهاء ثم يدعو إنهاء وظيفة أن ينظف أي شيء يحتاج إلى تنظيف في "الرئيسية" (على الرغم من سوف تحكم اتخذت الرعاية من معظم تنظيف بالفعل).

أي لا بأس به التطبيق سوف تكون مقسمة إلى أجزاء من الوظائف ، وعادة مع بعض الهرمي.الرئيسية تحكم قد يكون العديد من الأطفال تحكم ميزات محددة.

القيام بهذه الطريقة يجعل من الاسهل بكثير للعثور على وظائف محددة ، وفصل المخاوف هو أفضل.

بالطبع, وغيرها من الردود قال لا يوجد حل سحري في تطوير البرمجيات.لفترة قصيرة المشروع قد وضع كل شيء في الرئيسية فقط للحصول على الأشياء و الجري بسرعة.أعتقد أيضا يعتمد على لغة بعض الخيارات قد تكون أسهل من غيرها في لغات معينة.

نصائح أخرى

التعليمات البرمجية في الدالة الرئيسية:

  • لا يمكن أن تكون وحدة اختبار.
  • لا يستطيعون الحصول على تبعيات عن طريق الحقن.
  • لا يمكن استخدامها من قبل التطبيقات الأخرى على غرار أول واحد كنت أكتب.

ولذلك البرمجية في الدالة الرئيسية:

  • يجب أن تكون بسيطة بحيث كنت سعيدا مع وظيفية/نظام الاختبارات فقط.
  • يجب أن تكون مسؤولة عن وضع الكرة المتداول عن التبعيات المستخدمة من قبل كل رمز (أي الأفعال الرئيسية مثل اوبر-المصنع الذي يخلق الطلب الخاص بك).
  • فقط ينبغي أن تفعل الأشياء التي هي خاصة إلى طريقة تعيين التطبيق الخاص بك (أي ، لا شيء مما اختبار التعليمات البرمجية أو الإصدار التجريبي سوف تحتاج إلى القيام به بالضبط بنفس الطريقة).

وهذا يعني عمليا أن ريال تطبيقات لا نملك في الرئيسية.لعبة التطبيقات طلقة واحدة من البرامج قد يكون الكثير جدا في الرئيسية, لأن أنت لا تخطط لاختبار أو إعادة استخدامها على أي حال.

في الواقع, بعض ما قلت أعلاه هو C++محددة.جافا الطرق الرئيسية بالطبع يمكن أن يسمى اختبار التعليمات البرمجية أو البديل التطبيقات.لكنها لا تزال لا تأخذ الأشياء كما المعلمات فقط من سطر الأوامر ، وبالتالي فإن المدى الذي يمكن أن تكون معزولة تحت الاختبار ، أو تتصرف بشكل جيد في مجال إعادة استخدام منخفضة جدا.أعتقد أنك يمكن أن تمر أسماء فئة لهم مثيل و استخدامها لإنشاء بقية التطبيق.

[تحرير:شخص ما لديه إزالة "C++, Java" فئة من هذا السؤال.لذلك:ما أقول أعلاه هي C++ و Java محددة.لغات أخرى قد تعامل الرئيسية في الطريقة التي أقل خاصة ، وفي هذه الحالة قد لا يكون هناك سبب معين لتتمكن من التعامل معها خصيصا سواء.]

ومهما يطفو القارب الخاص بك، كما يقولون. :) يجب أن تركز حقا على جعل رمز بسيطة وسهلة القراءة وكفاءة، وذلك باستخدام كل ما تحتاجه من أدوات لتحقيق ذلك. إذا كان يستدعي وضع الكثير من التعليمات البرمجية في main - القيام بذلك. إذا كنت تشعر بأن الأشياء من شأنه أن يجعل الأمور أكثر تنظيما - يذهب بهذه الطريقة

وجعل نسخة واحدة من class Main ثم استدعاء Main() أسلوب مثيل الذي يفعل كل عمل هو مجرد جيدة مثل كتابة كل شيء في الأسلوب الرئيسي مباشرة.

وأود أن أقول أنه ليس ما هو في وظيفة الرئيسية الخاصة بك، ولكن ما ليس كذلك. اعتمادا على تعقيد المشروع الخاص بك، فأنت تريد أن كسرها نزولا إلى أقسام وظيفية، مثل "وظائف قاعدة البيانات"، "وظائف العرض"، "الشاي عالية مع النائب"، الخ.

وانها كل شيء عن سهولة قراءة التعليمات البرمجية. يمكن للشخص آخر، الذي لم يسبق له مثيل البرنامج قبل تأتي عبرها، والحصول في البداية، فكرة جيدة معممة ما تقوم به؟

ويمكن بعد ذلك بسهولة ثم نرى إلى أين تذهب لحفر أعمق قليلا في آلية؟

هل كل قسم وظيفي كنت تستخدم تفعل سوى كتلة المنطقي العمليات؟ انها لا تملك أن تفعل شيئا واحدا فقط، ولكن لا ينبغي أن تفعل <م> كل شيء بالإضافة إلى بالوعة المطبخ.

وتحطيم رمز بطريقة أنها تستعصي على من مصدر خارجي.

والسماوات السبب يعرف، عندما يتعلق الأمر الحق في ذلك، إذا كان شخص -else- يمكن إصلاح الخلل، انها كل ما هو أفضل =)

وأما إجابة مباشرة على سؤالك، أود أن وضع باستدعاء الدالة على كل من المكونات الرئيسية في الرئيسية، والإعداد، والعملية والنهاية، بحيث يمكن لأي شخص الذي ينظر في ذلك يحصل لمحة سريعة عن كيفية البرنامج يعمل. يمكنهم ثم حفر مزيد من الانخفاض إذا ما احتاجوا إليها.

ونظرة، ومضمون وشكل طريقة "الرئيسي" هو اللغة ذاتها والبيئة التابعة. في جاوة، ويمكن كل فئة لديها طريقة public static void main()، لذلك فمن الممكن تماما أن يكون أكثر من واحد.

ولكن الآن، دعونا نفكر في ذلك من خلال القانون 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

والنقطة هنا يكون أن تحصل على كل شيء من البيئة التي يمكن، ثم استدعاء الوظيفة الرئيسية ()؛ يمكنك التقاط كافة الاستثناءات uncaught وتفعل شيئا ذكي معهم قبل أن يموت البرنامج.

وأعتقد أن الأسلوب الرئيسي ينبغي أن يوضح ما يقوم به البرنامج في بدء التشغيل. لذلك يمكن أن نسميه initialzing الطرق، ولكن يجب أن يكون استخراج منطق في الأساليب.

في المثال الخاص بك، وأنا لن إنشاء أسلوب الرئيسية ()، ولكن وضعه في الاصل واحد.

وتصميم البرنامج سيقرر شكل بك "الرئيسي".

وجود "القاعدة" التي تقول كيف ينبغي أن تكون المهمة الرئيسية الخاصة بك، هو - IMHO - وهو عدم الشعور.

وتذكر أنه إذا كان هناك من يريد للحصول على فكرة عن كيفية عمل البرنامج، في المقام الأول أنها سوف ربما ننظر في الرئيسية (على الأقل أود). لذلك، لا أعتقد أنها فكرة جيدة لوضع قليلا كما هو الحال في ذلك قدر الإمكان. ولكن أود أن أقول لوضع أقل قدر ضروري للحصول على وجهة نظر الطيور العين لكيفية عمل البرنامج.

وهكذا، وأنا أعتقد أن لديك واحد أكثر ما يثير القلق في تنفيذ المهمة الرئيسية يجب أن تكون القراءة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top