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

Tes*_*rex 6 language-agnostic coding-style

如果我有一个从几个地方调用的函数,并且它需要满足某些条件来执行它所执行的任何操作,应该在哪里检查该条件?在我的情况下,它是绘图 - 如果按住鼠标按钮,然后执行绘图逻辑(这是在拖动时在鼠标移动处理程序中完成的.)

选项一说将它放在函数中,以确保它被检查.抽象,如果你愿意的话.

public function Foo() {
    DoThing();
}

private function DoThing() {
    if (!condition) return;
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当读取Foo可能远离DoThing它的代码时,它看起来像一个bug.第一个想法是没有检查条件.

然后,选项二是在打电话之前检查.

public function Foo() {
    if (condition) DoThing();
}
Run Code Online (Sandbox Code Playgroud)

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

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

public function Foo() {
    DoThingOnlyIfCondition();
}

private function DoThingOnlyIfCondition() {
    if (!condition) return;
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这是"正确的"解决方案吗?或者这有点太过分了?我觉得如果一切都像这个函数名称将开始复制他们的代码.

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

zil*_*n01 5

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

public function Foo() {
    DoThing();
}

private function DoThing() {
    if (!condition) return;
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

一旦你习惯了这个模式,DoThing()你的代码就会变得不那么令人不安.你会开始像读取它一样阅读它EnsureThingDone().

  • 这回答了结构问题.至于名称,更多的想法应该产生一个适当描述而不是重复的替代方案.对于`DoThing()`来说,也许是'DrawOnDrag()`的静脉. (2认同)