gpt4 book ai didi

c# - Switch 语句的使用和验证的最佳方式

转载 作者:太空宇宙 更新时间:2023-11-03 21:39:35 25 4
gpt4 key购买 nike

我遇到这样一种情况,我有 2 个可能的类,每个类都继承了相同的东西,除了一个类继承了 1 个以上的结构。

类似于:

Class A:    
Race
Name
Sex
Age
Location
Status
ValStat

Class B:
Race
Name
Sex
Age
Location
Status
ValStat
Nationality

A 和 B 都继承了 Race、Name、Age、Sex、Status、Location 和 ValStat。 B正在定义国籍

现在我有一个基于 A 类或 B 类对象的验证检查,我将它基于一个枚举,这意味着我有 A 类与本地相关联,B 类与国际相关联,并且它基于位置。

因此,在验证时,如果我检查枚举并且它是本地的,那么我将运行本地验证检查,如果是国际性的,那么我将它作为验证的基础。在某些验证中,它们与年龄或性别相同。这意味着无论是本地的还是国际的,它们仍然经过验证。

现在,我有 switch 语句。

因此,我检查了开关中的状态,然后检查了枚举,然后对枚举进行了验证。

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;

}

现在,从可读性的角度来看,我不认为它有那么糟糕,但从维护/更新的角度来看,如果我必须在公共(public)验证中添加一些东西,我需要在 2 个地方进行。或者,如果我需要更改 ValStat 的更新,那么我需要在 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();

可能值得分解验证代码来帮助 SRPit 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();
}
}

然后,您还可以抽象出验证中的差异。

关于c# - Switch 语句的使用和验证的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20021334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com