【问题标题】:Best practice - When to evaluate conditionals of function execution最佳实践 - 何时评估函数执行的条件
【发布时间】:2010-06-03 13:10:04
【问题描述】:

如果我有一个从几个地方调用的函数,并且它需要满足某些条件才能执行它所做的任何事情,那么应该在哪里检查该条件?在我的例子中,它用于绘图 - 如果按住鼠标按钮,则执行绘图逻辑(这是在拖动时在鼠标移动处理程序中完成的。)

选项一说把它放在函数中,这样就可以保证被检查。抽象的,如果你愿意的话。

public function Foo() {
    DoThing();
}

private function DoThing() {
    if (!condition) return;
    // do stuff
}

我遇到的问题是,当阅读Foo的代码时,可能与DoThing相差甚远,它看起来像一个错误。第一个想法是条件没有被检查。

那么,选项二是在调用之前进行检查。

public function Foo() {
    if (condition) DoThing();
}

这读起来更好,但现在您必须担心从您调用它的任何地方进行检查。

选项三是将函数重命名为更具描述性。

public function Foo() {
    DoThingOnlyIfCondition();
}

private function DoThingOnlyIfCondition() {
    if (!condition) return;
    // do stuff
}

这是“正确”的解决方案吗?或者这有点太过分了?我觉得如果一切都像这样,函数名称会开始重复它们的代码。

关于这是主观的:当然是这样,而且可能没有正确的答案,但我认为它在这里仍然完美无缺。从比我更好的程序员那里获得建议是第二好的学习方式。主观问题正是 Google 无法回答的。

【问题讨论】:

    标签: language-agnostic coding-style


    【解决方案1】:

    根据 DRY,我会选择第一个。

    public function Foo() {
        DoThing();
    }
    
    private function DoThing() {
        if (!condition) return;
        // do stuff
    }
    

    一旦你习惯了这种模式,在你的代码中看到一个单独的DoThing() 就不会那么令人不安了。你会开始像 EnsureThingDone() 一样阅读它。

    【讨论】:

    • 这回答了结构问题。至于名称,稍加思考应该会产生一个适当描述且不重复的替代方案。可能与DrawOnDrag() 类似DoThing()
    【解决方案2】:

    选项四,将谓词和实际调用包装在第三个函数中。

    function DoThing() {
        // do stuff
    }
    
    function DoThingOnlyIfCondition() {
        if (!condition) return;
        DoThing();
    }
    
    function Foo() {
        DoThingOnlyIfCondition();
    }
    
    // Foo version 2
    function FooBar() {
        DoThing();
    }
    

    现在 Foo 或任何函数都可以使用最合适的 DoXXX() 版本。

    【讨论】:

      【解决方案3】:

      我喜欢检查函数内部的前置条件,

      public function DoThing()
      {
          ValidatePreconditions();
          DoWork();
      }
      
      private function DoWork()
      {
          //Do the actual work;
      }
      

      这样,我可以确定在我的函数执行之前满足所有适当的先决条件,并且消费者无需在每次调用我的函数时添加不必要的代码。

      【讨论】:

        【解决方案4】:

        您可以使用类型系统。使 DoThing 的参数成为一个对象,只有通过了前提条件才能实例化。

        一种简洁的方法是使 DoThing 成为该对象上的实例方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-13
          • 2020-10-28
          相关资源
          最近更新 更多