【问题标题】:What's a good naming convention for methods that take conditional action?对于采取条件操作的方法,什么是好的命名约定?
【发布时间】:2010-07-01 17:36:36
【问题描述】:

假设我有一个方法,Foo()。只有某些时候Foo() 是合适的,由ShouldFooNow() 方法确定。但是,有很多时候程序必须考虑此时Foo() 是否合适。所以不要写:

if ShouldFooNow():
   Foo()

到处,我只是把它变成一个函数:

def __name():
    if ShouldFooNow():
       Foo()

这个方法的好名字是什么?我很难想出一个好的约定。 IfNecessaryFoo() 很尴尬,特别是如果 Foo() 的名称较长。 DoFooIfShould()?更尴尬。

什么是更好的名字风格?

【问题讨论】:

    标签: language-agnostic naming-conventions


    【解决方案1】:

    我认为你很接近。将操作/意图放在方法名称的开头,以便于字母搜索。如果我写这样的东西,我会考虑

    FooIfNecessary()
    FooIfRequired()
    

    比如说,

    ElevatePermissionsIfNecessary()
    

    【讨论】:

      【解决方案2】:

      你可以使用EnsureFoo()

      例如,EnsurePermissions() 方法将在需要时采取适当的措施。如果权限已经正确,则该方法不会执行任何操作。

      【讨论】:

        【解决方案3】:

        我最近开始使用约定:

        FooIf(args, bool);
        

        其中 args 是该方法采用的任何参数,而 bool 期望一个布尔值或某种解析为布尔值的 Func。然后,在该方法中,我检查布尔并运行逻辑。将此类断言保留在一行中,对我来说看起来很干净。

        我的 C# 代码中用于记录的示例:

        public void WarnIf<T>(T value, string message, Func<T, bool> isTrue)
        {
          if (isTrue(value)) _log.Warn(message);
        }
        

        然后我会这样称呼它:

        WarnIf(someObject, "This is a warning message to be logged.", s => s.SomeCondition == true);
        

        (那个调用者可能不正确,但你明白了……我现在没有代码。)

        【讨论】:

        • 你真的会这样称呼WarnIf()? 第一个参数在哪里?
        • 已编辑。我匆忙错过了那个。太习惯了我整天写的扩展方法:)
        • 你不需要== true
        【解决方案4】:

        Michael Petrotta 的答案(IfNecessaryIfRequired 后缀)很好,但我更喜欢更短的选择:IfNeeded

        ElevatePermissionsIfNeeded()
        

        如果您想要更短的内容,我会考虑使用 MayMight 之类的前缀:

        MayElevatePermissions()
        MightElevatePermissions()
        

        【讨论】:

        • 前缀方式的问题是方法名通常是明确表示动作的动词,但在这种情况下,听起来好像我们在表示副作用;所以我知道MayElevatePermissions 可能会提升权限,但这是主要操作,还是只是副作用?或者它也可能听起来像一个带有bool 返回类型的问题,它实际上并不执行操作,就像Can-Is- 等一样。
        【解决方案5】:

        我看不出原始代码有什么问题:

        if shouldFoo():
          Foo();
        

        恕我直言,非常清楚。

        不仅如此,它还清楚地区分了决定执行操作与操作本身的关注点。

        类似问题的另一种选择是避免使用后缀的方法略有不同:

        https://softwareengineering.stackexchange.com/a/161754/262009

        【讨论】:

          猜你喜欢
          • 2016-12-12
          • 2022-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-06
          相关资源
          最近更新 更多