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

样式问题:是否在函数中或函数周围阻塞?

  •  3
  • GSto  · 技术社区  · 14 年前

    假设我有一个函数,它应该只在某个常量被定义时执行。以下哪一项更好

    if(defined('FOO_BAR_ENABLED')) {
       foobar();
    }
    

    我认为这样做的目的更加明确,但是每次调用函数时都需要检查常量。

    function foobar() {
      if(!defined('FOO_BAR_ENABLED')) {
        return;
      }
      //do stuff 
    }
    

    这种方法需要更少的代码行,常量一定会被检查。然而,当这个函数实际上什么都没做的时候,我发现看到对它的调用很混乱。思想?

    6 回复  |  直到 13 年前
        1
  •  10
  •   Community gkalpak    7 年前

    我可以建议将函数重命名为FoobarIfEnabled(),然后检查函数吗?

    从一个伟大的语言不可知论者那里大量窃取 answer to one of my own questions ,编程时,我们有以下问题:

    1. 纠正错误。
    2. 说清楚。
    3. 要简洁。
    4. 快点。。。按这个顺序。

    如果在函数外部执行检查,则可能会在某个位置丢失它。如果你想改变它的行为,你就必须找到它被调用的所有地方并修复它。这是一个违反原则1的维护噩梦。通过在名称中添加“IfEnabled”或类似的内容,现在它不仅是正确的,而且是清楚的。你怎么能打败它?

    不必担心性能,除非最终速度不令人满意,并且您已经确定这是瓶颈(不太可能)。

    我建议你按照上面的链接阅读,因为这是一个非常有用的答案,给了我很多思考。

        2
  •  2
  •   Steve Jessop    14 年前

    方案3:

    void maybe_foobar() {
       if(defined('FOO_BAR_ENABLED')) really_foobar();
    }
    
    void really_foobar() {
        // do stuff
    }
    

    do_stuff_if_possible 而不是 foobar 福巴 引起了人们对调用它是否意味着做任何事情的困惑)。如果“dostuff”总是有效的,但是有些用户只是碰巧有条件地这样做,那么我会选择我的选项3。

    [编辑:这里是选项4,我怀疑是过度工程,但你永远不知道:

    void if_enabled(string str, function f) {
        if (defined(str + '_ENABLED')) f();
    }
    

    然后你可以用:

    if_enabled('FOO_BAR', foobar);
    

    if_enabled .]

        3
  •  1
  •   Thanatos    14 年前

    你的身体状况如何 if 是否属于职能部门的职责范围?是否有在没有 ?

    如果总是需要检查条件,我会把它放在函数中。在这里遵循干燥的原则:不要重复你自己。另一个可能有用的妙语是SRP——单一责任原则——做一件事,并把它做好。

        4
  •  1
  •   supercat    14 年前

    在头文件中,如果foobar总是使用相同数量的参数,

    #ifdef ENABLE_FOOBAR
    #define maybe_foobar(x) foobar(x)
    #else
    #define maybe_foobar(x)
    #endif
    

    如果FooBar可以接受可变数量的参数,不知道如何在C++或更大的C语言中实现。

    (刚刚注意到语言不可知标记。好吧,上面的技术就是我建议的在它工作的语言中使用的技术;对于有这些功能但没有宏的语言,可以使用内联函数)。

        5
  •  0
  •   Bernard    14 年前

    选项2,减少代码,并确保如您所建议的那样定义常量。

        6
  •  0
  •   David Z    14 年前

    因为这显然只用于foobar()函数,所以选项2应该是您的选择。这意味着测试只在一个地方进行,而且您的代码更具可读性。