我自己和一位同事对于以下哪一个更优雅存在争议。我不会说谁是谁,所以这是公正的。哪个更优雅?

public function set hitZone(target:DisplayObject):void
        {
            if(_hitZone != target)
            {
                _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
                _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
                _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

                _hitZone = target;

                _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
                _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
                _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);
            }
        }

...或者...

public function set hitZone(target:DisplayObject):void
        {
            if(_hitZone == target)return;

            _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
            _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
            _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

            _hitZone = target;

            _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
            _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
            _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);

        }
有帮助吗?

解决方案

这是的那些情况下,它的确定打破规则(即最佳做法)之一。一般来说,你想有作为函数尽可能少返回点。这样做的实际原因是,它简化了代码的阅读,因为你可以总是假设每个函数将其参数,尽自己的逻辑,并返回其结果。额外的收益将用于各种情况趋于复杂的逻辑,增加阅读和充分神交代码所需的时间量。一旦你的代码达到维护阶段那么多的回报可以有新的程序员生产力产生巨大的影响,因为他们试图破译逻辑(其特别不好发表评论时,稀疏和代码不清楚)。问题相对于所述功能的长度呈指数增长。

那么,为什么在这种情况下,每个人都喜欢选择2?这是因为你正在设置该功能通过验证输入的数据,或者可能需要检查的其他不变量强制执行的合同。构建验证的最漂亮的语法是检查每一个条件,如果条件不满足有效性立即返回。这样,你没有通过所有的检查,以保持某种的isValid布尔的。

要总结的东西了:我们真的正在研究如何编写验证代码,而不是一般的逻辑;选项2是用于验证代码更好。

其他提示

在大多数情况下,提前返回会降低复杂性并使代码更具可读性。

这也是应用的技术之一 斯巴达式编程:

最少使用控制

  1. 通过使用专用来最小化条件的使用。 构建这种 ternarization, 继承,以及类,例如 Class 默认值、Class Once 和 Class 分隔符
  2. 使用 Early 简化条件 return.
  3. 通过使用操作应用器,最大限度地减少循环结构的使用 类,例如 Class Separate 和 类 FileSystemVisitor。
  4. 通过提前退出来简化迭代逻辑(通过 return, continuebreak 声明)。

在您的示例中,我会选择选项 2,因为它使代码更具可读性。我在检查函数参数时使用相同的技术。

只要早回报被组织为在函数/方法本体的顶部的块,那么我认为它们比加入嵌套的另一层更具有可读性。

我尽量避免在所述主体的所述中间早期的回报。有时他们是最好的方式,但大部分时间我认为他们变得复杂。

另外,作为一般规则,我试图最小化嵌套控制结构。很明显,你可以利用这个太远,所以你必须使用一些自由裁量权。转换嵌套如果对单个开关/箱表现得更加明显对我来说,即使谓语重复某些子表达式(假设这不是太愚蠢做子表达式消除语言性能关键循环)。尤其我不喜欢嵌套IFS的组合在长功能/方法体,因为,如果你跳进你因为某些原因最终向上滚动代码的中间和向下精神上重建一个给定的线的情况下。

在我的经验,在一个项目中使用早期的回报问题是,如果其他的项目不使用他们,他们也不会去找他们。所以早期的回报或没有 - 如果涉及多个程序员,确保每个人至少知道他们的存在。

我亲自写代码,只要它可以返回,因为经常推迟返回引入了额外的复杂性如争取安全退出一堆嵌套循环和条件。

所以,当我看到一个陌生的功能,我做的第一件事就是寻找一切returns。真正帮助有设置你的语法着色给return从别的不同的颜色。 (我去为红色)。这样一来,returns成为一个有用的工具,用于确定函数做什么,而不是粗心隐藏的绊脚石。

阿监护人。

IMHO,是 - 它的逻辑是更清晰因为返回是显式的和旁边的条件,并且它可以具有相似的结构很好地被分组。这更适用,其中“返回”被替换为“抛出新的异常”。

正如之前所说,早日回归更具可读性,特别是如果一个函数体很长,你可能会发现,在3页功能被错误删除}(本身至极是不是很优雅),并试图编译它可以采取非自动化的调试的几分钟。

这也使得代码更声明,因为这是你的方式将它描述了另一个人,所以可能是一个开发者,就足以一个接近去了解它。

如果功能后增加的复杂性,你有很好的测试,你可以简单地包裹在一个新的功能,每个备选方案,并呼吁他们在分支机构的情况下,这样你十个分量的声明风格。

在这种情况下(一个试验中,没有else子句)我喜欢的测试和回报。这清楚地表明,在这种情况下,有什么可以做,而不必阅读功能的其余部分。

然而,这是分裂最细小的毛发的。我敢肯定,你必须有更大的问题担心:)

选项2更可读的,但是当一个其他可能需要被添加的代码的可管理性将失败。

所以,如果你是肯定的,没有别的去选择2,但如果有可能是一个else条件范围的话,我宁愿选择1

选项1是更好,因为你应该在程序的返回点的最小数量。 还有像

的异常
  if (a) {
    return x;
  }
  return y;

由于语言的作品,但一般最好是有尽可能少出口点,因为它是可行的方式。

我更喜欢以避免在一个函数的开始立即返回,并尽可能把合格的逻辑,以防止进入之前它被调用的方法。当然,这取决于该方法的目的而变化。

然而,我不介意在该方法的中间返回,所提供的方法是短暂的和可读的。在事件的方法是大的,在我看来,它已经不是很可读,所以它要么被重构到多个功能与内嵌的回报,否则我会明确地从控制结构,并在最后一个回破。

我忍不住要关闭它的精确副本,因为我看到一些类似的主题已经包括的反转‘if’语句,以减少嵌套其具有良好的答案。

我会让它活现在... ^ _ ^

要作出这样的回答,我是一个信徒,早期的回报后卫条款比深度嵌套IFS更好。

我已经看到了这两种类型的代码,我更喜欢,因为它是看起来容易阅读和理解对我来说第一个,但我看了很多地方,早期的存在是更好的路要走。

有至少一个其它的替代方案。约是否执行工作的决定分开实际工作的细节。类似如下:

public function setHitZone(target:DisplayObject):void
    {
        if(_hitZone != target)
            setHitZoneUnconditionally(target);

    }

public function setHitZoneUnconditionally(target:DisplayObject):void
    {
        _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
        _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
        _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

        _hitZone = target;

        _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
        _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
        _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);

    }

任何这三个(你的两个加上面的第三个)的是合理的小这个箱子。然而,这将是坏事具有功能数百行长与多个“纾困点”的整个洒。

我已经与我自己的代码,多年来的辩论。我开始生活有利于一个回报,慢慢地已经失效。

在这种情况下,我更喜欢的选项2(一个返程)仅仅因为我们只说如果(),没有其他复杂的代码约7行由包裹。这是更具可读性和功能等。它流动从上到下。你知道你在开始在底部的顶部和结束。

话虽这么说,正如其他人所说,如果有开头或更多的复杂性,或者功能的增长,那么我宁愿选择1更多的警卫:在开始立即返回一个简单的验证

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top