Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 学习面向对象设计_Oop - Fatal编程技术网

Oop 学习面向对象设计

Oop 学习面向对象设计,oop,Oop,我读过Head-First Java,我理解OOP是如何工作的。这是我的问题:我是一名PHP程序员,虽然我在PHP中使用过OOP,但我很难弄清楚什么应该是对象以及给它什么方法 例如,假设我有一个允许人们登录和编辑文档的应用程序。如果只有一个实例,为什么文档应该是一个对象?我应该给document对象或admin对象指定deleteDocument()方法吗?文档是要删除的文档,但管理员是执行操作的人 因此,我真正的问题是,从程序背景出发,我如何确定什么应该是对象,什么应该有什么方法?“文档”是一

我读过Head-First Java,我理解OOP是如何工作的。这是我的问题:我是一名PHP程序员,虽然我在PHP中使用过OOP,但我很难弄清楚什么应该是对象以及给它什么方法

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


因此,我真正的问题是,从程序背景出发,我如何确定什么应该是对象,什么应该有什么方法?

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


它远远超出了这一点,引入了接口和泛型

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

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

一般来说,从过程的角度来看,如果您发现自己传递了一个大的状态变量数组或声明了很多全局变量,那么就将相关的功能转换成一个类。尽量保持对象包含的功能尽可能密切相关,否则您可能会发现类膨胀失控。

因此,我真正的问题是,从过程背景出发,我如何确定什么应该是对象,什么应该有什么方法

从Head-First Java中对OOP的机制有了一些了解,我建议您现在了解一些优秀OO设计的原则。网络上有很多材料,好的和坏的,但是如果你喜欢headfirstjava,那么我建议你选择一本优秀的。它将回答您的许多问题,并包含一些非常好的场景示例,如您在此处所涉及的场景


在解决了这个问题之后,您可能想先看看,然后(正如这里的其他人已经推荐的那样)看看一些常见的问题。

没有一个答案总是适用的。如果你对面向对象设计感兴趣,我推荐你

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

我想退出。公认的答案是好的

我用于初始设计(获得类图)的步骤如下:

需求收集。与客户交谈,找出用例来定义软件应该具有的功能

撰写单个用例的叙述

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

丢弃重复的名词并排除共同的功能

创建一个类图。如果您是一名Java开发人员,Sun的NetBeans 6.7有一个UML模块,可以进行图表绘制和双向工程,而且是免费的。Eclipse(一个开源JavaIDE)也有一个建模框架,但我没有这方面的经验。您可能还想试用ArgoUML,一种开源工具

应用OOD原则来组织类(考虑常见功能、构建层次结构等)


DeleteDocument应转到admin对象


你之所以使用它,是因为它不那么费劲、更智能、更灵活等等。此外,它还有线程方面的好处。

这在某种程度上取决于你对语言的选择。Java是一种“纯OO”语言,这意味着无论喜欢与否,所有东西都必须打包在类中。C++是“不纯”的——如果你想,你可以决定你的文档只是一组全局变量。
即使在C++中,即使在只有一个实例的情况下,也经常在类中打包东西。这是因为类不仅仅是一种将任意内容打包在一起的方式——它是一种抽象机制。通过将相关的内容分组在一起并给出组名,您可以使代码更具可读性和可维护性—可重用性是一个主要的好处,但不是使用类的唯一原因。

+1,部分原因是推荐《设计模式》一书—尽管我认为它在这里没有真正的帮助。《设计模式》一书在某种程度上打破了面向对象的常规规则——类不是独立的抽象,有时看起来根本不是抽象——它们是多类抽象(模式作为一个整体)中的组件。