传递参数的最佳实践,它可以接受两个值

本文关键字:两个 参数 最佳 | 更新日期: 2023-09-27 18:02:01

如何写得更好?

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"answers"End"部分很短,我不想把Foo分成几个方法。

传递参数的最佳实践,它可以接受两个值

如何:

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]
    }    
    ...
}

具有单一职责的方法更容易阅读、理解和维护。

这取决于情况和你的方法。例如,YAGNI表示您将不需要枚举,因此不妨坚持使用bool。但话说回来,如果你知道你会需要它,或者你认为你可能需要它,那么第二种方法可能是可行的。或者,如果你想要更有表现力的东西,我更喜欢第二种方式,因为它让调用者很明显地看到正在设置什么;true/false不像MyEnum那样具有描述性。

我不确定什么是最好的,这将取决于许多因素,但使用enum代替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);

我的经验法则是,当我遇到这种情况时,花几分钟时间,认真考虑是否可以在未来的场景或版本中为第三种情况(需要枚举或全新的类型)做出解释。如果我想不出第三种情况,我总是使用bool,因为它们更容易测试。

我总是用事物积极的一面命名,并以"to be"的形式开始属性名…如"IsActive"或"HasChildren"

这个怎么样↓

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");
    }
}