我想这个问题会引发很多问题。我会尽量保持简短:
我可以放弃让我们说代表根本不存在的 Id 的整数。
从我的角度来看,程序是代表您的问题域的(计算)模型(可以与物理学家或天文学家编写方程式来表示现象进行类比)。当您使用对象建模时,您所做的是使用某些特定规则创建该域的表示。因此,回到您的问题,您可以在概念上用整数表示什么是 ID,但随后您的问题域中将有一个未正确表示的概念(例如,因为存在无效 ID 的整数)。此外,除了概念问题之外,问题在于您不能向整数添加(并因此委托)新行为,如果可以(例如,在 Smalltalk 中,一切都是对象,您可以扩展任何类),那也是错误的从建模的角度来看。作为一般经验法则,当我必须在不应该有给定责任的对象中编写行为时,我认为模型缺乏抽象。在这种情况下,就像有一个Util
带有类方法的类isValidId
。
如果我要使用一个对象,我实际上知道它有有效的数据,否则该对象将不会被创建(异常)或处于我必须检查的无效状态。
同意 100%。我写了几篇你可能会觉得有用的文章(免责声明:我在 Quanbit Research 工作)
这篇文章说为此使用具体对象是邪恶的,我应该交出它们的接口(你们都知道,我猜)。对具体类型(而不是接口)的更改会导致依赖类型“崩溃”。在所有情况下都是这样吗?
涉及对象、类型和接口的故事很长。总结一下,理想情况下,您应该针对接口而不是具体类进行编程,因为(理论上)您应该只关心给定对象(例如参数)实现一组具有预定义语义的消息。然而,如果你走这条路,在实践中你会发现一个类通常实现多个接口,并且让所有接口与类同步的簿记是令人望而却步的。我通常使用动态类型语言,所以在大多数情况下这对我来说不是问题,但如果我必须使用静态类型语言,当系统必须与项目外部的代码形式交互时,我会使用接口或在模块之间的 API 中。换句话说,我会尝试降低系统“边界”中的耦合。
对于封闭的单一项目环境也是如此吗?我只会明白,如果接口 - 一旦编写 - 就无法触及并且永远不会再被修改/重构。
我不得不在这里不同意。作为计算模型的程序反映了我们在问题域的给定时间点所知道的内容。因此,我们对它的工作越多,我们对它的了解就越多。编程涉及学习,当我们学习时,我们会更好地理解事物;因此我们的模型发生了变化。随着我们的模型发生变化,我们用来表示它们的元素也会发生变化(如类或接口)。随着时间的推移,你会发现你的模型变得更加健壮,概念上的变化会变慢,并且在某个时候你会拥有一个稳定的模型。但是变化是你应该期待的事情:)。
高温高压