我有一种情况,我有2个可能的类,每个继承相同的东西,除了一个类继承1个更多的结构。
类似的东西:
Class A:
Race
Name
Sex
Age
Location
Status
ValStat
Class B:
Race
Name
Sex
Age
Location
Status
ValStat
Nationality
A和B都继承了种族,姓名,年龄,性别,身份,位置和ValStat。 B正在定义国籍
现在我有一个基于A类或B类对象的验证检查,我将它基于Enum,这意味着我有A类与本地和B类相关联,类似国际,它基于位置。
因此,如果我检查枚举并且它是本地的验证,那么我运行本地验证检查,如果是Internional,那么我将其基于验证。在一些验证中,它们与年龄或性别相关。无论是本地还是国际,它们仍然有效。
现在,我有切换语句。
所以我检查交换机中的状态,然后检查枚举,然后执行enum的验证。
switch (Status)
{
case Citizen:
switch (A.Location)
{
case West:
do common validation using the A object
Update the A object ValStat
break;
case East:
do common validation using the B object
do international validation
Update the B object ValStat
break;
}
break;
case Alien:
switch (A.Location)
{
case West:
do alien confirmation using the A object
Update the A object ValStat
break;
case East:
do alien confirmation using the B object
do internation validation
Update the B object ValStat
break;
}
break;
}
现在,从可读性的角度来看,我认为不是那么糟糕,但从维护/更新的角度来看,如果我必须在常见验证中添加一些东西,我需要在2个位置进行。或者,如果我需要更改ValStat的更新,那么我需要在4中完成。
如果有其他或更好的方法来做这样的事情?
答案 0 :(得分:4)
您需要查看strategy pattern。
public abstract class BaseClass
{
//All your properties
public virtual Boolean Validate()
{
//Common Validation code
}
}
public class A : BaseClass
{
public override Boolean Validate()
{
return AValidation || base.Validate();
}
}
//Same for B
用法
BaseClass base = new A or B
base.Validate();
可能值得打破验证码以帮助SRP和it is usually better to prefer composition over inheritance
public abstract class BaseClass
{
readonly Validator _validator;
protected BaseClass(Validator validator){_validator = validator;}
public Boolean Validate()
{
return _validator.Validate();
}
}
然后,您也可以抽象出验证中的差异。