函数命名:ActionIfCondition()

时间:2009-06-30 20:35:55

标签: c# naming-conventions naming

我经常需要使用一个执行的功能,而动作X是设置了条件Y.命名这样一个函数的最佳方法是什么?

我不想重复 if 语句,因为它们可能很复杂。

例如,如果我想在设置属性时修剪字符串,则可以将函数命名为:

  • void TrimIfOptionSet(string) - 太笨重,特别是条件复杂时
  • bool TryTrim(string) - 没有提到外部条件,我希望它只考虑参数。
  • void ConditionalTrim(string) - bit verbose

C#/ .Net或任何类似的语言是否有针对这种情况的约定?

3 个答案:

答案 0 :(得分:4)

尝试类似:

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

您通常不希望将条件与操作耦合,因为您在此时使单个函数捕获过多的语义信息。这是“不止一件事。”相反,如果您有复杂的条件,请在函数中捕获该条件以封装它。

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

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

答案 1 :(得分:2)

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

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布尔值确定的操作。我已经保护了set访问器,因为当Trim为true时设置Content的值时可能会有些不确定,并检查尝试将内容设置为null的特殊情况。好的文件应该涵盖这些案例。

答案 2 :(得分:2)

鉴于有限制,我会选择TrimIfOptionSetTrimIfNeeded

  • TryTrim感觉它总是总是运行修剪操作(在try块中),这与仅在需要时运行它不同
  • ConditionalTrim太长了 - 读者的眼睛保持“有条件”而永远不会“修剪”