面向对象的“规范化”


28

在数据库编程中,有一种称为“规范化”的技术可以对要存储的数据进行处理。

有没有人尝试将此概念应用于对象设计?你怎么样 效果如何?

编辑:为了扩展/阐明,数据库规范化不仅仅是减少冗余的一组原则。实际上,您需要经历一些步骤和阶段,并且至少要有一些适度的客观指标来告诉您所处的阶段。对象设计有其自身的原理,并且有嗅觉的概念,但是有什么办法可以做类似的事情来告诉您您是否处于XX-form0,1,2 ...等...以及移至下一个“标准化”级别的方法?


2
...您是说我们是否尝试过在类中没有多个冗余变量,并且在项目中没有多个冗余类?那行得通吗?
Satanicpuppy 2011年

2
@Steven A. Lowe:五年前,当我决定我的硕士学位论文的主题时,您在哪里?;)

我从未尝试过(这就是为什么我要作为评论回答),但是我猜想您可以通过共享数据的缓存,从对象到缓存的共享数据的指针以及某种依赖注入机制来做到这一点。将实例的指针指向共享数据...
FrustratedWithFormsDesigner

我发现了一个非常有趣的问题。

5
我认为重构几乎涵盖了面向对象编程和其他编程方法。
JohnFx 2011年

Answers:


27

虽然一些导致数据库标准化的潜在压力在OO系统中不存在,但其中一些压力却存在。这些已经引起了OO设计模式和原理,它们在某种程度上类似于规范化,至少是因为OO系统类似于关系数据库。例如:

换句话说,有人试图将数据库规范化技术应用于OOP吗?否,因为OOP已经有针对标准化解决关系数据库的共享问题的解决方案。


+1比我想写的要好得多!
Michael K

这些是原则,而不是技术。您将如何使用这些原理来“规范化”对象设计?
Edward Strange

3
数据库规范化也是一个原则。在这两种情况下,都有描述如何做出关于这些原理的决策的模式(或技术)。例如,请参阅Martin Fowler的重构书籍和Kent Beck的模式书籍。不同之处在于数据库设计是一个较小,较不复杂的域,它更易于量化并转化为一组简单的规则。
Rein Henrichs

5
@Crazy Eddie:如何使用关系数据库?您查找违反主体的实例并进行纠正。如果看到一个包含三个作业的类,则将其重写为三个类。如果您要寻找一个动词,例如“ normalize”(标准化),也许是它的“ refactor”(重构),尽管它并不十分具体,但包含在内。
杰里米

1
@Rein:数据库设计既没有OOP一样小,也没有OOP那么复杂,但是它具有一个巨大的优势:它始于扎实的理论基础和数学模型。OOP已经发展了很多启发式方法,但是仍然没有完整的形式主义。
Steven A. Lowe

18

是的,我有

我在这个话题上已经沉默了很长时间。是时候说出来了。

  • 有没有人尝试将此概念应用于对象设计?

是。我从事对象规范化(以及由此而来的面向对象理论)的形式化工作已有20多年了。

  • 你怎么样

通过意识到至少在理论上数据和代码是可互换的。这意味着规范化和关系运算的原理可以应用于代码以及数据。

  • 效果如何?

到目前为止,效果非常好-我相信所获得的见解一直是我设计,分析和重构能力的“秘密武器”。

在此之前,我没有公开谈论过任何事情,因为我认为最终我将有时间自己完成研究-并生产隐含工具。

但是我得出的结论是,随着我生命中其他所有更重要,更有趣和/或更有利可图的事情的进行,我将没有时间自己完成研究。曾经 还有很可能我根本没有必要的CS理论基础来独自完成工作。

我曾在当地大学询问是否赞助一两个博士学位候选人是否愿意承担起这项事业,但是可惜,我们的当地大学没有为编程语言语义学提供足够的基础。

在这方面已经进行了一些有趣的研究,但是我所知道的所有研究都没有达到预期的目标。它要么错误地假定由于规范化来自关系背景,否则就不适用于面向对象的模型,或者假定规范化仅适用于对象定义的数据。但是,有一些非常有趣的未遂项目...

当您对代码应用规范化时,会发生真正有趣的事情-我认为这是所有重构基础

因此,现在我想最好的办法就是说出这句话,也许是要求在DC的DevDays 2011上发表演讲,并找出是否有像我一样对这件事感到兴奋的社区。

这是先睹为快:规范化是使某些内容最少且不冗余的过程。因此,面向对象编程的“不要自己重复”(DRY)原理清楚地体现了标准化的目标。我相信我可以证明所有众所周知的面向对象的设计/编程/重构原理都是对象规范化的逻辑结果。我想我也可以证明,使用对象普通形式(ONF)的系统可以完成的工作不仅仅是重构。


1
还有更多实质性文件吗?
Steve314 2011年

4
发布!(请吗?)(请问吗?)如果您需要任何帮助来整理文档等,请与我联系。
2011年

1
@ChrisCirefice:很高兴向我发送电子邮件至steven.lowe@nov8r.com
Steven A. Lowe

1
@ChrisCirefice:仅供参考,博士候选人转到了另一所大学;再次在后燃器上进行项目(但我正在写有关DDD的书)
Steven A. Lowe

1
您好@ StevenA.Lowe我对您的研究非常感兴趣。我发现了一篇简短的论文crypto.google.com/… 您对此有何评论?顺便说一句,也许您可​​以通过首先写博客文章来进一步说明您的想法?谢谢。
魏秋

5

开始时是对Rein Henrichs出色答案的评论,但时间太长...

归一化适用于关系数据。它用于避免重复,由于每个数据仅存储在一个位置,因此可以更轻松地确保数据完整性。您可以通过查找规范化形式的违规并进行更正来规范化数据库。

面向对象编程适用于数据操作。它旨在将处理数据的方式组合在一起。您可以将类似的技术应用于类,以消除重复的方法,也许可以通过查看操作操作或依赖于哪些数据来实现。例如,从面向对象的角度看,1NF在类内将没有任何重复的操作。3NF可能与良好的继承结构相对应,在继承结构中,常用代码位于超类中。我相信您也可以在其中找到适合依赖注入的地方。通过发现违反良好设计原则并进行重构的方法,可以达到更好的设计(尽管还没有发现正常形式的东西)。

在这两个世界中,实际上都没有任何算法可以达到良好的设计。正如Rein Hendrichs指出的那样,有许多原则可以识别潜在的问题(即代码气味)。设计模式和最佳实践是人们试图解决它们的一些方法。测试驱动的开发试图通过在外部执行代码来及早找到它们。就像在数据库开发中一样,通过经验和分析可以找到最佳的解决方案。


2
我认为原则是关于解决一系列紧张关系的理想方法的陈述。模式是应用原理的启发式方法。IOW原则是有关问题空间结构的声明,而模式是将问题空间转化为解决方案空间的规则。但是我有点数学上的问题,所以我觉得很奇怪:)
Rein Henrichs

2

UML Modeling in Color是类似于标准化的一种非常好的设计业务模型对象的方法。

这是Peter Coad发现的一种设计策略,可以帮助抽象业务模型对象。

不幸的是,《用UML进行彩色Java建模:企业组件和流程》一书售罄,您只能购买二手书。

互联网上有几篇有关此技术的文章。

如果您熟悉关系设计,您会发现Color中的UML建模对指导您很有用:


0

您是否研究过在创建类图时在代码中使用ORM Java注释?建模阶段完成后,Hibernate将生成数据库。在此示例中,该图仅是代码查看器。


0

对象引用或指针类似于外键。这就是我愿意考虑的深度。:)

其实我会更深入地思考。如果您使用0个数据重复来对对象进行建模,并且可以“查询”您的对象并对其执行基于集合的更新,则不会断开连接。实际上,您可以通过创建对象使用者库来做到这一点。微软已经做到了这一点,但已朝着通过“查询库”将基于集合的LINQ语法作为C#的一部分的方向发展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.