为了账号安全,请及时绑定邮箱和手机立即绑定

为什么一个功能应该只有一个出口点?

为什么一个功能应该只有一个出口点?

红颜莎娜 2019-09-24 10:01:52
我一直都听说过单个出口点函数是一种不好的编码方式,因为这样会降低可读性和效率。我从未听说过有人在争论另一面。我以为这与CS有关,但是这个问题在cstheory stackexchange上被否决了。
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

有不同的思想流派,这在很大程度上取决于个人喜好。

一个是如果只有一个出口点,那么它会减少混乱-您在方法中只有一条路径,并且知道在哪里寻找出口。在不利的一面,如果您使用缩进来表示嵌套,则代码最终将大量缩进到右侧,并且很难遵循所有嵌套作用域。

另一个是您可以检查先决条件并在方法开始时提早退出,这样您就可以在方法主体中知道某些条件是正确的,而整个方法主体都不会向右缩进5英里。通常,这可以最大程度地减少您需要担心的作用域数量,从而使代码易于遵循。

第三点是您可以随心所欲地退出。在过去,这曾经使人更加困惑,但是现在我们有了语法着色的编辑器和编译器可以检测无法访问的代码,因此处理起来要容易得多。

我正好在中间营地。强制执行单个出口点是毫无意义甚至适得其反的限制,恕我直言,尽管整个方法中的随机出口有时会导致混乱的逻辑难以遵循,在逻辑上很难确定给定的代码是否会执行。但是“控制”您的方法可以显着简化方法的主体。


查看完整回答
反对 回复 2019-09-24
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我的一般建议是,在可行的情况下,return语句应位于具有任何副作用的第一个代码之前,或位于具有任何副作用的最后一个代码之后。我会考虑类似:


  if(!argument)//检查是否为非null

    返回ERR_NULL_ARGUMENT;

  ...处理非空参数

  如果(确定)

    返回0;

  其他

    返回ERR_NOT_OK;

比:


  int return_value;

  if(argument)//非null

  {

    ..处理非空参数

    ..适当设置结果

  }

  其他

    结果= ERR_NULL_ARGUMENT;

  返回结果;

如果某个条件会阻止某个功能执行任何操作,那么我宁愿在该功能可以执行任何操作的位置上方的某个位置早点退出该功能。但是,一旦函数执行了带有副作用的操作,我更愿意从最底层开始,以明确必须处理所有的副作用。


查看完整回答
反对 回复 2019-09-24
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

单一入口和出口点是结构化编程与分步Spaghetti编码的原始概念。人们认为,多个出口点函数需要更多代码,因为您必须适当清理分配给变量的内存空间。考虑一种情况,其中函数分配变量(资源),并且过早地退出该函数并且没有适当的清理会导致资源泄漏。另外,在每个出口之前构造清理将创建大量冗余代码。


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 694 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信