是否应组合不同代码块的验证

本文关键字:验证 代码 组合 是否 | 更新日期: 2024-09-16 23:01:56

我的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);
    }
}

我使变量实例成员只是为了验证。将变量的范围从一个方法增加到一个类只是为了验证有意义吗?

如果验证是集中的,并且变量不需要是类成员,那么有没有其他(更好的)方法可以实现这一功能?

是否应组合不同代码块的验证

根据您的代码验证逻辑已经是集中的(我希望这是您/某人创建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);
        }
    }
}

首先,我不确定为什么您的成员变量是私有的。这是打字错误吗?如果用户不能更改它们,那么您就不需要验证它们。

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

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

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

然后您可以通过某种方式将其传递给Fun。