【问题标题】:Learning OOP Design学习面向对象设计
【发布时间】:2011-01-30 03:41:24
【问题描述】:

我已阅读 Head First Java,并且了解 OOP 的工作原理。这是我的问题:我是一名 PHP 程序员,虽然我在 PHP 中使用过 OOP,但我无法确定什么应该是对象以及赋予它的方法。

例如,假设我有一个允许人们登录和编辑文档的应用程序。如果只有一个实例,为什么文档应该是一个对象?我应该将deleteDocument() 方法提供给文档对象还是管理对象?文档是被删除的文档,但管理员是执行操作的文档。

所以我真正的问题是,从程序背景来看,我如何确定什么应该是对象,什么应该有什么方法?

【问题讨论】:

    标签: oop


    【解决方案1】:

    在您的示例中,我不确定为什么在您的设计中只有一个文档,但它仍然应该是一个对象,以防您以后想要多个文档。

    至于删除功能,真的没有直截了当的答案;你很可能会发现双方的争论。我自己,我会将较低级别的删除功能(例如删除数据库条目)放在文档类中,但任何其他功能都可以放在父类中。如果所有文档都归管理员所有,管理员应该有一个 DeleteDocument,它会在文档上调用 delete,并从数据库中删除所有关联。

    一般来说,来自过程,如果您发现自己传递大量状态变量或声明大量全局变量,那么将相关功能转换为一个类。尽量让对象包含的功能保持密切相关,否则你可能会发现你的类膨胀得失控。

    【讨论】:

      【解决方案2】:

      没有永远成立的答案。如果你对面向对象设计感兴趣,我推荐this book

      至于你关于如何弄清楚什么应该是对象以及它们应该具有什么方法的问题,一个好的启发式方法是问自己是否拥有某种能力对于成为某种事物是必不可少的。这是我记得的 OOP 课程中的一个示例……您正在跟踪应用程序中的人和宠物。 person 类应该有一个getPets() 方法吗?那么,养宠物对成为一个人来说是必不可少的吗?不,更好的解决方案可能是有一个代表宠物所有权的单独关系类。

      【讨论】:

      • +1,部分是为了推荐设计模式书——尽管我认为它在这里并没有真正的帮助。设计模式书在某些方面打破了面向对象的常规规则——类不是独立的抽象,有时它们本身似乎根本不是抽象——它们是多类抽象中的组件(整个模式)。
      【解决方案3】:

      这在某种程度上取决于您选择的语言。 Java 是一种“纯 OO”语言,这意味着无论喜欢与否,所有东西都必须打包在类中。 C++ 是“不纯的”——如果你愿意,你可以决定你的文档只是一堆全局变量。

      即使在 C++ 中,即使只有一个实例,您也经常将事物打包在类中。这是因为一个类不仅仅是一种将任意东西打包在一起的方式——它是一种抽象机制。通过将相关的事物组合在一起并给出组名称,您可以使您的代码更具可读性和可维护性 - 可重用性是一个主要好处,但不是使用类的唯一原因。

      【讨论】:

        【解决方案4】:

        我会查看How do you design object oriented projects。接受的答案是一个很好的答案。

        我用于初始设计(获取类图)的步骤是:

        需求收集。与客户交谈并分解用例以定义软件应具有的功能。

        编写各个用例的叙述。

        通过叙述并突出显示名词(人、地点、事物),作为候选类和动词(动作),作为方法/行为。

        丢弃重复的名词并排除常见的功能。

        创建一个类图。如果您是 Java 开发人员,Sun 的 NetBeans 6.7 有一个 UML 模块,它允许绘制图表以及往返工程,而且它是免费的。 Eclipse(一个开源Java IDE),也有一个建模框架,但我没有使用它的经验。您可能还想尝试开源工具 ArgoUML。

        应用 OOD 原则来组织您的类(分解出通用功能、构建层次结构等)

        【讨论】:

          【解决方案5】:

          所以我真正的问题是,从程序背景来看,我如何确定什么应该是对象,什么应该有什么方法?

          从 Head First Java 中对 OOP 的机制有了一些了解,我建议您现在研究一些良好的 OO 设计原则。网上有很多资料,有好有坏,但如果您喜欢 Head First Java,那么我建议您选择一份出色的 Head First OO Analysis & Design。它将回答您的许多问题,并包含一些出色的场景示例,例如您在此处提到的场景。

          在你解决了这个问题之后,你可能想看看SOLID principles,然后(正如这里的其他人已经推荐的那样)一些常见的OO design patterns

          【讨论】:

            【解决方案6】:

            “文档”是一种特殊类型的对象——实体。它可能被持久化或从存储中删除的事实是一个单独的问题,应该由一些其他类处理,一些人称之为“数据访问层”。您的业​​务类(希望您有一些)将使用实体、dal 和其他类来执行您的业务功能。

            它远不止于此,引入了接口和泛型。

            【讨论】:

              【解决方案7】:

              DeleteDocument 应该转到管理对象。

              您使用它是因为它不那么花哨 - 以及更好的 Intellisense、更灵活等。此外,它还具有线程优势。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多