代码之家  ›  专栏  ›  技术社区  ›  Tesserex

最佳实践-何时评估函数执行的条件

  •  6
  • Tesserex  · 技术社区  · 14 年前

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

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

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

    我有一个问题,那就是在阅读 Foo ,可能离 DoThing 看起来像个虫子。第一个想法是不检查这种情况。

    那么,第二个选项是在呼叫前进行检查。

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

    这读起来更好,但现在你必须担心从任何你称之为它的地方检查。

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

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

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

    关于这是主观的:当然是这样,也许没有一个正确的答案,但我认为这仍然是完美的家在这里。从比我好的程序员那里得到建议是第二个最好的学习方法。主观问题正是谷歌无法回答的问题。

    4 回复  |  直到 14 年前
        1
  •  5
  •   zildjohn01    14 年前

    根据Dry的说法,我会和第一个一起去。

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

    一旦你习惯了这种模式,看到一个孤独的人并不是那么令人不安 DoThing() 在您的代码中。你会开始像读 EnsureThingDone() .

        2
  •  2
  •   Nick Dandoulakis    14 年前

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

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

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

        3
  •  0
  •   mcabral    14 年前

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

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

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

        4
  •  0
  •   regularfry    14 年前

    您可以使用类型系统。使参数为doting对象,该对象只有在传递前提条件时才能实例化。

    要做到这一点,一个简单的方法是在该对象上创建一个实例方法。