`
calmness
  • 浏览: 353286 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

OO—现实与实现的分歧

阅读更多
   最近在和朋友做一个小的系统,对系统进行设计时与朋友的理念有所冲突,于是乎就想起了一个老问题,那就是正方形与长方形的继承问题。
   
OO可以说是现实世界在计算机世界的一个映射,而对于正/长方形,实际上是对正/长方形数学定义在计算机的一个映射的问题。

首先我们来看看在现实中,长方形的定义:
有一个直角的平行四边形是长方形。

再来看看判定定理:
定理1:有三个角是直角的四边形是长方形。
定理2:对角线相等的平行四边形是长方形。

以上就是长方形在现实中的定义以及判定定理。以此来看,正方形完全符合以上定义以及判定定理,所以可以得出正方形就是长方形,是它的一种特例。

在阎宏博士所学的《java与模式》一书里的观点是反对正方形是长方形的子类的,同时他写了一个例子出来:
  public void resize(Rectangle r){
        while(r.getHeight()<r.getWidth()){
           r.setWidth(r.getWidth()+1);
        }
    }


这个例子是长方形的一个方法,用来不断增加长方形宽度,当宽度超过长度就停止增长,当传入对象是正方形的时候,这个方法就无用武之地(修改)。对于这一点,我的反驳很简单,是谁规定了长方形的边长必然是一个长一个宽呢?在现实的定义和判定定理中,并没有这一条吧。我记得在以前读书的时候,就有过一道判断题:长方形的长一定比宽的长度长。这道题目的答案就是错的。而在这里,阎宏博士通过一个自己定义实现的方法来扭曲现实中的定义,这一点已经明显违反了OO设计的根本,那就是客观的反映现实世界。

以上说了那么多,实际上我想说的是,在进行对象设计的时候,我们要把握好一点,那就是客观的反映现实的世界,当然要做到非常准确是很难,至少在现实对象有明确定义之时,我们不应该主观的加上自己的定义实现,让实现与现实产生分歧。
分享到:
评论
12 楼 magic_seek 2007-03-04  
正常情况下正方形是矩形的特例,所以正方形是矩形的子类,因为是特例所以多了很多约束,所以很多方法是需要覆盖父类的。
11 楼 magic_seek 2007-03-04  
不是什么OO问题,是对长方形的认识问题,看来阎博士是对长方形的概念理解错了。
10 楼 devworks 2007-03-04  
这里要根据行为建模,而不是照搬数学概念

矩形和正四边形具有不同的行为,不应该谁继承谁
9 楼 gigix 2007-03-04  
我觉得问题就在于Rectangle对象是可变的。只要有下列代码存在
Rectangle r;
r.setWidth(r.getLength());
// now what's the type of object r?

这个对象体系的设计就是有问题的。
8 楼 fyun 2007-03-04  
正方形继承长方形的问题,关键在于正方形有更强的约束。

比如给你一个长方形,长4宽3,我们很容易计算其面积为12;将长设置为5,则面积为15。

如果是一个正方形,边长4,我们也很容易计算其面积为16;如果将长设置为5呢,面积是25还是20?

楼主恐怕还是过于拘泥于阎博士的例子了。

正方形能不能继承长方形?还是根据具体环境决定吧。
7 楼 calmness 2007-03-04  
引用

关键在于概念没有搞清。
特别是用了容易混淆的术语命名。
如果将"长方形"改为"矩形",相信没有人会反对正方形作为矩形的子类。


开始我和你所想的一样。于是我查了很多数学相关资料,这些资料的定义都是长方形=矩形,也因此才有我上面这一说法
6 楼 李超群 2007-03-04  
现实中只能说什么都不做,或者抛出operationnotsupportedexception.
我想这个exception创造出来就是做这个用的。
5 楼 LucasLee 2007-03-04  
关键在于概念没有搞清。
特别是用了容易混淆的术语命名。
如果将"长方形"改为"矩形",相信没有人会反对正方形作为矩形的子类。

长方形,从你给出的定义来看,跟矩形一样,但是,其中的“长”字,给出了一个边一定长的暗示,从而与正方形区分开。而矩形,说的是,四个角都是直角,就是一个更好的命名,更贴近本质。

从这个意义上说,为一个概念取一个精确的命名,是成功的开始。
4 楼 calmness 2007-03-04  
哦,呵呵,写错了,不好意思,改一下
3 楼 clamp 2007-03-04  
传入的是正方形的话是不会溢出的,因为判断条件不满足,所以啥都不做。
2 楼 calmness 2007-03-04  
resize这个方法是不属于定义范畴,更多的是属于业务需求范畴。从业务角度来说,resize这个方法并不适用于正方形,我想这也是OO设计中的一大矛盾所在,最简单的解决办法就是子类对父类进行方法覆盖,但是实际上子类并没有这一需求,我也想找个更好的解决办法,呵呵,不知道gigix有没有既不违反现实客观定义,又可满足实际业务需求的解决办法呢?这点也是我希望大家可以讨论一下的。
1 楼 gigix 2007-03-04  
what's your point?
那你打算怎么实现这个resize方法

相关推荐

    sap abap oo实现ALV

    ### SAP ABAP OO 实现 ALV 的方法与实践 #### 一、背景介绍 在SAP ABAP领域中,ALV(Application List Viewer)是一种常用的技术,用于展示表格形式的数据。传统的ALV实现方式通常采用面向过程的方法,通过调用标准...

    sap abap oo实现alv框可编辑

    "SAP ABAP OO实现ALV框可编辑" 在SAP ABAP中,实现ALV框的可编辑功能是非常重要的。本文将详细介绍如何使用面向对象编程(Object-Oriented Programming,OOP)在SAP ABAP中实现ALV框的可编辑功能。 首先,我们需要...

    基于OO4O和VC 6.0 实现Oracle数据库操作C++源代码程序小实例

    在本实例中,我们将深入探讨如何使用Object Oriented for Oracle (OO4O)库和Microsoft Visual C++ 6.0(或Visual Studio .NET)来实现对Oracle数据库的C++编程操作。OO4O库是Oracle公司提供的一个接口,允许开发者...

    SAP OO ALV技术介绍.pdf

    OO ALV技术可以满足大多数ALV需求,但有时需要与后续的屏幕开发等集中在一个屏幕中,或者需要实现一些函数ALV不可实现的事件等。 OO ALV技术的实现方式是通过调用cl_gui_alv_grid类的方法set_table_for_first_...

    ABAP OOALV报表开发

    ABAP OOALV报表开发,定义变量,选择屏幕定义,创建类,调用函数

    OOALV常用功能完整简例

    这些代码片段涉及了OOALV创建和初始化的过程,以及一些配置字段目录和表格显示设置的实现。例如,“g_alv_grid”是一个OOALV对象的引用类型,而“g_it_show”是一个与之关联的内表。代码片段中展示了如何通过SQL查询...

    ABAP OO的八个理由

    5. 事件驱动与灵活性:ABAP OO易于实现事件驱动编程,调用者和被调用者之间的关系更加松散,增强了程序的灵活性。相比之下,面向过程的程序执行流程往往是预定义的,不易调整。 6. 明确性与易用性:ABAP OO的执行...

    SAP OO ALV技术介绍.pptx

    OO ALV技术的优点是可以满足更多的报表需求,例如需要与后续的屏幕开发等集中在一个屏幕中,或者需要实现一些函数ALV不可实现的事件等。同时,OO ALV技术也可以与标准函数REUSE_ALV_GRID_DISPLAY和REUSE_ALV_GRID_...

    MapX中基于OO4O实现Oracle 10g空间操作.pdf

    在C/S架构的GIS系统中,如果服务器端使用Oracle 10g数据库,客户端应用使用MapX,通过OO4O实现Oracle 10g的空间操作,可以极大地扩展MapX的功能。例如,可以执行更复杂的空间查询,如缓冲区分析、网络分析等,这些在...

    ABAP OOALV学习文档

    **ALV GRID CONTROL (ALV 网格控制器)** 是实现精美屏幕显示的关键组件,它利用控制器技术并通过系统的全局类方法响应各种操作事件。 ##### 控制结构概述 - **字段目录 (Field Catalog)**:用于控制 ALV 显示的...

    OO方法、RUP与UML建模(讲义)

    OO方法,全称为面向对象的方法,是一种以对象为中心的软件开发方法论,它结合了数据和操作这些数据的函数,通过抽象、封装、模块化和分层等原则,以提高软件的可维护性和复用性。面向对象分析(OOA)和面向对象设计...

    在VB中利用OO4O实现Oracle空间数据库访问.pdf

    OO4O库提供了与Oracle数据库交互的接口,允许开发者在VB环境中直接操作Oracle Spatial对象,进行数据的读取、写入和更新。通过OO4O,VB程序员可以方便地在应用程序中实现空间数据的访问和管理。 【访问过程】 使用...

    oracle object server (OO4O)开发者手册

    一、Oracle Objects for OLE (OO4O): 开启数据库与OLE应用的桥梁 Oracle Objects for OLE (OO4O)是Oracle公司专为OLE(Object Linking and Embedding)开发者设计的服务器对象编程模型。该模型允许开发人员在OLE...

    实战OO 用例 建模

    实战OO_用例建模 实战OO_用例建模 实战OO_用例建模

    实战OO的pdf自留备份

    综上所述,《实战OO》这本书全面覆盖了面向对象设计的各个环节,从需求分析到系统实现,再到部署实施,对于提升开发者在OO领域的专业技能具有极高的价值。通过阅读和学习,读者可以更好地掌握类图的绘制、设计模式的...

    OO4O简介以及其在VC++中的应用

    - **OO4O**:在性能上优于通用技术,开发简便,是介于OCI与ADO/ODBC之间的一种选择。 #### OO4O简介 OO4O是一种专门为Oracle数据库设计的快捷访问接口,它支持Microsoft公司的COM Automation and ActiveX技术,...

    SAP ABAP开发学习——第10课:OOALV(视频教程)

    10. **集成到SAP GUI**:OOALV不仅可以独立使用,还可以与SAP GUI的其他组件结合,如对话框、表单等,为用户提供统一的界面体验。 通过本课程的学习,你将掌握如何利用OOALV来创建功能强大的数据展示界面,提高SAP...

    OO设计原则 -- OO设计的 DIP依赖倒置原则

    ### OO设计原则 -- OO设计的 DIP依赖倒置原则 #### 概述 在软件工程领域,特别是面向对象设计中,依赖倒置原则(Dependency Inversion Principle, DIP)是六大设计原则之一,由著名软件架构师Robert C. Martin提出...

    通用分页实现及其OO设计探讨(2)

    本话题将深入探讨“通用分页实现及其OO设计”,结合给定的“Paginaction.jsp”文件,我们可以进一步了解在Java Web开发中如何有效地实现分页功能。 首先,我们需要理解分页的基本概念。分页是将大量数据分割成多个...

Global site tag (gtag.js) - Google Analytics