java - 确保数据有效还是防止数据无效?两个都?

标签 java

我想知道,从实际意义上来说,在大型(Java - 我的例子)项目中,是只编写防御逻辑来防止数据库中的无效数据更好,还是花时间检查一下并确保您不接受任何无效数据?请记住,这里的问题是,在很多情况下 null 是可以的,而在很多情况下 null 则不行,因此确保不存在无效数据的情况并非易事。

我问这个问题的原因是因为我正在开发一个大型项目,发现自己在追逐一些令人讨厌的空指针异常,结果却意识到抛出它的原因是因为未设置大型对象的某些模糊属性。因此,我去与系统工程师交谈,只是意识到在设计中,这应该是由用户设置的,等等。

注意:请不要将这些问题归因于“糟糕的系统设计”。设计是否可以更好并不是当前的问题(因为显然任何设计都可以改进)。 我想以这种形式表达一个已经加入一个非常高级项目(就花费的时间和代码行数而言)的开发人员的观点,以及从现在开始他应该做什么?

谢谢!

**我突然想到很多人可能会认为这是一个固执己见的问题?如果是这种情况,那么任何人都可以随意将其设为社区 wiki。但我不确定。可能有一些我不知道的惯例或“良好实践”,许多人都遵循,因此根本就不是一个固执己见的问题,只需告知我,一个新开发人员这种做法即可。

最佳答案

我倾向于编写我的对象以在构造时进行验证(大多数我的对象是不可变的)。 Setter 也会进行验证。

验证包括空值检查(最常见 - 我非常努力防止空值,并在允许空值时注释代码),以及对值的一些健全性检查。这些将在失败时(通常)导致 IllegalArgumentExceptions

我什么时候执行这些验证?不是在每个对象/辅助对象等上。通常是在我的应用程序中适当层或组件集之间的某种过渡上。一个好的经验法则是,任何可能被新客户端重用的组件都将执行验证。因此(在您的示例中)数据库层将提供验证,通常独立于其他层(如果您认为应用程序的不同层以不同形式表示数据,这并不是不合理的)

验证级别取决于数据的来源。例如对用户输入(例如文本字段中的条目等)执行最严格的验证。我对于检查来自(例如)Spring XML 配置的输入不太严格。

验证非常重要。您会立即检查您的数据,而不是在数据出现问题时才检查。这让生活变得更加轻松(想象一下,如果您接受错误的输入,序列化对象,一年后反序列化它,然后发现您无法使用它!)

关于java - 确保数据有效还是防止数据无效?两个都?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1137237/

相关文章:

java - 有没有办法强制类加载器加载一个包,即使它的类都没有被加载?

java - Firebase 存储中的 'getBytes()' 和 'getStream()' 方法有什么区别?

Java - 如何使用 Excelsior JET 构建 exe?

java - 如何优化和循环包含至少 1000 个对象的 2D 列表

java - ZK Listheader 以编程方式设置排序

java - java实例数组不需要初始化数组大小吗?

java - 如何向玩家发牌?

java - Eclipse 自动完成方法变量

java - 为黑白棋/黑白棋游戏创建 negamax/minimax 节点

java - 我如何判断文件(从保管箱网页读取)是否已在Java中被更改?