数据验证在Getter / Setter或其他地方?

我想知道在 getterssetters 或代码中的其他位置进行验证是个好主意。

这可能会让你感到惊讶,当谈到优化加快代码时,我认为你不应该在getter和setter中进行验证,而是在代码中更新您的文件或数据库。我错了吗?

0
额外 编辑
意见: 4

8 答案

那么,为什么类通常包含私有成员与公共getter / setter的原因之一就是他们可以验证数据。

如果你的数字大于1到100之间的数字,我肯定会在setter中加入一些验证它的东西,然后抛出一个被代码捕获的异常。原因很简单:如果你不在setter中执行它,你必须记住每次设置它时1到100个限制,这会导致代码重复,或者当你忘记它时,会导致无效状态。

至于表演,我和Knuth在这里:

“我们应该忘记小效率,大约97%的时间:过早优化是万恶之源。”
0
额外

@Terrapin,重新:

如果你只有一堆[简单   公共设置/获取]属性......他们   也可能是字段

属性相对于字段具有其他优点。它们是一个更明确的合同,它们是序列化的,可以稍后调试,它们是通过继承进行扩展的好地方。笨重的语法是一个意外的复杂性 - 例如.net 3.5克服了这一点。

一个常见的(也是有缺陷的)做法是从公共领域开始,然后根据需要将它们变成属性。这会破坏你的任何消费你的课程的合同,所以最好从属性开始。

0
额外

验证方法中应该从获取者或设置者中单独获取验证。这样如果验证需要跨多个组件重用,它是可用的。

当调用者被调用时,应该利用这种验证服务来消除对象中的输入。这样你就知道存储在一个对象中的所有信息在任何时候都是有效的。

您不需要对getter进行任何验证,因为对象上的信息已被信任为有效。

数据库更新之前不要保存您的验证!最好快速失败

0
额外
你能详细说明一下吗?你是否想要在单独的验证方法中检查<5 &&> 0?那么你的获得者和制定者究竟做了什么,以至于一个普通的领域没有?
额外 作者 Boris Callens,

从拥有最易维护的代码的角度来看,我认为您应该尽可能多地在属性的设置者中进行验证。这样你就不会缓存或处理无效数据。

毕竟,这是属性的意义。如果你拥有的只是一堆属性...

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

......他们也可能是田野

0
额外

这取决于。

通常,代码应该快速失败。如果该值可以通过代码中的多个点进行设置,并且仅在检索值后进行验证,则该错误似乎位于执行更新的代码中。如果设置者验证输入,则知道代码尝试设置无效值。

0
额外

我试图永远不让我的对象进入无效状态,所以制定者肯定会进行验证以及改变状态的任何方法。这样,我就不必担心我处理的对象是无效的。如果您将方法保留为验证边界,那么您不必担心验证框架和IsValid()方法调用遍布整个地方。

0
额外

我想实现 IDataErrorInfo的,并把我的验证逻辑在它的Error和这个[columnName]属性中。这样,如果您想以编程方式检查是否有错误,您可以简单地在代码中测试这些属性中的任何一个,或者可以将验证交给Web窗体,Windows窗体或WPF中的数据绑定。

WPF的“ValidatesOnDataError”绑定属性使得这非常简单。

0
额外

您可能想查看Eric Evans的域驱动设计。 DDD有这样一个规范的概念:

...显式谓词式的VALUE   专门用途的对象。一个   SPECIFICATION是一个谓词   确定一个对象是否做   不符合一些标准。

我认为快速失败是一回事,另一个是保持验证逻辑的地方。该域是保持逻辑的正确位置,我认为您的Domain对象上的规范对象或验证方法将是一个好地方。

0
额外