传递参数的最佳实践,它可以接受两个值
本文关键字:两个 参数 最佳 | 更新日期: 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");
}
}