【问题标题】:Database Guy Asks: Object-Oriented Design Theory?数据库专家问:面向对象的设计理论?
【发布时间】:2008-10-29 11:48:18
【问题描述】:

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

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

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

我所追求的是一个或多个基本理论原则,这些原则自然会引导开发人员针对给定问题的解决方案进行“正确”设计。

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

更新:

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

再次感谢您的回答:)

【问题讨论】:

标签: oop solid-principles package-design


【解决方案1】:

小心一些设计模式文献。

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

一些“Gang of Four”设计模式更适用于活动的应用程序对象,而不太适用于持久对象。当您在Abstract Factory之类的东西中挣扎时,您会遗漏OO设计的一些关键点,因为它适用于持久对象。

Object Mentor What is Object-Oriented Design? 页面包含了从关系设计过渡到 OO 设计真正需要了解的大部分内容。

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

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

在 OO 设计中,设计持久对象最重要的规则可能是Single Responsibility Principle

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

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

【讨论】:

  • 谢谢。我想你实际上已经回答了这个问题,其他人都没有很好地解决这个问题。 :)
  • 曾经在那里——在成为对象架构师之前是一名关系 DBA——花时间指导其他 DBA。我感觉到你的痛苦。
【解决方案2】:

《设计模式》这本书是你的下一步。
http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612

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

【讨论】:

  • 好书,但不适合从关系设计转向 OO 设计的人——我发现它过于关注活动类而没有足够关注持久对象。
【解决方案3】:

我觉得Agile Software Development, Principles, Patterns, and Practices挺好的。

here列出的OO原则提供了很多深入的讨论:

  • 面向对象设计和依赖管理的原则
  • SRP — 单一职责原则
  • OCP — 开放封闭原则
  • LSP — Liskov 替换原则
  • DIP — 依赖倒置原则
  • ISP — 接口隔离原则
  • REP — 重用发布等效原则
  • CCP — 通用关闭原则
  • CRP — 通用重用原则
  • ADP — 非循环依赖原则
  • SDP — 稳定依赖原则
  • SAP — 稳定的抽象原则

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 谢谢。我想这就是我的直觉在说什么。 :)
    • +1 - 这个观点有很多优点。数据的标准化视图非常接近对象模型。
    【解决方案5】:

    如果您想真正掌握 O-O,请与 Smalltalk 一起玩。 ST 是一种纯粹的 OO 语言,而且非常直接。一旦你克服了范式驼峰,你就学会了面向对象,因为没有它你就不能真正做 Smalltalk。这就是我第一次学习 OO 的方式。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        我真的很喜欢 Head First Design Patterns,它非常平易近人,以及 Arthur J. Riel 的出色 Object oriented Design Heuristics

        【讨论】:

        • 感谢您的建议。我有Head First,很好。启发式设计看起来真的很有趣 - 我已将它添加到我的愿望清单中! :)
        【解决方案8】:

        This site lists 101 title...设计模式、重构等...看看..这将是一个很好的起点...

        【讨论】:

          【解决方案9】:

          去大卫韦斯特的对象思维。有趣的阅​​读..
          不过,您来自黑暗面……根据本书;) 数据库思维一直是 OO 程序员的诅咒。它们是光谱的两端。比如

          • 数据库思维将数据属性置于其他一切之上。规范化并根据它们如何适合 DB Schema 或 ER 图创建类型。OO 思维基于行为和协作创建类型,并且不将数据属性识别为都很重要。
          • 数据库来自那些重视形式化和方法胜过一切的科学人士。 OO 来自那些使用启发式方法和经验法则并重视个性和社交互动的人。

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

          【讨论】:

            【解决方案10】:

            牢记现实世界的对象,为您的对象建模。

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

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

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

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

                它们是 OOP 最实际的用途。

                【讨论】:

                • 哪本书,企业设计模式?
                【解决方案13】:

                我猜你的意思是数据库世界中的 OO。

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

                【讨论】:

                  【解决方案14】:

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

                  【讨论】:

                    猜你喜欢
                    • 2014-02-19
                    • 1970-01-01
                    • 2011-11-10
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-12-02
                    • 2010-12-27
                    • 1970-01-01
                    相关资源
                    最近更新 更多