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

函数命名:actionifCondition())

  •  2
  • dbkk  · 技术社区  · 15 年前

    我经常需要使用一个执行的函数,而操作x是条件y的集合。命名这样一个函数的最佳方法是什么?

    我不想重复 如果 声明,因为它们可能很复杂。

    例如,如果要在设置了属性的情况下修剪字符串,可以将函数命名为:

    • void trimifoptionset(字符串) --太笨拙了,尤其是在条件复杂的情况下
    • bool trytrim(字符串) --没有提到外部条件,我希望它只考虑到参数。
    • void conditionaltrim(字符串) --比特冗长

    在c/.net或任何类似的语言中,是否有针对这种情况的约定?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Anirvan    15 年前

    考虑到这些限制,我会选择 TrimIfOptionSet TrimIfNeeded .

    • TryTrim 感觉会的 总是 执行修剪操作(在 try 块),这与仅在需要时运行它不同
    • ConditionalTrim 太长了——读者的眼睛停留在“有条件”上,永远不会“修剪”
        2
  •  4
  •   Greg D    15 年前

    尝试以下方法:

    if(IsComplexCondition(complexData))
    {
        DoThing(otherData);
    }
    

    一般来说,您不希望将条件与操作结合在一起,因为您正在使单个函数捕获过多的语义信息。它是“做不止一件事”。相反,如果您有一个复杂的条件,请将该条件捕获到一个函数中来封装它。

    如果您所指的是更常见的情况,例如函数顶部的参数验证,请考虑 fluent parameter validation . 如果您没有进行参数验证之类的工作,那么我可能会问为什么它在每个函数的顶部,而不是在公共位置捕获,或者在系统边界执行一次。

    我认为没有一个好的答案来命名将军 ActionIfSomething() 因为它通常不是解决问题的好方法。我可能会说进行函数调用 Action() 并记录下来,也许在 <remarks> ,仅在 Something 是真的。如果 Action 属于函数中的条件,那么它只在该条件的上下文中有意义,因此在函数名中重新指定它是多余的。

        3
  •  2
  •   Scott Jackson    15 年前

    这可以通过使用访问器来解决吗?

    public class MyObject
    {
         private string _content = string.Empty;
    
         public bool Trim { get; set; }
    
         public string Content
         {
              get
              {
                   return this.Trim ? _content.Trim() : _content;
              }
              internal set
              {
                   if (string.IsNullOrEmpty(value))
                        _content = string.Empty; 
                   else
                        _content = value;
              }
         }
    }
    

    每当访问内容时,这将执行由Trim Boolean确定的操作。我已经保护了set访问器,因为当trim为true时设置内容值,并检查试图将内容设置为空的特殊情况时,可能会有点含糊不清。良好的文件应涵盖这些情况。