Должен ли основной метод состоять только из создания объекта и вызова метода?

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
Что еще это может сделать?
Pubby

Ответы:

11

Смысл вашего друга в том, что приложение должно быть просто загружено основным методом, и ничего более. Имея метод main в своем собственном классе, вы просто усиливаете этот факт, сохраняя его независимым от любой логики приложения. Роль основного метода состоит в том, чтобы анализировать любые входные данные и инициализировать приложение с этими и, возможно, другими входными данными.

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

Идея в том, что вам не нужен метод main для инициализации Foo. Это позволяет вам легко инициализировать и запускать Fooв другом контексте, возможно, с другой семантикой.

public Foo initSomewhereElse(String arg){
    Foo f = new Foo();
    f.start(arg);
    return f;
}
Джереми Хейлер
источник
7

Метод main () - это простой возврат к процедурному программированию, обеспечивающий точку входа в приложение. Предпринимаются попытки инкапсулировать его на разных языках программирования, но сама его природа делает это трудным (оно должно быть открытым и статичным, но его НИКОГДА не следует вызывать из чего-либо еще в программе, что весьма противоречиво). WPF преуспел (скрыв main () от вас глубоко в недрах проекта приложения WPF и предоставив настраиваемые «зацепки» для пользовательской обработки), как и Java (аналогичным образом для приложений Android), но WinForms и большинство других типов приложения по-прежнему заставляют вас иметь дело с main ().

Итак, большинство экспертов говорят, что LOC функции main () должен быть как можно ниже. Есть один подход (который я считаю немного излишним), в котором функция main () имеет одну строку:

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

Keiths
источник
Я не согласен. Это может быть полезно для вызова mainиз других контекстов, например, рекурсии.
DeadMG
4
Лично, если вы повторяете свой основной метод, я думаю, что вы должны вместо этого вызывать другой метод и повторять его. Только в простейших контекстах (консольное приложение со сложностью / сложностью на уровне домашнего задания) будет допустимо вызывать main () из вашей программы, и я бы назвал это тривиальной ситуацией.
KeithS
1

В тех языках, которые поддерживают функции, mainэто просто обычная функция, и поэтому вы ничего не можете с ней сделать, кроме того, что вы сказали. Кроме того, существуют идиотские языки, которые отбрасывают функции в пользу того, чтобы все было объектом, что означает, что каждый раз, когда вам нужна функция, вы должны обернуть ее ненужным классом .

Ну, хватит болтать. Я пытаюсь подчеркнуть, что на Mainсамом деле это не класс, а функция, поэтому вам не нужно ничего делать, кроме как анализировать входные данные, создавать другие объекты и вызывать другие методы, потому что это все, что может сделать функция.

Pubby
источник