关于对象识别?和其他

phonlee 2003-07-28 06:49:56
1)对象识别的问题??
OO中大家如何识别对象:
例如一个Cpp文件语法分析器
最基本的有名词: 对于名词可以很简单的找到:
UnitNode -----被分析的文件单元
ClassNode ---- 类节点
FunctionNode ---- 函数节点
ParameterNode ---- 参数节点

超类-----StringNode ----字符串节点

但是对于处理流程呢?
是否删除文件注释也是一个class.
类名称可以是CommentClear

感觉这个就是一个小的功能模块

那么对象的识别是否就是?名词+(动宾结构中的动词)

2) 讨论2 这么做感觉就是算法(动词对象)+数据结构(名词对象)
只是中间加入了函数隔离,加强了可维护性。
大家有什么看法?

3) 感觉OO实现过程中 类的划分就像工厂中工作的分工。
多态就是一个工种的再细分,对象间的关系就像工人间的协作;
所以,我感觉合理的分工就是良好的OO设计.

4) OOD如何设计好,
让一个会写函数的人就可以完成类的实现?


请各位发表高见!















...全文
163 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
BSRONG 2003-08-09
  • 打赏
  • 举报
回复
study
jvcit 2003-08-09
  • 打赏
  • 举报
回复
study
phonlee 2003-08-09
  • 打赏
  • 举报
回复
UP!
phonlee 2003-07-30
  • 打赏
  • 举报
回复
//////////////////引言//////////////////////
见过这样一个设计(编码语言:Java):

打印对象:负责打印格式设置、打印预览、打印输出……
输入对象:负责处理不同格式的交互式输入。
显示对象:负责按用户指定格式显示。
查询对象:负责按各种方式在数据库中检索。
……
很难说这是一个OO的Design
。。。。。
/////////////////////////////////////////////

楼上说 这里错误在哪里?
如果给你如何设计呢?

我觉得合理,一个对象负责一个单一的功能;
从根本上说,就是合理的分工问题;

当然,具体到OOD的时候可能还要分解出来底层的公用对象。
但是作为概要设计,我觉得这些已经可以了。

短歌如风 2003-07-28
  • 打赏
  • 举报
回复

此外,我并不认为OO方法在任何领域都是最合适的。OO方法的优点在于,它比传统方法更接近现实世界的逻辑而不是计算机的逻辑,而对于楼主所举的例子——CPP语法分析——可能更接近计算机的思维逻辑了。

如果要在这里面使用OO方法,我觉得可以考虑使用“解释器模式”(这么复杂的语言的解释器,效率可能……)+“访问者模式”。“类”、“函数”、“属性”、“方法”、“注释”等都是组成“解释器模式”的对象,而“删除注释”则是一个“访问者”。
短歌如风 2003-07-28
  • 打赏
  • 举报
回复
这些问题的讨论足够写一本书的,简单地说一下吧:

1):关于对象的识别,重要的在于分析阶段对领域模型的总结,这时对象的主要来源是领域模型中的名词,不同的对象表明了不同的概念。对象应该来源于对职责的划分而不是功能的划分。我曾见过这样一个设计(编码语言:Java):

打印对象:负责打印格式设置、打印预览、打印输出……
输入对象:负责处理不同格式的交互式输入。
显示对象:负责按用户指定格式显示。
查询对象:负责按各种方式在数据库中检索。
……
很难说这是一个OO的Design。当然我并不是说不OO就一定不好,不过从OO角度来说,这种设计当然是不合理的。
此外,并不是所有的数据都应该是对象。比如一个list可以是一个对象,但我觉得list_node就没有必要表示成对象了(不过在Java中由于没有直接指针类型,它只能用对象类型去实现,但在逻辑上没必要把它看成一个对象)。
在OOA阶段总结出的对象模型通常都反应了领域模型中的概念,但到了OOD阶段,对象类型(类)还会大量扩展,比如为了减弱某一对象的职责负担,各种模式的应用等。通常在OOA阶段最重要的是识别泛化关系,而在OOD阶段各种链接关系将越来越重要。

OO方法与传统方法的区别就在于它提高了上层逻辑的重用性。传统方法的结果通常只能达到底层的重用性,通常是底层算法或是数据结构。而OO方法则提高了业务逻辑层的重用。但要作到这一点并不容易,首先必须从对问题领域的分析开始,这时决不能去考虑与问题域无关的实现内容。

对象的识别是OO方法的开始,也是OO方法中的难题,不同的小组对同一问题域的分析结果可能也不同,好的对象模型重用性好,而不好的模型就会存在各种各样的问题,这也是OO方法比传统方法更难掌握的原因。

2):在OOA/OOD中,数据结构不再是中心,它只是对象模型的一个实现内容。这时软件不再是“数据结构+算法”,而是“对象+消息”,一切动作由模型中的主动对象发起,通过与其它对象的交互来完成任务。在OO系统中,一个操作的流程不再由一个子程序维护,而是分散在多个对象的操作中。

3):在OOD的过程中,分工的确是很重要的。准确地说,就是对象职责的划分。同时,分类也是重要的。所谓分类,我是指识别对象的泛化关系。也就是说,比如分成A和B两类,而X是A类的,Y和Z是B类的……

4):关于OOD到什么程度的问题,很多人都有自己的观点,有一种观点就是象楼主说的,让“会写函数的人”就可以进行实现,要设计出所有的类所有的属性和方法。我不太同意这种观点。我觉得这样其实是把编码阶段的工作拿到设计阶段了。如果OOD要作到这种程序,我不知道OOP究竟还有什么意义。
我的观点是,OOD要明确写出每个类的对象职责,所有的公开接口,如果是有子类的,还应该写出保护接口。其它都属于这个类自己的实现,没有必要在OOD阶段完成,应该把它放到编码阶段决定。当然,这样对编码阶段的程序员要求要高一些。

对于OO方法,我也只是一个学习者,以上观点都只代表我自己。
zhucde 2003-07-28
  • 打赏
  • 举报
回复
up
phonlee 2003-07-28
  • 打赏
  • 举报
回复
书看了不少,但是应用才是目的。
xnew2008 2003-07-28
  • 打赏
  • 举报
回复
台主的问题很多,建议你去找本面向对象的书看看

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧