Чи повинен основний метод складатися лише із створення об'єктів та викликів методів?


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 досяг успіху (сховавши main () від вас у глибині надр проекту програми WPF та надавши настроювані "гачки" для користувацької обробки), як і Java (аналогічно для програм Android), але WinForms та більшість інших типів додатки все ще змушують вас мати справу з main ().

Отже, більшість експертів стверджує, що 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 () повинен якомога менше переводити об'єктно-орієнтовану, керовану подіями програму, у стан "готового".


Я не погоджуюсь. Це може бути корисно зателефонувати mainз інших контекстів - наприклад, рекурсії.
DeadMG

4
Особисто, якщо ви повторюєте свій основний метод, я думаю, ви повинні замість цього викликати інший метод і повторювати це. Лише в найпростіших контекстах (консольний додаток приблизно складності / складності рівня домашнього завдання) було б прийнятно викликати main () у межах вашої програми, і я би назвав це тривіальною ситуацією.
KeithS

1

У мовах, які підтримують функції, mainє лише звичайною функцією, тому ви не можете зробити з нею іншого, крім того, що ви сказали. А потім є ідіотичні мови, які ровуть на користь того, щоб усе було об’єктом, а це означає, що кожного разу, коли вам потрібна функція, ви повинні перетворити її на непотрібний клас .

Ну, досить брязкальця. Я намагаюся зробити це в тому, що Mainце насправді не клас, а функція, і тому у вас не повинно бути нічого, крім розбору входів, створення інших об'єктів та виклику інших методів, тому що це все, що функція може зробити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.