optimization -在Getter/Setter或其他地方进行数据验证?

Translate

我想知道这是否是个好主意验证吸气剂二传手,或代码中的其他位置。

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

嗯,为什么类通常包含带有公共获取者/设置者的私有成员的原因之一,正是因为它们可以验证数据。

如果您的数字大于1到100之间的数字,我肯定会在setter中放入一些内容进行验证,然后可能抛出代码捕获的异常。原因很简单:如果您未在设置器中执行此操作,则每次设置时都必须记住1到100个限制,这将导致重复的代码,或者当您忘记它时,它将导致无效状态。

至于性能,我在这里与Knuth在一起:

“我们应该忘记效率低下的问题,大约有97%的时间是这样:过早的优化是万恶之源。”

来源
Translate

@Terrapin,回复:

如果您只有一堆[简单的公共设置/获取]属性...那么它们可能也是字段

与字段相比,属性还具有其他优势。它们是更明确的协定,已序列化,可以稍后进行调试,它们是通过继承进行扩展的好地方。笨拙的语法是偶然的复杂性,例如.net 3.5克服了这一问题。

一种常见的(且有缺陷的)做法是从公共领域开始,然后在“根据需要”的基础上将它们变成属性。这会破坏与任何消耗您课程的人的合同,因此最好从属性开始。

来源
Translate

这取决于。

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

来源
Translate

从拥有最具可维护性的代码的角度来看,我认为您应该在属性的设置器中进行尽可能多的验证。这样,您将不会缓存或以其他方式处理无效数据。

毕竟,这就是属性的含义。如果您拥有的只是一堆属性,例如...

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

...他们可能是田野

来源
Translate

你可能想看看域驱动设计,作者:埃里克·埃文斯(Eric Evans)。 DDD具有规范的概念:

...专门用于显式谓词的VALUE OBJECTS。 SPECIFICATION是确定对象是否满足某些条件的谓词。

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

来源
Translate

验证应在验证方法中与获取器或设置器分开捕获。这样,如果需要在多个组件之间重用验证,则可以使用它。

调用setter时,应使用这种验证服务来清理对象中的输入。这样,您知道存储在对象中的所有信息始终有效。

您不需要对getter进行任何形式的验证,因为有关该对象的信息已经被认为是有效的。

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

来源
Translate

我喜欢实施IDataErrorInfo并将我的验证逻辑放入其Error和this [columnName]属性中。这样,如果您要以编程方式检查是否存在错误,则可以简单地在代码中测试这些属性中的任何一个,也可以将验证交给Web窗体,Windows窗体或WPF中的数据绑定。

WPF的“ ValidatesOnDataError”绑定属性使此操作特别容易。

来源
Translate

我尽量不要让我的对象进入无效状态,因此设置器肯定会进行验证以及更改状态的任何方法。这样,我不必担心正在处理的对象是无效的。如果将方法作为验证边界,则不必担心验证框架和IsValid()方法调用随处可见。

来源
下一个问题:
php -Linux轻量级IDE