5

我在设计数据库方面工作了很长时间,而这些天我也在 C# 中工作。OO 对我来说很有意义,但我觉得我对 OO 设计的深层理论没有很好的基础。

在数据库领域,有很多关于如何设计数据库结构的理论,主要概念是规范化。规范化直接控制数据库的结构,并在一定程度上决定了如何在数据库中排列实体。

如何设计面向对象程序的结构背后是否有类似的概念?

我所追求的是一个或多个基本理论原则,它们自然地引导开发人员为解决给定问题进行“正确”设计。

我在哪里可以找到更多信息?
有没有我应该阅读的工作?

更新:

感谢大家的回答。我正在阅读的内容似乎是说没有“面向对象设计的大理论”,但是有许多重要的原则——这些原则在很大程度上以设计模式为例。

再次感谢您的回答:)

4

14 回答 14

11

小心一些设计模式文献。

有几种广泛的类定义。持久对象(类似于关系表中的行)和集合(类似于表本身)的类是一回事。

一些“四人组”设计模式更适用于活动对象、应用程序对象,而不太适用于持久对象。当你通过抽象工厂之类的东西挣扎时,你会错过一些面向对象设计的关键点,因为它适用于持久对象。

对象导师什么是面向对象设计?page 有许多人真正需要知道的从关系设计过渡到 OO 设计。

顺便说一句,规范化并不是始终适用于关系数据库的一揽子设计原则。当您有更新事务时应用规范化,以防止更新异常。这是一个 hack,因为关系数据库是被动的东西;您要么必须添加处理(例如类中的方法),要么必须通过一堆规则(规范化)。在数据仓库世界中,更新很少(或不存在)标准规范化规则不那么相关。

因此,对象数据模型没有“这样的标准化”。

在 OO 设计中,设计持久对象最重要的规则可能是单一职责原则

如果您将类设计为对真实世界的对象具有良好的保真度,并且以一种非常集中的方式为这些类分配职责,那么您将对您的对象模型感到满意。您将能够以相对较少的复杂性将其映射到关系数据库。

事实证明,当你从责任的角度来看事情时,你会发现 2NF 和 3NF 规则符合合理的责任分配。唯一键仍然很重要。派生数据成为方法函数的职责,而不是持久属性。

于 2008-10-29T13:12:00.677 回答
6

“设计模式”一书是您的下一步。
http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612

但是,您不必对所有事情都使用 OO 方法。不要对此抱有宗教色彩。如果更程序化的方法感觉更严格,那就去吧。刚接触 OO 的人往往会迟到一段时间。

于 2008-10-29T11:51:02.977 回答
4

我认为敏捷软件开发、原则、模式和实践非常好。

它对此处列出的 OO 原则提供了很多深入的讨论:

  • 面向对象设计和依赖管理的原则
  • SRP——单一职责原则
  • OCP——开闭原则
  • LSP — Liskov 替换原则
  • DIP——依赖倒置原则
  • ISP——接口隔离原则
  • REP——重用发布等效原则
  • CCP——共同关闭原则
  • CRP——通用重用原则
  • ADP——非循环依赖原则
  • SDP——稳定依赖原则
  • SAP——稳定的抽象原则
于 2008-10-29T12:04:00.753 回答
2

如果您习惯于构建规范化的数据库,那么面向对象的设计对您来说应该很自然。你的类结构最终看起来很像你的数据结构,除了关联表变成列表和查找表变成类中的枚举之外。

总而言之,我会说你进入具有关系数据库背景的 OO 设计比你转向另一个方向要好得多。

于 2008-10-29T11:53:43.270 回答
2

如果您想真正掌握 OO,请使用Smalltalk。ST 是一种纯粹的OO 语言,而且很直接。一旦你克服了范式驼峰,你就学会了面向对象,因为没有它你就无法真正做 Smalltalk。这就是我第一次学习 OO 的方式。

于 2008-10-29T11:59:02.713 回答
1

检查这个结果。从每个问题中学习。

于 2008-10-29T11:51:00.967 回答
1

我真的很喜欢Head First Design Patterns,它非常平易近人,以及Arthur J. Riel的优秀的面向对象设计启发式

于 2008-10-29T11:53:42.253 回答
1

去大卫韦斯特的对象思维。一本有趣的书……
虽然你来自黑暗的一面……根据这本书;)数据库思维一直是 OO 程序员的诅咒。它们是光谱的两端。例如

  • 数据库思维将数据属性置于其他一切之上。标准化并根据它们如何适合 DB Schema 或 ER 图来创建类型。OO 思维基于行为和协作创建类型,并且不认为数据属性很重要。
  • 数据库来自那些重视形式化和方法高于一切的科学家。OO 来自那些使用启发式和经验法则并在艰难而快速的过程中重视个性和社交互动的人。

关键是 COBOL 程序员即使在转向 OO 语言之后也可以编写 COBOL 程序。查看第一部分的任何一本书,比如 Thinking in Java,它总是详细说明 OO(学徒)的原则。接着是 Object Thinking(journeyman),并在适当的时候成为大师。

于 2008-10-29T12:00:57.357 回答
1

这个网站列出了 101 个标题......设计模式、重构和其他......看看它......这将是一个很好的起点......

于 2008-10-29T12:01:03.630 回答
1

通过牢记真实世界的对象来建模您的对象。

我们目前正在为机器开发自动化软件。其中一台机器有两个装载口用于喂入原材料,而所有其他机器只有一个。到目前为止,在所有模块中,我们将端口信息(当前设置、当前分配给它的批号等)作为代表机器的类中的成员。

我们决定创建一个保存端口信息的新类,并将两个 LoadPort 成员添加到此 MachineXY 类。如果我们之前考虑过,我们会对所有那些单端口机器做同样的事情......

于 2008-10-29T12:13:17.987 回答
0

你应该看看UML,它是一个给OOD的整个过程。

我建议买一本书(或几本书),因为理论非常庞大,大多数人都会挑选最适合手头项目的技术。

于 2008-10-29T11:50:32.667 回答
0

开始阅读 Martin Fowler 所说的设计模式。:)

它们是 OOP 最实际的用途。

于 2008-10-29T11:51:01.997 回答
0

我猜你的意思是数据库世界中的面向对象。

存储对象的面向对象数据库从未真正抓住过一个,因此您目前正在寻找将对象映射到关系数据库。ORM 或对象关系映射是用于描述执行此映射的软件的术语。理想情况下,这为您提供了两全其美的优势,开发人员可以与对象进行交互,并且在数据库中,所有内容都存储在可以进行标准调整的关系表中。

于 2008-10-29T12:00:57.293 回答
0

DBA 的俚语:面向对象设计不过是在安全操作接口后面适当规范化的数据,安全的意思,看操作,而不是直接看数据

于 2011-06-29T19:57:31.403 回答