什么进入主要功能?

Wol*_*tan 20 c++ program-entry-point coding-style

我正在寻找使用c ++进入程序主要功能的最佳实践技巧.目前我认为有两种方法可行.(尽管这些方法的"边缘"可以任意地彼此接近)

1:编写一个"Master"类,接收传递给main函数的参数并处理"Master"类中的完整程序(当然你也使用其他类).因此,主要功能将减少到最小的线.

#include "MasterClass.h"
int main(int args, char* argv[])
{
MasterClass MC(args, argv);
}
Run Code Online (Sandbox Code Playgroud)

2:在主函数中编写"完整"程序,当然利用用户定义的对象!但是,还涉及全局功能,主要功能可能会有所增加.

我正在寻找一些关于如何用c ++编写程序主要功能的一般指导原则.我通过尝试为第一种方法编写一些单元测试来遇到这个问题,这有点困难,因为大多数方法都是私有的.

jal*_*alf 23

为什么你会有一个大师班?它的单一责任范围是什么?

"主人"或"应用程序"类往往会变成一个大块,可以做太多不同的事情.最终,重点是什么?它给你带来了什么?

为什么不使用main函数来提供这个主要功能?定义高级应用程序生命周期main.它需要一些命令行参数并解析它们(最好通过将其委托给另一个函数或类),然后它调用一些设置功能,然后它可能会进行某种主循环,然后再进行一些清理.总而言之,这可能会给你一个大概10-15行的主要功能,但可能不会超过这个.它应该尽可能地委托给其他类和函数.所以main它本身保持简短和甜美,但仍然有目的.

将这种超高级流量放入其中main意味着它很容易找到,因为main无论如何都是你的起点.如果您想了解代码,那么您将开始寻找它.因此,在尝试理解代码时,读者想要了解的内容.

当然,你可以把所有这些都放在一个"主要课堂"中,除了满足所有那些觉得"一切都必须在课堂上"的Java-luddites之外你什么都没有获得.


Pét*_*rök 7

您正在描述两种"极端"方法,这些方法对我来说都不合适.既没有单一的上帝阶级,也没有单一的上帝功能是实施任何旨在实际使用的重要程序的正确方法.

MasterClass在你的内部进行一次调用是可以的main()(尽管我更喜欢分区功能,例如main(),在MasterClass命令行参数的细节中进行任何特定于命令行的处理).但是,如果该类很难进行单元测试,则表明存在设计问题,通常解决方案是将部分或全部可测试功能委托给其他类,通过公共接口可以轻松地对其进行单元测试. .

您的第二种方法可能再次成为单元测试的问题,因此您应该努力从中提取方法(然后最好将它们移动到单独的类中)以使细粒度单元测试成为可能.

因此,您想要的最佳位置介于两个极端之间,受到使您的代码可测试的要求的限制.

值得思考如何一般地构建程序,而不仅仅是在上下文中main().基本思想是将其划分为"块"(类和方法)

  • 足够小,易于理解,测试和维护,
  • 逻辑上有凝聚力.

  • @DeadMG,当然.但引用OP:*"为第一种方法编写一些单元测试[...]有点困难,因为大多数方法都是私有的."*.我这样解释他的"大师"课程是上帝阶级,而不是任何地方. (3认同)
  • 我不同意.必须有一个切入点 - 无论是上帝功能还是上帝阶级,必须至少有一个. (2认同)