4

在数据库世界中,我们有规范化。您可以从设计开始,逐步完成步骤,最终得到数据库的正常形式。这是在数据语义的基础上完成的,可以认为是一系列设计重构。

在面向对象的设计中,我们有 SOLID 原则和其他各种针对良好设计的临时指南。

您是否认为可以为 OO 定义等价的范式,这样一系列重构步骤可以将一段程序代码(或分解不良的 OO 设计)移动到正确的(在某种定义明确的意义上)公式中相同的功能?

(注:很高兴制作这个社区维基)

4

3 回答 3

8

这是一种可能,但极不可能。

语境

首先,在关系模型出现的日子里,从事 IT 工作的人受过更多的教育,他们尊重标准。计算机资源很昂贵,人们一直在寻找使用这些资源的最佳方式。像 Codd 和 Date 这样的人是高科技行业中的巨人。

Codd 没有发明规范化,我们在关系型出现之前很久就对非关系型数据库进行了规范化。归一化是一种理论和实践,作为完全归一化的原理出版。我们正在规范我们的程序,我们认为子程序(方法)的意外重复是一个严重的错误。现在它被称为Never Duplicate Anything或Don't Repeat Yourself,但最近的版本不承认背后的健全学术理论,因此它的力量是未实现的。

Codd 所做的(在许多事情中)是专门为关系数据库定义正式的范式。从那时起,这些都得到了进步和完善。但他们也被非学术界人士劫持,目的是出售他们的装备。

由 Codd 和 Chen 发明并由 Brown 完成的数据库建模具有坚实的基础。在过去的25年里,它已经实现了标准化,并得到了许多有扎实基础的人的进一步完善和进步。

OO之前的世界

让我们以 OO 之前的编程世界为例。我们有许多标准和约定,用于对我们的程序进行建模,以及针对特定于语言和平台的实现。你的问题在那些日子里根本不适用。整个行业都深刻地认识到数据库设计和程序设计是两门不同的科学,并为它们使用了不同的建模方法,以及适用的任何标准。人们没有讨论他们是否执行了标准,而是讨论了他们遵守标准的程度;他们没有讨论是否对数据和程序进行建模,而是讨论了对数据和程序进行建模的程度。这就是我们将人类送上月球的方式,尤其是在 1969 年。

OO的黎明

OO 出现并展示了自己,就好像在它之前不存在其他编程语言或设计方法一样。它没有使用现有的方法并扩展或改变它们,而是否认它们的存在。因此,毫不奇怪,从零开始制定新方法论并慢慢发展到不成熟的 SOLID 和敏捷地步,花了 20 年的时间;你的问题的原因。很明显,在那段时间里,已经有二十多种这样的方法出现并消亡了。

即使是适用于任何编程语言的 UML,它本可以是彻底的赢家,也遭受了同样的疾病。它试图成为所有人的一切,同时否认存在成熟的方法论。

行业的消亡

随着MS的出现,“任何人都可以做任何事”的态度(暗示:你不需要正规教育或资格),那种品质和职业自豪感已经丧失。人们现在从零开始发明东西,就好像这个星球上从来没有人做过一样。当今的 IT 行业技术含量非常低。您知道,但大多数阅读这些页面的人并不知道,存在一种关系建模方法和一种标准。他们不建模,不执行。然后重新实现。并重新实施。像你说的那样重构。

面向对象的支持者

问题是提出这些 OO 方法的人并不是专业人士中的巨人。他们只是非学术群体中最直言不讳的。出名是因为出版书籍,而不是因为同行的认可。 不熟练和不知情。他们的工具箱里有One Hammer,每个问题看起来都像钉子。由于他们没有受过正规教育,他们不知道实际上数据库设计和程序设计是两门不同的科学。那个数据库设计相当成熟,已经建立了强大的方法和标准,他们只是将他们闪亮的新锤子应用于每一个问题,包括数据库。

因此,由于他们忽略了编程方法和数据库方法,从头开始发明轮子,这些新方法进展非常缓慢。在类似人群的帮助下,没有良好的学术基础。

今天的程序有数百种未使用的方法。我们现在有程序可以检测到这一点。而使用成熟的方法,我们可以防止这种情况发生。瘦客户端不是一个要实现的目标,我们有一种科学来产生它。我们现在有程序来检测“脏”数据并“清理”它。而在数据库市场的高端,我们一开始就不允许“脏”数据进入数据库。

我接受您将数据库设计视为一系列重构,我理解您的意思。对我来说,这是一门无需重构的科学(方法论、标准)。即使接受重构也是一个响亮的信号,表明旧的编程方法是未知的。当前的OO方法不成熟。与 OO 人员一起工作很烦人的危险在于,这种方法本身培养了对一锤子心态的信心,当代码中断时,他们就没有一条腿可以站立;当系统坏了,整个系统都坏了,不是一个小部件可以修理或更换。

以 Scott Ambler 和敏捷为例。Ambler 花了 20 年的时间公开与数据库行业的巨头们激烈争论,反对规范化。现在他有了敏捷,虽然不成熟,但很有前途。但它背后的秘密是标准化。他已经换了轨道。而且由于他过去的战争,他不能诚实地站出来宣布这一点,并给予他人应有的信任,所以它仍然是一个秘密,你只能在没有宣布其基本原理的情况下弄清楚敏捷。

预后

这就是为什么我说,鉴于过去 20 年中 OO 世界的小进步;大约 20 种失败的 OO 方法;由于方法的浅薄性,当前的 OO 方法不太可能达到(单一)数据库设计方法的成熟度和接受度。至少还需要 10 年,更有可能是 20 年,并且会被 OO 的一些替代品取代。

为了成为可能,需要发生两件事:

  1. OO 支持者需要正规的高等教育。编程科学的良好基础。当然,任何人都可以做任何事情,但要做好事,我们需要一个良好的基础。这将导致人们认识到重构是不必要的,它可以被科学消除。

  2. 他们需要打破对其他编程方法和标准的否定。这将为在此基础上构建 OO 或利用其基础并将其合并到 OO 中打开大门。这将导致一个坚实而完整的 OO 方法论。

现实世界的OO

显然我是根据经验说话的。在我们的大型项目中,我们使用成熟的分析和设计方法,一种用于数据库,另一种用于功能。当我们进入代码切割阶段时,我们让 OO 团队使用他们喜欢的任何东西,仅用于他们的对象,这通常意味着 UML。架构、结构、性能、膨胀软件、One Hammer 或数百个未使用的对象都没有问题,因为所有这些都是在 OO 之外处理的。后来,在 UAT 期间,找到错误源或快速进行所需更改都没有问题,因为整个结构都有记录的结构;可以更改块。

于 2011-01-28T10:34:41.570 回答
2

我认为这是一个有趣的问题,因为它假定 Codd 的范式实际上是“正确”设计的定义。不是试图用那个声明引发一场激烈的战争,但我想我的观点是有很好的理由说明许多数据库没有完全规范化(例如连接性能)让我认为现实世界中 OO 中的规范化等价物空间可能是设计模式或(如您所说)SOLID。在这两种情况下,您都在谈论理想化的指导方针,必须以适当的批判眼光来应用,而不是像教条一样盲目地遵循。

于 2011-01-28T04:26:34.710 回答
2

我不仅完全同意保罗的观点,而且我会更进一步。

模型就是这样 - 只有模型。关系数据库使用的规范化模型只是存储和管理数据的一种方法。事实上,请注意,虽然 RDBMS 在数据操作操作(标准 CRUD)中很常见,但我们现在已经改进了 DataWarehouse,用于合并、分析和报告。而且它绝对不遵守在 DML 领域中发现的规范化模型。

现在我们还有 Google 的 BigTable 架构,以及 Apache 的 Hadoop。这些较新的建模系统反映了受分布式数据库理念驱动的格局变化。标准化也不需要申请这个俱乐部。

我们可以将一个成功的模型应用到它变得不那么成功的地步,或者被一个更适合设计师需求的模型所取代。请注意我们人类通过物理学/天文学对我们的宇宙进行建模的多种方式,你有什么。建模试图用谨慎的术语来描述系统,但随着系统或系统需求的变化,模型也必须如此。

OOP 是并且一直是对计算机应用程序建模的非常非常成功的方法。但是,应用程序设计人员的需求与数据库设计人员的需求不同。大多数时候,应用程序的设计者必须考虑到他的程序将与人类交互。与数据库设计师不同,他们的工作(大部分)将与其他代码交互,程序员的工作是使用机器并让更随机的人可以访问它。这种艺术并不能很好地映射到标准化等标准。

尽管如此,n 层、MVC、MVVC 和其他范式确实建立了一些指导方针。但最终,应用程序设计的问题空间通常不像关系数据库那样容易适应这种离散的建模步骤。

哇。为篇幅道歉。如果这违反了这里的礼仪,请告诉我。. .

于 2011-01-28T04:39:49.547 回答