传递参数的最佳实践,可以采用两个值

时间:2011-07-12 04:03:52

标签: c# .net coding-style

如何更好地写作?

public void Foo(bool isStart) {
   // Code [Common]
   if (is Start) {
      // Code [Start]
   } else {
      // Code [End]
   }
   // Code [Common]
}

public enum MyEnum {
   Start, End
}
public void Foo(MyEnum param) {
   // Code [Common]
   switch (param) {
      case MyEnum.Start:
         // Code [Start]
         break;
      case MyEnum.End:
         // Code [End]
         break;
   }
   // Code [Common]
}

更新:我正在寻找一个小解决方案。 “Common”,“Start”和“End”部分非常短,我不想将Foo分成几种方法。

5 个答案:

答案 0 :(得分:9)

怎么样:

public class Foo
{
    public void Start()
    {
        PreCommon();

        // Code [Start]

        PostCommon();
    }

    public void Stop()
    {
        PreCommon();

        // Code [Stop]

        PostCommon();
    }

    private void PreCommon()
    {
        // Code [Pre-Common]
    }  

    private void PostCommon()
    {
        // Code [Post-Common]
    }    
    ...

}

具有单一职责的方法更易于阅读,更易于理解且更易于维护。

答案 1 :(得分:1)

这取决于具体情况和方法。例如YAGNI说你不需要枚举,所以不妨坚持使用bool。但如果你知道自己需要它,或者想你可能,那么可能第二个就是要走的路。或者,真的,如果你想要更具表现力的东西,我更喜欢第二种方式更好,因为它使调用者明白了所设置的内容; true / false与MyEnum.Start和MyEnum.Stop几乎没有描述性。

答案 2 :(得分:1)

我不确定什么是最好的,这将取决于许多因素,但是使用枚举代替bool就像你在这里做的那样是不可行的。

这是另一种选择。如果您有两个以上的代码可以使用(如果这是您的枚举点),则效果很好。

public void Foo(Action unique)
{
   // Code [Common]
   unique();
   // Code [Common]
}

private void StartCode()
{
    // Code [Start]
}

private void EndCode()
{
    // Code [End]
}

// call it
Foo(StartCode);

答案 3 :(得分:1)

我的经验法则是在我遇到这种情况时花几分钟时间,并且真的考虑我是否可以在未来的场景或第三种情况的版本中进行辩护(需要枚举或全新类型)。如果我不能想到第三种情况,我总是选择bool,因为它们更容易测试。

我总是在事物的积极方面命名并以“要成为”的形式开始属性名称...例如“IsActive”或“HasChildren”

答案 4 :(得分:1)

这个怎么样↓

abstract class FooBase
{
    public abstract void DoSomthingBegin();
    public abstract void DoSomthingEnd();

    public void Foo()
    {
        // Code [Common]
        DoSomthingBegin();
        DoSomthingEnd();
        // Code [Common]
    }
}

class FooBegin : FooBase
{
    public override void DoSomthingBegin()
    {
        Console.WriteLine("OnBegin");
    }
}

class FooEnd : FooBase
{
    public override void DoSomthingBegin()
    {
        Console.WriteLine("OnEnd");
    }
}