我想知道这是否是一个好主意 验证吸气剂设定者, ,或代码中的其他地方。

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

有帮助吗?

解决方案

好吧,类通常包含具有公共 getter/setter 的私有成员的原因之一正是因为它们可以验证数据。

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

至于性能,我同意 Knuth 的观点:

“我们应该忘记小效率,大约 97% 的情况下:过早的优化是万恶之源。”

其他提示

@Terrapin,回复:

如果您只有一堆[简单的公共集/获取]属性...他们也可能是领域

与田地相比,房地产还有其他优势。它们是更明确的契约,它们是序列化的,它们可以稍后调试,它们是通过继承进行扩展的好地方。笨拙的语法是一种偶然的复杂性——例如 .net 3.5 就克服了这一点。

一种常见(且有缺陷)的做法是从公共字段开始,然后根据“需要”将其转变为财产。这会破坏你与使用你的课程的任何人之间的合同,因此最好从属性开始。

这取决于。

一般来说,代码应该很快失败。如果该值可以由代码中的多个点设置,并且您仅在检索该值后进行验证,则错误似乎出现在执行更新的代码中。如果设置器验证输入,您就知道哪些代码正在尝试设置无效值。

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

毕竟,这就是属性的用途。如果你拥有的只是一堆属性,例如......

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

...它们也可能是领域

你可能想看看 领域驱动设计, ,埃里克·埃文斯着。DDD 有规范的概念:

...出于专门目的的明确类似谓词的价值对象。规范是确定对象是否满足某些条件的谓词。

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

验证应该与验证方法中的 getter 或 setter 分开捕获。这样,如果验证需要在多个组件之间重用,它是可用的。

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

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

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

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

WPF 的“ValidatesOnDataError”绑定属性使这变得特别容易。

我尽量不让我的对象进入无效状态,因此设置器肯定会进行验证以及任何更改状态的方法。这样,我就不必担心我正在处理的对象是无效的。如果将方法保留为验证边界,那么您永远不必担心验证框架和 IsValid() 方法调用遍布各处。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top