主方法是否应该仅由对象创建和方法调用组成?


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 2012年

Answers:


11

您的朋友提出的观点是,应用程序仅应由main方法引导,仅此而已。通过将main方法放在自己的类中,您可以通过独立于任何应用程序逻辑来简单地增强该事实。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

主()方法是一个Ñ难看倒退到过程编程,从而提供的入口点中的应用。试图用各种编程语言来封装它,但是它的本质使它变得困难(它必须是公共的和静态的,但是绝不能从程序中的其他任何地方调用它,这是非常矛盾的)。WPF成功地实现了(通过将main()隐藏在WPF应用程序项目的深处,并为自定义处理提供了可配置的“挂钩”),就像Java一样(对于Android应用程序也是如此),但是WinForms和大多数其他类型的应用仍然可以让您处理main()。

因此,大多数专家都说main()函数的LOC应该尽可能低。有一种方法(我认为有些过大),其中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()应该尽可能少地使面向对象的,事件驱动的应用程序进入“就绪”状态。


我不同意。main从其他上下文(例如,递归)中调用可能会很有用。
DeadMG 2012年

4
就个人而言,如果您要重复使用主要方法,我认为您应该改为调用另一个方法并重复执行。仅在最简单的情况下(大约是家庭作业级别的复杂性/难度的控制台应用程序),才可以在程序中调用main(),而我认为这是一种琐碎的情况。
KeithS 2012年

1

在支持功能的语言中,main它只是一个常规功能,因此除了您所说的之外,您无法执行其他任何其他操作。然后,有一些愚蠢的语言抛弃了函数,而将所有东西都当作对象,这意味着每当您想要一个函数时,都必须将其包装在一个不必要的类中

好吧,够乱的。我要说明的是,它Main实际上不是一个类,而是一个函数,因此除了解析输入,创建其他对象和调用其他方法外,您不应该做任何事情,因为这是函数所能做的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.