Czy główna metoda powinna składać się tylko z tworzenia obiektów i wywołań metod?

12

Mój przyjaciel powiedział mi, że najlepszą praktyką jest to, że mainmetoda zawierająca klasy powinna być nazwana Maini zawiera tylko mainmetodę. Również mainmetoda powinna analizować dane wejściowe, tworzyć inne obiekty i wywoływać inne metody. MainKlasy i mainmetody nie powinien robić niczego innego. Zasadniczo to, co mówi, że mainmetoda zawierająca klasy powinna wyglądać następująco:

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

Czy to najlepsza praktyka?

użytkownik
źródło
6
Co jeszcze można zrobić?
Pubby

Odpowiedzi:

11

Chodzi o to, że znajomy chce, aby aplikacja była po prostu ładowana przy użyciu głównej metody i nic więcej. Mając główną metodę we własnej klasie, po prostu wzmacniasz ten fakt, utrzymując ją niezależną od logiki aplikacji. Rolą głównej metody byłoby przeanalizowanie dowolnych danych wejściowych i zainicjowanie aplikacji przy użyciu tych i ewentualnie innych danych wejściowych.

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

Chodzi o to, że nie potrzebujesz głównej metody do inicjalizacji Foo. Umożliwia to łatwą inicjalizację i uruchomienie Foow innym kontekście, potencjalnie z inną semantyką.

public Foo initSomewhereElse(String arg){
    Foo f = new Foo();
    f.start(arg);
    return f;
}
Jeremy Heiler
źródło
7

Metoda main () jest brzydkim powrotem do programowania proceduralnego, zapewniając punkt wejścia do aplikacji. Podejmowane są próby w różnych wersjach językowych programowania, ale jego natura utrudnia to (musi być publiczny i statyczny, ale NIGDY nie powinien być wywoływany z niczego innego w programie, co jest wysoce sprzeczne). WPF odniósł sukces (ukrywając przed sobą main () głęboko w trzewiach projektu aplikacji WPF i zapewniając konfigurowalne „haki” do niestandardowego przetwarzania), podobnie jak Java (w podobny sposób dla aplikacji na Androida), ale WinForm i większość innych typów aplikacje wciąż sprawiają, że radzisz sobie z main ().

Tak więc większość ekspertów twierdzi, że LOC funkcji main () powinien być jak najniższy. Istnieje jedno podejście (które moim zdaniem jest nieco przesadzone), w którym funkcja main () ma jedną linię:

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()
   }    
}

To trochę za dużo, ale zgadzam się z podstawową zasadą; main () powinien możliwie jak najmniej, aby doprowadzić obiektową aplikację sterowaną zdarzeniami do stanu „gotowości”.

KeithS
źródło
Nie zgadzam się. Przydatne może być wywoływanie mainz innych kontekstów - na przykład rekurencji.
DeadMG
4
Osobiście, jeśli powracasz swoją główną metodą, myślę, że powinieneś zamiast tego wywoływać inną metodę i powtarzać ją. Tylko w najprostszych kontekstach (aplikacja konsolowa o złożoności / trudności na poziomie domowym) dopuszczalne byłoby wywołanie main () z poziomu programu, a ja nazwałbym to banalną sytuacją.
KeithS
1

W językach, które obsługują funkcje, mainjest to zwykła funkcja, więc nie można nic więcej z tym zrobić poza tym, co powiedziałeś. Są też języki idiotyczne , które porzucają funkcje na rzecz tego, aby wszystko było obiektem, co oznacza, że ​​za każdym razem, gdy potrzebujesz funkcji, musisz zawinąć ją w niepotrzebną klasę .

Cóż, dość wędrowania. Chodzi mi o to, że Maintak naprawdę nie jest to klasa, ale funkcja, więc nie powinieneś nic robić, tylko analizować dane wejściowe, tworzyć inne obiekty i wywoływać inne metody, ponieważ to wszystko, co może zrobić funkcja.

Pubby
źródło