【发布时间】:2014-03-27 04:51:16
【问题描述】:
我想重构以下代码以避免 if...else 这样我就不必在每次进入新的调查类型时都更改方法(打开/关闭原则)。以下是我正在考虑重构的一段代码:
if (surveyType == SurveySubType.Anonymous)
{
DoSomething(param1, param2, param3);
}
else if (surveyType == SurveySubType.Invitational)
{
DoSomething(param1);
}
else if (surveyType == SurveySubType.ReturnLater)
{
DoSomething(param1);
}
为了解决这个问题,我添加了以下类:
public abstract class BaseSurvey
{
public string BuildSurveyTitle()
{
...doing something here
}
public abstract void DoSomething(int? param1,int? param2,int? param3);
}
public class InvitationalSurvey: BaseSurvey
{
public override void DoSomething(int? param1,int? param2,int? param3)
{
//I don't need param2 and param3 here
}
}
public class ReturnLaterSurvey: BaseSurvey
{
public override void DoSomething(int? param1,int? param2,int? param3)
{
//I don't need param2 and param3 here
}
}
public class AnonymousSurvey: BaseSurvey
{
public override void DoSomething(int? param1,int? param2,int? param3)
{
//I need param2 and param3 here
//do something
}
}
这就是我的代码的最终结果:
var survey = SurveyFactory.Create();
survey.DoSomething(param1,param2,param3);
我的问题是如何避免将 param2 和 param3 传递给 InvitationalSurvey 和 ReturnLaterSurvey 类?
【问题讨论】:
-
我能想到的最好的方法就是为参数添加一个类似的类结构......换句话说,制作一个类似于 BaseSurveyArguments 基类的东西并根据需要扩展它。不过不是很优雅。
-
看到这个我很高兴 Delphi 有
case开关。 C#中没有这样的替代方案吗? -
C#确实有case语句,switch语句也在 this question 中提到。尽管我自己还没有体验过,但可能有一些巧妙的方法可以使用委托或实体引用使其更加时尚。 -
我也认为
switch加上默认参数是一种解决方案。在 Python 中,您可以为所有参数分配默认值并提供更新参数的列表。另一个问题是,是否应该只有一个DoSomething方法。为什么不使用ProcessLateSurvey、ProcessAnonSurvey等方法? -
这个问题似乎是题外话,因为它是关于CodeReview。
标签: c# oop solid-principles open-closed-principle