- 浏览: 353234 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
yanxhyxz:
怎么静态化动态文件,如果不使用perl脚本可以实现文件过期吗? ...
通过Nginx架设灵活的网站静态化方案 -
fu_ok:
long subLen = (long) Math.ceil( ...
使用java实现http多线程下载 -
fu_ok:
哇,好厉害,楼主现在还写程序么
使用java实现http多线程下载 -
jimok618:
居然70几条评论里都没提到RandomAccessFile是非 ...
使用java实现http多线程下载 -
hexawing:
其实也不是,在 ruby中,方法实际上就是一个隐式的begin ...
Ruby 异常处理
最近在和朋友做一个小的系统,对系统进行设计时与朋友的理念有所冲突,于是乎就想起了一个老问题,那就是正方形与长方形的继承问题。
OO可以说是现实世界在计算机世界的一个映射,而对于正/长方形,实际上是对正/长方形数学定义在计算机的一个映射的问题。
首先我们来看看在现实中,长方形的定义:
有一个直角的平行四边形是长方形。
再来看看判定定理:
定理1:有三个角是直角的四边形是长方形。
定理2:对角线相等的平行四边形是长方形。
以上就是长方形在现实中的定义以及判定定理。以此来看,正方形完全符合以上定义以及判定定理,所以可以得出正方形就是长方形,是它的一种特例。
在阎宏博士所学的《java与模式》一书里的观点是反对正方形是长方形的子类的,同时他写了一个例子出来:
这个例子是长方形的一个方法,用来不断增加长方形宽度,当宽度超过长度就停止增长,当传入对象是正方形的时候,这个方法就无用武之地(修改)。对于这一点,我的反驳很简单,是谁规定了长方形的边长必然是一个长一个宽呢?在现实的定义和判定定理中,并没有这一条吧。我记得在以前读书的时候,就有过一道判断题:长方形的长一定比宽的长度长。这道题目的答案就是错的。而在这里,阎宏博士通过一个自己定义实现的方法来扭曲现实中的定义,这一点已经明显违反了OO设计的根本,那就是客观的反映现实世界。
以上说了那么多,实际上我想说的是,在进行对象设计的时候,我们要把握好一点,那就是客观的反映现实的世界,当然要做到非常准确是很难,至少在现实对象有明确定义之时,我们不应该主观的加上自己的定义实现,让实现与现实产生分歧。
如何设计是非常主观的事情,在论坛里面,针对一个模糊的设计来讨论“如何设计”是非常“浪费生命“的事情。
“对象”是达成“实现需求”得一个手段,如果不用对象的设计,直接用过程式的方法能够获得“更清晰,更简洁”的代码,那就完全可以摈弃 “对象设计”,当然,如果在复杂一点的需求中,前面的“假设”我还很少看到。
恩,或许在真的项目里面果真如此。
讨论如何设计对象以及他们之间的关系,如果这个讨论发生在讲解“设计模式”的时候,还算“值得”讨论。
如果在项目里面,这个讨论如果 “过于详细(或者细节)”就显得过于“先于需求”了。
可以想象怎么实现用户的需求的时候 ,脑子的思维是多么活跃:设计一个人,一个长方形,再来一个很好的继承关系,再通过组合,这样就可以。。。。。嗯,这里还多一些抽象,以免........(省略100000字)
这里我不得不佩服人的脑子的想象力,以及在各种技能条件下的充分发挥。
当然,对于这样充分想象的工作者,说明他是有相当的能力,因为很多一些人连合理的想象的能力都达不到,当然,不能磨灭他们将来可以达到的可能性。
这里,我不得不打击那位 充满想象力的“对象设计者”一下,其实他几乎99%的想象都是无用的,甚至可能使以后系统实现时的“累赘”和“缺陷来源”。过于“执着”自己的设计而不遵循“需求需要”的原则,这样的教训更来得惨重。
粗略的类图在需求开始分析阶段,是有必要的。但是没必要如此详细。 特别是涉及到“继承”/各种设计模式的使用的时候。 这些更细节的东西 最好能够通过需求推导出来。
当然,不是每个人都能把握在 coding过程中,把握重构的细节,甚至把握“重构出更合理的对象关系”的能力。然而,如果能够这样做的,项目的质量总归比要“先于需求实现”的质量总归要来得高得多。 部能够这样做的,就成为“攻击敏捷开发”的原因之一。
我觉得根据正方形和长方形的行为方式可以分为两种情况考虑:
1.行为方式相同时:将正方形看作是长方形的特例,也就是说我设计的时候不考虑正方形这个类,要构造一个正方形需要通过构造一个长宽相等的长方形来实现。
2.行为方式不同时:长方形 正方形继承同一个接口Shape,各自实现自己的行为
另外是否可以考虑把Rectangle等设计成不变模式(Immutable Pattern),这样就不需要考虑由于对象长宽变换而导致的形状的变化
另外2:对于正方形继承长方形这种方式有点牵强
正方形应该在setter里面保证长宽相等
或者在不相等的时候throw Exception
setLength的时候长宽都为5
setWidth的时候长宽都为4
然后assertEquals的时候应该是失败,20VS16
那么使用这些类的程序应该怎么写?是不是先判断一下类型?
说来说去,又回到正方形不能继承长方形了。
正方形应该在setter里面保证长宽相等
或者在不相等的时候throw Exception
setLength的时候长宽都为5
setWidth的时候长宽都为4
然后assertEquals的时候应该是失败,20VS16
11楼是正解啊。
这里不是什么覆盖父类的问题,考虑这样的代码
分别传入长方形和正方形的实例,分别是什么结果?
OO可以说是现实世界在计算机世界的一个映射,而对于正/长方形,实际上是对正/长方形数学定义在计算机的一个映射的问题。
首先我们来看看在现实中,长方形的定义:
有一个直角的平行四边形是长方形。
再来看看判定定理:
定理1:有三个角是直角的四边形是长方形。
定理2:对角线相等的平行四边形是长方形。
以上就是长方形在现实中的定义以及判定定理。以此来看,正方形完全符合以上定义以及判定定理,所以可以得出正方形就是长方形,是它的一种特例。
在阎宏博士所学的《java与模式》一书里的观点是反对正方形是长方形的子类的,同时他写了一个例子出来:
public void resize(Rectangle r){ while(r.getHeight()<r.getWidth()){ r.setWidth(r.getWidth()+1); } }
这个例子是长方形的一个方法,用来不断增加长方形宽度,当宽度超过长度就停止增长,当传入对象是正方形的时候,这个方法就无用武之地(修改)。对于这一点,我的反驳很简单,是谁规定了长方形的边长必然是一个长一个宽呢?在现实的定义和判定定理中,并没有这一条吧。我记得在以前读书的时候,就有过一道判断题:长方形的长一定比宽的长度长。这道题目的答案就是错的。而在这里,阎宏博士通过一个自己定义实现的方法来扭曲现实中的定义,这一点已经明显违反了OO设计的根本,那就是客观的反映现实世界。
以上说了那么多,实际上我想说的是,在进行对象设计的时候,我们要把握好一点,那就是客观的反映现实的世界,当然要做到非常准确是很难,至少在现实对象有明确定义之时,我们不应该主观的加上自己的定义实现,让实现与现实产生分歧。
评论
32 楼
xly_971223
2007-04-19
没有文字也能提交上来? 表单里好像有长度限制吧
31 楼
gstripe
2007-04-19
不好意思,网络太卡,刷了两下居然上面两条没有文字。晕死
30 楼
gstripe
2007-04-19
平面几何图形
平行四边形
矩形
长方形 正方形
平行四边形
矩形
长方形 正方形
29 楼
firebody
2007-03-12
age0 写道
楼上几位又扯远了,“在恰当的地方恰当的使用OO”,这种没有营养的废话不说也罢。
何时、何地以及如何实现OO才是需要反复讨论的课题。
何时、何地以及如何实现OO才是需要反复讨论的课题。
如何设计是非常主观的事情,在论坛里面,针对一个模糊的设计来讨论“如何设计”是非常“浪费生命“的事情。
28 楼
age0
2007-03-12
楼上几位又扯远了,“在恰当的地方恰当的使用OO”,这种没有营养的废话不说也罢。
何时、何地以及如何实现OO才是需要反复讨论的课题。
何时、何地以及如何实现OO才是需要反复讨论的课题。
27 楼
抛出异常的爱
2007-03-12
现实世界如果真的那么容易就可以变成对象
那要我们何用?
对象只是假装自己是现实世界中的一员
大象用程序的方式模拟现实而已
如果不能模拟那么一定是你的程序错
而不是现实有错....
那要我们何用?
对象只是假装自己是现实世界中的一员
大象用程序的方式模拟现实而已
如果不能模拟那么一定是你的程序错
而不是现实有错....
26 楼
firebody
2007-03-12
simohayha 写道
对于复杂的处理逻辑,计算逻辑复杂的系统时可能FP会更好些,这时候面向对象就显得不合时宜了。
“对象”是达成“实现需求”得一个手段,如果不用对象的设计,直接用过程式的方法能够获得“更清晰,更简洁”的代码,那就完全可以摈弃 “对象设计”,当然,如果在复杂一点的需求中,前面的“假设”我还很少看到。
25 楼
simohayha
2007-03-12
对于复杂的处理逻辑,计算逻辑复杂的系统时可能FP会更好些,这时候面向对象就显得不合时宜了。
面向对象很好,是不错,可是你硬要用它来解释一切东西,那就不对了.
面向对象很好,是不错,可是你硬要用它来解释一切东西,那就不对了.
24 楼
firebody
2007-03-12
age0 写道
人、女人、男人、老人、年轻人,都是现实中存在的实体对象。
它们之间存在任何继承关系吗?如果存在,应该如何设计呢?
属性及行为如何影响我们的设计?
最后,当我们陷于矛盾及困扰的时候,是不是从一开始我们就已经错了呢?
它们之间存在任何继承关系吗?如果存在,应该如何设计呢?
属性及行为如何影响我们的设计?
最后,当我们陷于矛盾及困扰的时候,是不是从一开始我们就已经错了呢?
恩,或许在真的项目里面果真如此。
讨论如何设计对象以及他们之间的关系,如果这个讨论发生在讲解“设计模式”的时候,还算“值得”讨论。
如果在项目里面,这个讨论如果 “过于详细(或者细节)”就显得过于“先于需求”了。
可以想象怎么实现用户的需求的时候 ,脑子的思维是多么活跃:设计一个人,一个长方形,再来一个很好的继承关系,再通过组合,这样就可以。。。。。嗯,这里还多一些抽象,以免........(省略100000字)
这里我不得不佩服人的脑子的想象力,以及在各种技能条件下的充分发挥。
当然,对于这样充分想象的工作者,说明他是有相当的能力,因为很多一些人连合理的想象的能力都达不到,当然,不能磨灭他们将来可以达到的可能性。
这里,我不得不打击那位 充满想象力的“对象设计者”一下,其实他几乎99%的想象都是无用的,甚至可能使以后系统实现时的“累赘”和“缺陷来源”。过于“执着”自己的设计而不遵循“需求需要”的原则,这样的教训更来得惨重。
粗略的类图在需求开始分析阶段,是有必要的。但是没必要如此详细。 特别是涉及到“继承”/各种设计模式的使用的时候。 这些更细节的东西 最好能够通过需求推导出来。
当然,不是每个人都能把握在 coding过程中,把握重构的细节,甚至把握“重构出更合理的对象关系”的能力。然而,如果能够这样做的,项目的质量总归比要“先于需求实现”的质量总归要来得高得多。 部能够这样做的,就成为“攻击敏捷开发”的原因之一。
23 楼
age0
2007-03-12
人、女人、男人、老人、年轻人,都是现实中存在的实体对象。
它们之间存在任何继承关系吗?如果存在,应该如何设计呢?
属性及行为如何影响我们的设计?
最后,当我们陷于矛盾及困扰的时候,是不是从一开始我们就已经错了呢?
它们之间存在任何继承关系吗?如果存在,应该如何设计呢?
属性及行为如何影响我们的设计?
最后,当我们陷于矛盾及困扰的时候,是不是从一开始我们就已经错了呢?
22 楼
yiding_he
2007-03-10
将正方形当成长方形来用,可能会造成不可理解的结果。但是仔细追究,正方形的面积计算实际上是一种简化的方法,其本意还是“长”乘以“宽”。如果一定要我写一个继承于长方形的正方形的话,我会在 setHeight() 方法里面写上 throw MethodNotImplementedException();
21 楼
wkxxkw
2007-03-05
8错,LSP一章中提到过这个问题,他说 IS-A 是关于行为的,意思很明显:如果行为不同,就不赞成设计成为继承。我觉得应当抽取公共部分,设计为接口
20 楼
xly_971223
2007-03-05
taya 写道
关键要看调用者的上下文,看其对行为方式的预期
在上下文中正方形和长方形的行为方式相同的才能继承,不同的话就不能
Bob大叔在《敏捷软件开发》的LSP一章中提到过这个问题
在上下文中正方形和长方形的行为方式相同的才能继承,不同的话就不能
Bob大叔在《敏捷软件开发》的LSP一章中提到过这个问题
我觉得根据正方形和长方形的行为方式可以分为两种情况考虑:
1.行为方式相同时:将正方形看作是长方形的特例,也就是说我设计的时候不考虑正方形这个类,要构造一个正方形需要通过构造一个长宽相等的长方形来实现。
2.行为方式不同时:长方形 正方形继承同一个接口Shape,各自实现自己的行为
另外是否可以考虑把Rectangle等设计成不变模式(Immutable Pattern),这样就不需要考虑由于对象长宽变换而导致的形状的变化
另外2:对于正方形继承长方形这种方式有点牵强
19 楼
抛出异常的爱
2007-03-05
二年前就有人在这个论坛讨论过的问题
观点一
长方型不是正方型的父类
两个的基本属性不同
一个是长宽,另一个是边长
观点二
长方型可以长宽不等
那么正方型就是长宽相等
所以型状的改变就不是单独改变长宽
而是两个一起改变
如果方型,改变成不同时抛出异常
观点三
方型重写
改变长宽的方法
让每次改变是将长宽同时改变
观点不同建模也不同
观点一
长方型不是正方型的父类
两个的基本属性不同
一个是长宽,另一个是边长
观点二
长方型可以长宽不等
那么正方型就是长宽相等
所以型状的改变就不是单独改变长宽
而是两个一起改变
如果方型,改变成不同时抛出异常
观点三
方型重写
改变长宽的方法
让每次改变是将长宽同时改变
观点不同建模也不同
18 楼
silentlakeside
2007-03-05
我觉得是对现实的模型理解有误,现实中并没有长方形/正方形这种物体,长方形/正方形只是物体的一个外观,当物体改变长度/宽度以后,其形状会发生变化,因此不存在正方形改变长度/宽度会变成非正方形,只存在物体改变了长度/宽度,从而使得形状从正方形变成了非正方形。
当然纯粹从几何学的角度可以另外讨论。
当然纯粹从几何学的角度可以另外讨论。
17 楼
taya
2007-03-05
关键要看调用者的上下文,看其对行为方式的预期
在上下文中正方形和长方形的行为方式相同的才能继承,不同的话就不能
Bob大叔在《敏捷软件开发》的LSP一章中提到过这个问题
在上下文中正方形和长方形的行为方式相同的才能继承,不同的话就不能
Bob大叔在《敏捷软件开发》的LSP一章中提到过这个问题
16 楼
clamp
2007-03-04
1、正方形是可以继承长方形的(但这是有前提的,仅继承直角平行四边形)
事实上正方形还可以继承菱形(仅继承边长相等这个概念)
2、长方形的长和宽这两个属性及其相关方法不应该被正方形继承
事实上正方形还可以继承菱形(仅继承边长相等这个概念)
2、长方形的长和宽这两个属性及其相关方法不应该被正方形继承
15 楼
gigix
2007-03-04
Julien 写道
public void t(Rectangle r){ r.setLength(5); r.setWidth(4); assertEquals(20, r.getArea()); }
正方形应该在setter里面保证长宽相等
或者在不相等的时候throw Exception
setLength的时候长宽都为5
setWidth的时候长宽都为4
然后assertEquals的时候应该是失败,20VS16
那么使用这些类的程序应该怎么写?是不是先判断一下类型?
说来说去,又回到正方形不能继承长方形了。
14 楼
Julien
2007-03-04
public void t(Rectangle r){ r.setLength(5); r.setWidth(4); assertEquals(20, r.getArea()); }
正方形应该在setter里面保证长宽相等
或者在不相等的时候throw Exception
setLength的时候长宽都为5
setWidth的时候长宽都为4
然后assertEquals的时候应该是失败,20VS16
13 楼
fyun
2007-03-04
magic_seek 写道
正常情况下正方形是矩形的特例,所以正方形是矩形的子类,因为是特例所以多了很多约束,所以很多方法是需要覆盖父类的。
11楼是正解啊。
这里不是什么覆盖父类的问题,考虑这样的代码
public void t(Rectangle r){ r.setLength(5); r.setWidth(4); assertEquals(20, r.getArea()); }
分别传入长方形和正方形的实例,分别是什么结果?
发表评论
-
WPS2009在线存储终于来了
2009-05-11 21:49 2622WPS2009最近推出新版本,其中最大的热点莫过于期待 ... -
当男人爱上女人——学会诱导需求
2009-02-22 23:15 4161当男人爱上一个女 ... -
创新思维
2009-02-17 22:39 1265创新,是任何时候,任何产品都要面临的一个难关,如何创新 ... -
从女人减肥想起........
2009-02-12 11:43 1160一直以来身边的女 ... -
再见了08
2009-01-25 00:29 10162008,充满着悲痛与欢喜的一个数字,在这一年,无数人 ... -
有比这更牛的网站么-比百度和google都好
2009-01-14 18:45 1906不看不知道,一看吓一跳,这个网站实在是牛X,太有创意了 htt ... -
理性分析Thinkpad笔记本行水货差价为何便宜六成
2009-01-05 23:26 4926转自:http://itbbs.pconline.co ... -
关于团队博客的探讨
2008-11-15 00:14 1277最近在网上浏览了很多开发团队自建的博客,其中印象比较深 ... -
经济危机的多重体现
2008-11-14 09:00 1036体现一: “靠,60万的十分之一是什么概念?” ... -
有点儿郁闷
2008-07-31 15:31 921昨夜想装个ecmas23来写Python,考虑了半天, ... -
随意写写
2008-07-29 13:47 1018马上就要转工作环境了,这次是去自己期待已久的公司上班,而 ... -
JAVA,最终还是不能选你作为开始
2008-07-26 18:14 1647最近开始教我弟弟编程,然而对于语言的选择却有点头疼了。 ... -
你的价值在哪里?
2008-06-05 20:41 2459今天一个朋友在Q群里问到,程序员的价值在哪里?很多群友们都纷纷 ... -
IT人员流动的思考
2008-05-19 12:40 2734相信大家都经历或 ... -
悲伤伴着感动,难以平复的心情
2008-05-14 23:06 11845.12,一个让国人永远难忘的日子,这一天给我们带来太多的伤痛 ... -
倒霉的日子
2008-05-06 21:04 1126人倒霉就是没办法,吃饭也会噎着。最近因为吃了太多上火的 ... -
程序员,你应该主动点
2008-04-27 15:09 1316程序员这一职业,在很多人心目中的印象一直都是死板,一天 ... -
使用wubi安装ubuntu记得绕开ubuntu下载
2008-04-27 10:42 13035ubuntu8.04 LTS于24日正式发布, 该版本 ... -
贫困的定义
2008-04-13 13:27 1556今天在网上看到一 ... -
看《拿“美女”换和平的皇帝》有感
2008-04-08 23:04 1703今天偶尔看到一篇 ...
相关推荐
### SAP ABAP OO 实现 ALV 的方法与实践 #### 一、背景介绍 在SAP ABAP领域中,ALV(Application List Viewer)是一种常用的技术,用于展示表格形式的数据。传统的ALV实现方式通常采用面向过程的方法,通过调用标准...
"SAP ABAP OO实现ALV框可编辑" 在SAP ABAP中,实现ALV框的可编辑功能是非常重要的。本文将详细介绍如何使用面向对象编程(Object-Oriented Programming,OOP)在SAP ABAP中实现ALV框的可编辑功能。 首先,我们需要...
在本实例中,我们将深入探讨如何使用Object Oriented for Oracle (OO4O)库和Microsoft Visual C++ 6.0(或Visual Studio .NET)来实现对Oracle数据库的C++编程操作。OO4O库是Oracle公司提供的一个接口,允许开发者...
OO ALV技术可以满足大多数ALV需求,但有时需要与后续的屏幕开发等集中在一个屏幕中,或者需要实现一些函数ALV不可实现的事件等。 OO ALV技术的实现方式是通过调用cl_gui_alv_grid类的方法set_table_for_first_...
ABAP OOALV报表开发,定义变量,选择屏幕定义,创建类,调用函数
这些代码片段涉及了OOALV创建和初始化的过程,以及一些配置字段目录和表格显示设置的实现。例如,“g_alv_grid”是一个OOALV对象的引用类型,而“g_it_show”是一个与之关联的内表。代码片段中展示了如何通过SQL查询...
5. 事件驱动与灵活性:ABAP OO易于实现事件驱动编程,调用者和被调用者之间的关系更加松散,增强了程序的灵活性。相比之下,面向过程的程序执行流程往往是预定义的,不易调整。 6. 明确性与易用性:ABAP OO的执行...
OO ALV技术的优点是可以满足更多的报表需求,例如需要与后续的屏幕开发等集中在一个屏幕中,或者需要实现一些函数ALV不可实现的事件等。同时,OO ALV技术也可以与标准函数REUSE_ALV_GRID_DISPLAY和REUSE_ALV_GRID_...
在C/S架构的GIS系统中,如果服务器端使用Oracle 10g数据库,客户端应用使用MapX,通过OO4O实现Oracle 10g的空间操作,可以极大地扩展MapX的功能。例如,可以执行更复杂的空间查询,如缓冲区分析、网络分析等,这些在...
**ALV GRID CONTROL (ALV 网格控制器)** 是实现精美屏幕显示的关键组件,它利用控制器技术并通过系统的全局类方法响应各种操作事件。 ##### 控制结构概述 - **字段目录 (Field Catalog)**:用于控制 ALV 显示的...
OO方法,全称为面向对象的方法,是一种以对象为中心的软件开发方法论,它结合了数据和操作这些数据的函数,通过抽象、封装、模块化和分层等原则,以提高软件的可维护性和复用性。面向对象分析(OOA)和面向对象设计...
OO4O库提供了与Oracle数据库交互的接口,允许开发者在VB环境中直接操作Oracle Spatial对象,进行数据的读取、写入和更新。通过OO4O,VB程序员可以方便地在应用程序中实现空间数据的访问和管理。 【访问过程】 使用...
一、Oracle Objects for OLE (OO4O): 开启数据库与OLE应用的桥梁 Oracle Objects for OLE (OO4O)是Oracle公司专为OLE(Object Linking and Embedding)开发者设计的服务器对象编程模型。该模型允许开发人员在OLE...
实战OO_用例建模 实战OO_用例建模 实战OO_用例建模
综上所述,《实战OO》这本书全面覆盖了面向对象设计的各个环节,从需求分析到系统实现,再到部署实施,对于提升开发者在OO领域的专业技能具有极高的价值。通过阅读和学习,读者可以更好地掌握类图的绘制、设计模式的...
- **OO4O**:在性能上优于通用技术,开发简便,是介于OCI与ADO/ODBC之间的一种选择。 #### OO4O简介 OO4O是一种专门为Oracle数据库设计的快捷访问接口,它支持Microsoft公司的COM Automation and ActiveX技术,...
10. **集成到SAP GUI**:OOALV不仅可以独立使用,还可以与SAP GUI的其他组件结合,如对话框、表单等,为用户提供统一的界面体验。 通过本课程的学习,你将掌握如何利用OOALV来创建功能强大的数据展示界面,提高SAP...
### OO设计原则 -- OO设计的 DIP依赖倒置原则 #### 概述 在软件工程领域,特别是面向对象设计中,依赖倒置原则(Dependency Inversion Principle, DIP)是六大设计原则之一,由著名软件架构师Robert C. Martin提出...
本话题将深入探讨“通用分页实现及其OO设计”,结合给定的“Paginaction.jsp”文件,我们可以进一步了解在Java Web开发中如何有效地实现分页功能。 首先,我们需要理解分页的基本概念。分页是将大量数据分割成多个...