主方法的Java习惯

主方法的Java习惯,java,Java,我主要为个人使用编写代码,但我正在考虑发布一个最初为个人使用而开发的应用程序(科学模拟/可视化) 我的习惯之一是在类中使用main方法来单独测试类的操作。我认为这在某种程度上可能是不好的(毫无疑问,来自自学和科学发展环境的各种其他习惯也是如此)。然而,我注意到自用的东西从来都不是问题 请大家确认(或否认)电源扩散是向科学界发布的应用程序的一个问题(来源也将是开放的),如果是,原因是什么 编辑:相对于提供的一些答案,扮演魔鬼代言人(好吧,我的代言人):部分“应用程序使用”预计是非开发人员(典型的科

我主要为个人使用编写代码,但我正在考虑发布一个最初为个人使用而开发的应用程序(科学模拟/可视化)

我的习惯之一是在类中使用main方法来单独测试类的操作。我认为这在某种程度上可能是不好的(毫无疑问,来自自学和科学发展环境的各种其他习惯也是如此)。然而,我注意到自用的东西从来都不是问题

请大家确认(或否认)电源扩散是向科学界发布的应用程序的一个问题(来源也将是开放的),如果是,原因是什么

编辑:相对于提供的一些答案,扮演魔鬼代言人(好吧,我的代言人):部分“应用程序使用”预计是非开发人员(典型的科学家)在小规模上修改源代码。我知道在接收端,将一个类的测试直接构建到该类中对我来说是非常简单的,可以进行相应的识别和修改(特别是如果类的情况始终如此)。考虑到受众,使用JUnit之类的工具会提供类似的实用程序吗


接受决定:我认为克莱的回答是彻底和简洁的最佳平衡,所以我选择了它,但我认为比尔的讨论评论也很有帮助。我也不明白为什么Johannes的答案被否决了——“这件作品是如何工作的”这一观点对科学界的程序员来说非常重要,而其他答案指出了为什么分离单元测试可能比我目前的习惯更有用的各种原因,但它们并没有真正解决这个问题,因此,他的回答绝非“无益”。感谢所有当前(和未来)的回复者,希望有一种方法可以将多个回复组合为正确答案

用自己的主方法测试类是不好的,因为它给了类额外的责任(测试自己)。测试应该在单独的类中进行,最好使用类似的测试库


干线的扩散(我喜欢你创造的这个短语)当开发人员第一次接近应用程序时,发现应用程序的入口点会让他们更加困惑。

您需要使用JUNIT之类的测试工具对类执行测试,而不是将测试代码插入到生产代码中


这将测试与代码清晰地分开

这并不可怕,但出于两个原因不建议这样做:

  • 它可能允许用户做你不想让他们做的事情,或者至少让他们觉得他们可以做你宁愿他们不做的事情;及
  • 大量的main()方法通常不能很好地替代单元测试

  • (2)你应该真正集中精力。

    首先,编写测试非常好。我真的不喜欢在一个项目的很多类中有一个main方法。我主张将测试代码移出并使用测试框架。这可以保持源代码的整洁,如果您对测试类使用一致的命名方法,那么也很容易找到相关的测试。

    这种方法本身没有错,但有一个主要缺点:您必须单独调用每个
    main()
    方法来测试所有代码。很可能你不会。只是太模糊了。此外,在执行此操作时,您必须知道哪些
    main()
    方法是真正的入口点,哪些是测试。这一点都不明显


    使用JUnit和类似工具,您可以将代码标记为“这是一个测试”。这允许该工具自动查找项目中的所有测试,并一次运行所有测试。通过这种方式,大部分时间运行所有测试的可能性更高,而且bug很早就被发现。

    JUnit让您可以进行测试,就像您的电源一样,但是:

    • 一个main通常只有一个方法,它可以得到真正的大;如果提取仅用于测试的小方法,则在常规代码中使用该方法存在风险
    • 不会让类本身与测试方法混杂在一起,它们位于不同的类中
    • 允许在测试类中进行继承(main作为一个静态方法,不可能继承或重用);通常,实际测试之前的设置可能相当长,并且自然地重用它是很好的
    • main没有结果(成功或失败),只有输出;您需要手动检查输出以确定结果,并可能理解它
    • 允许一次执行多个测试(类、包、项目、全部),这是回归测试所需的(或者您将花一下午时间逐个执行)
    • JUnit提供了许多开箱即用的附加功能,比如将一些测试标记为忽略,检查测试是否过长,提供几个启动UI等等
    • 您可以在每个实现或子类上重用一些测试(例如:检查Liskov替换),这允许您在不维护大量测试代码的情况下进行大量测试

      • 我也不会在所有类中使用main方法进行测试。首先,遵循关注点分离规则(使用和测试是不同的关注点),因为我们有优雅的测试解决方案

        其次,到目前为止还没有提到,如果每个类都有一个main方法,那么很难找到进入应用程序的真正入口点。如果我看到一个类有一个main方法,我希望这会让我以其预期的方式“使用”该类。我不期望,这将开始一个测试用例(可能有严重的副作用)

        啊,我想到的只是第三个方面:主要的方法是alw