应该对不同代码块的验证进行组合吗?

时间:2016-04-15 00:14:09

标签: c# oop

我在C#类中有一个函数:

class Fun {
    private string waterGun;
    private string jacket;

    void HaveSomeFun(bool summers) {
        waterGun = <Some Value>
        jacket = <Some Other Value>

        validate();
        if(summers) {
            Console.WriteLine("Using {0}", waterGun);
        } else {
            Console.WriteLine("Using {0}", jacket);
        }
    }

    private void validate() {
        ArgumentValidationHelper.ValidateNotNullOrEmpty("WaterGun", this.waterGun);
        ArgumentValidationHelper.ValidateNotNullOrEmpty("Jacket", this.jacket);
    }
}

我正在将变量实例成员用于验证。将变量的范围从方法增加到类只是为了验证是否有意义?

是否还有其他(更好的)方法来实现此功能,其中验证是集中的,并且变量不需要是类成员?

2 个答案:

答案 0 :(得分:0)

首先,我不确定为什么你的成员变量是私有的。那是一个错字吗?如果用户无法更改它们,则无需验证它们。

假设您实际上是公开的,您可以考虑将成员变量转换为Properties并在setter中进行验证。然后您可以抛出错误或将其设置为某个默认值。我更喜欢这种方法,因为它确保您的类始终处于有效状态(假设调用代码合理地处理错误...),而不是每次使用它时都必须调用validate()。

如果你想把它们作为参数,你也可以创建一个帮助类:

class FunArguments {
    private string waterGun;
    public string WaterGun { 
       get { return waterGun; }
       set { 
            //do some validation check here
            waterGun = value;
       }
    }
    // etc..
}

然后你可以通过某种方式传递给Fun。

答案 1 :(得分:0)

根据您的代码验证逻辑已经集中(我希望这是您/某人创建ArgumentValidationHelper类时的全部意图。此外,添加Validate方法只是为了包装这两个验证,我觉得,除非你需要在其中加入其他东西,否则是不必要的。

我觉得,你知道那些类变量不是必需的,是的,它们没有任何意义,因为它们是(A)私有(B)不会通过调用代码来设置。

所以我的代码版本是:

class Fun {
    void HaveSomeFun(bool summers) {
        string waterGun = <Some Value>
        string jacket = <Some Other Value>

        ArgumentValidationHelper.ValidateNotNullOrEmpty("WaterGun", waterGun);
        ArgumentValidationHelper.ValidateNotNullOrEmpty("Jacket", jacket);

        if(summers) {
            Console.WriteLine("Using {0}", waterGun);
        } 
        else {
            Console.WriteLine("Using {0}", jacket);
        }
    }
}