【论坛话题】OO的问题!!!!!!!

来源:互联网 发布:网络高手黑客怎么联系 编辑:程序博客网 时间:2024/04/29 00:42

【问题: 】

本人看了一些OO的书,有些还是不太明白。想各位大侠指点一二。
举个例子吧:
一个学生的考试成绩。如果用OO来分析应该是有二个对象,学生和成绩。
教师可以修改成绩。那这个修改的行为应该是谁的呢,是学生,教师,还是成绩本身。
教师.修改(),学生.修改(),成绩.修改()

 

【回复】(部分,到目前为止)

回复人: v0v() ( 一级(初级)) 信誉:100

对象的建立不是唯一的,应视具体的情况及应用而定
    如果在你建立的系统里,学生的属性和行为很少(可以理解专为修改成绩而创建的),而且也不存在将来扩充的可能性,那么将成绩作为学生的一个属性并由学生亲自修改也是一个有效率的方案,但是在现实的系统中一个学生可能拥有很多学科的成绩,不同时期的成绩,同时学生的脚色也非常丰富,除了考试外,可能还有很多其他的行为和属性,那么此时,为了避免模型的混乱就应该创建成绩这个对象来管理自身的行为,学生此时可以聚合一个成绩。

回复人: w_rose(w_rose) ( 四级(中级)) 信誉:94

成绩被修改了,但是不知道被哪一个教师修改的,这不允许。
教师修改成绩了,却查不出修改了哪一个成绩,这也匪夷所思。

其实修改是跨两个对象的操作,它在哪一个类上实现都无所谓,只是少写一个参数,但是本质是一样的——操作内this对象也是一个默认的参数。

回复人: w_rose(w_rose) ( 四级(中级)) 信誉:94

OO是要求按照类型将操作分模块打包的。OOP编程风格并非完美。如果我们写下一堆操作,然后当它涉及多个对象作参数时系统自动在各个类型模块中复制一份并且保持它们同步似乎更智能化。

回复人: jeffyan77(jeffyan77) ( 四级(中级)) 信誉:105

这里有两个原则需要考虑。

第一、D.I.M.(Do it myself)也就是你说的对象自己管理自己。数据和修改数据的程序必须封装在一起,形成对象。

第二、设计的粒度(granularity)。成绩是不是作为独立的对象出现,还是作为学生的一个属性出现,取决于在你的系统中成绩到底有多么重要。

如果你的系统就是关于成绩管理的,那么成绩就应该是一个重要的独立对象。这个时候成绩应该提供一个修改方法modify(),所有的修改必须通过这个方法进行,这就体现了DIM。

但是如果你的系统中成绩不是那么重要,那么成绩就是学生的一个属性,由通用数据类型(譬如Double)表示,那么为了体现DIM,学生对象必须提供一个方法修改自己的成绩。实际上在使用Double类型的时候,修改它的值也必须通过调用Double类型的方法。+-操作实际上也就是Double的方法。因此成绩(Double)的DIM此时由OO语言本身体现。

教师修改成绩,这是业务逻辑的一部分。为了体现这个业务逻辑,成绩对象的modify()方法应当有教师对象这个参数,表明是谁批准了这个修改。教师对象本身也可以有一个modifyScore()方法,通过调用这个方法,教师可以修改某个成绩。但是,这个方法仅仅是一个调用的传递而已,真正的修改必须由成绩对象(如果没有专门的成绩对象,就是学生对象)本身进行。

在任何情况下,教师不是应当是最终直接修改成绩的对象。不然的话,你就把成绩当成了案板上的肉,被动地由教师来切,或者说设计了一种程序对象,由它修改另一种对象,即数据对象。在本质上,把程序和数据分隔开来,等于是取消了对象。
回复人: jeffyan77(jeffyan77) ( 四级(中级)) 信誉:105

在某些特殊的情况下,将操作和数据分割开来堪称妙手,譬如Visitor模式就利用了这一点。

这就像下围棋一样,高手考虑到了某一层次,看似俗手,却是妙手。低手考虑不到什么层次,俗手就是俗手。现在你不必考虑Visitor模式。

回复人: w_rose(w_rose) ( 四级(中级)) 信誉:94

通常,我们首先在牵扯底层操作的类中设计接口,也就是:成绩.修改(教师),然后再在需要时随时在对方(也就是教师)中增加对应的接口:教师.修改成绩(成绩),以便让人轻松地使用。例如:微软的编程框架系统通常来说对程序员的界面比较友好,轻松自然。

回复人: adsl314(dd) ( 一级(初级)) 信誉:100

在此先多谢各位的热心帮助。
---------------
看了这么多人的回复,我也明白了不少。在此说下我的想法:
  首先,正如yujia120(于佳) 所说:
  不能简单理解成:成绩自己修改自己
  而是谁是操作数据的对象
  这样理解就不会混淆,不会有主动和被动这样的误解
  因为有些行为你分不出是主动还是被动
  应该把对象看作是数据的操作者
 也就是jeffyan77(jeffyan77),w_rose(w_rose) 所说的D.I.M.
至于谁(教师)发出请求信息。这个就是体现业务逻辑中谁能够做什么。也就是这个对象(教师)有什么样的行为。
--------
不对之处还请指正。。。

回复人: w_rose(w_rose) ( 四级(中级)) 信誉:94

“职责”有多方面的含义。在“计算机领域”内,那么Record负责与永久存储系统打交道。在“业务领域”内,那么这个操作其实既不属于record也不属于teacher独有,同时还要有targetRecord,也就是说三个参数在一起才支撑起这个操作能被人理解。

回复人: w_rose(w_rose) ( 四级(中级)) 信誉:94

可以看看上面的record类内的定义,再结合业务定义,程序员很可能争论到:record在保存前把teacher给丢了!

因此,面对其它程序员作为这个两个类的用户,开发这应该仅仅从“顺应、自然”出发。这时候争论就能区分出“业务设计”、“存储设计”两个层面来。

回复人: ozzzzzz(希望敏捷) ( 一星(中级)) 信誉:161

实际上以上的讨论几乎完全没有价值,因为这些讨论基本上没有考虑实际的项目中的情况是怎么样的,是单纯的就想法而想法、理论而理论。我们来看看实际的项目中的情况究竟是怎么样的。
首先我们必须明白分析模型和设计模型不是相同的,我们现在讨论的是设计模型的问题。
实际上成绩绝对不是一个单纯的分数,而是对一个学生的综合评价,其包括分数,主观性判断,修业实践长短等多个因素。而成绩的被修改几乎是注定会在一个阶段内发生的,同时对一个成绩的认定其实也可以认为是一种特殊的修改。同时成绩的修改和认定也是有非常多的业务逻辑的,比如考试成绩的计算(大家可以应该明白GRE等国外考试成绩的认定过程的复杂),考试成绩和最终成绩的换算(中考成绩会在学期成绩中的换算方法,学期成绩在结业成绩中的换算方法)。而修改的逻辑也很复杂,比如本期成绩的修改和上学年成绩会有所不同;修改成绩的业务流程也可能在不同的科目有不同的做法;成绩修改的时候所做的记录可能会在不同的环境下有不同。这些逻辑都可能经常性的发生改变,而且即使不改变其本身的复杂性也不可能仅仅是一个简单的方法可以解决的。
所谓的 教师.修改() 或者 成绩.修改() 几乎都是不可能存在的荒谬的想法。

回复人: ozzzzzz(希望敏捷) ( 一星(中级)) 信誉:161

darren_zhu_NZ(农村也用.net -_-)
"模拟一个实战情况, 很有必要"
你认为在我发言以前,谁模拟可实战了?归根结底你们讨论的任何一个方法在实际中都很荒谬,都是不可用的,实际的实现的时候没有任何的参考价值.这样的所谓想法任凭你如何综合,都是非常幼稚可笑没有意义的.
这就使我产生一个担心.我们平时为了说明一个问题总是举出一些典型的不能再典型,简单的不能再简单的例子,说明我们想说明的问题.这就给学习这些方法的人一个误解,认为世界似乎就是这样典型,就是这样简单,而忽略了世界实际的复杂性.
我不认为有谁对这个场景没有实际的经验,而只是大家都忽略了世界的复杂.比如你用
教师.修改()
而实际上你忽略了1.不是每一个教师都有修改的权利,2不是每一个教师都有修改每一个成绩的权利,3,不是每一个修改都是由教师做出的,会存在评分标准变化的场景(例如原来是140分,现在是100分;原来不加权,现在加权;原来不考虑修业时间,现在要考虑修业时间)
你们使用 成绩.修改() 也存在非常多的缺陷,大家可以自己设想一下都有什么缺陷。

实际上现在普遍存在一个学习的时候总是把实际设想得简单化,在实践的时候设想得复杂化的情形。这里的讨论就是典型的简单化的情形。

回复人: w_rose(w_rose) ( 四级(中级)) 信誉:94

没有什么事是不会被人指摘出“简单化”的。

事实上,可以把一只猴子放在键盘前足够长时间,它就会把这个论坛上的所有帖子给你写出来,而不需要我们这些人去辛苦地回复!

这就是说,任何东西如果可以、粗暴地去考虑,反而可以打着“完美、高级”的幌子去要求。最难做到的是实事求是、恰到好处、不做不是自己职责的事(指对象设计)。

所谓“修改权限”,如果你要求第一次就设计出来,那么你按照要求去做。如果你要求它是基本功能的扩展,你就在继承的子对象中去做,这也是上面所说“do it self”的一部分。

回复人: ozzzzzz(希望敏捷) ( 一星(中级)) 信誉:161

这个问题我再解释几句。
实际上两者都是可以的,只要你只是在一个假象的简单环境下,没有什么对错问题,好坏的差别也很小,这点老阎已经说明白了。关键还是当你把这些东西放在一个具体的环境下,你会觉得这两者都很别扭和难于把握。
如果你只是为了完成某作业,则这个问题你可以随便使用那种。但是软件工程不是为学术研究服务的,而是我们我们具体的工作进行服务的。做作业你应该去问你的老师,他的回答才更能让你取得高分。而这里不应该也不必要去为这些老师做替代者。
比如你说学生不可以更改他自己的分数,但是实际上很多分数都是可以从学生要求的修改成绩这个点出发进行的。比如他认为自己的一个问题的老师考虑的没有他的完全,这个时候他要求的修改和从老师主动进行的修改业务意义是不同的,这种基于学生要求的修改几乎是你在所有的环境下都需要考虑的。再比如很多成绩的修改不是由学生也不是由老师发出的,比如学校为鼓励社会实践把分数集体的增加一个数目。这样的事情经常性的发生在学校的里面,我不相信有哪个学生不知道。只是你有没有按照实际的情况而不是仅仅只是按照题目的情况考虑问题罢了。

 

【原贴】:

http://community.csdn.net/Expert/topic/3285/3285957.xml

 

 

 

 

 

 

 

 

 

 

原创粉丝点击