自从《颠覆传统-面向对象的设计思想(序章)》发布出来后看的朋友和评论的朋友很多,有说好的,也有说不好。当然也有很多朋友在文章的评论中发表了自己的见解,在这里我就一些比较典型的评论做一下解释。

  • 来自名为wanghualiang 的评论
很佩服楼主的发散型思维。但是远远还没到颠覆传统的地步。
这里谈谈我的观点,
面向对象设计时完全从接口来描述对象本身的特性是不是有问题。
从鱼是不是可吃应该只能作为其一个属性来辨识,
Class Fish
{
public bool IsEatable;
}
当客户想吃这条鱼的时候,IsEatable=true;如果是河豚的话就是 False了。
当然有许多种不确定的因素,在可吃不可吃之间。那我们应该
[Flags]
Enum Eattype
{

DeliciousEate,//美味
Distasteful,
Barbed,
..
}

Class Fish
{
public Eattype eattype;
}

我想wanghualiang 的评论代表了相当一部分朋友的看法,从传统的面向对象思想(或者说普遍接受)的观点来看这样做是没有问题的,甚至还被作为了Demo写入了很多的面向对象 的教科书。但是实际上这种看法是存在问题的,至少我个人是这么认为的,首先我们需要考虑的问题是:鱼自己能不能决定自己能不能吃,能不能决定自己好不好 吃?应该是不能吧,决定鱼能不能吃,好不好吃的应该是吃鱼的对象对吧。也许从普通人的角度来看河豚是不能吃的,但是从高明的大厨或者资深的老饕的角度来看 河豚就是无比的美味了,这也是我在序章的最后专门添加一幅图片重点解说对象行为的原因。
    话说回来,既然鱼不能决定能不能吃、好不好吃,也就是说明能不能吃的行为不是有鱼能够决定的,那么也许有人会问那为什么要实现IEatable接口呢,和 直接做一个属性不是一样吗?这个问题问的非常的好,确实既然鱼不能够决定自己能不能吃、好不好吃,那么为什么鱼要实现IEatable接口呢。其实,在 Fish上实现IEatable接口完全是出于使用方便性和接口的层次(后续的文章中会重点讨论这个问题)来考虑的, 完全面向对象的搞法应该是有另外一个对象来鉴定这个鱼是否能吃、好不好吃的(这也是基于设计的平衡来考虑的,可以参看开放-封闭原则)。在这个地方使用接 口和属性本质上没有什么差别,但是一旦鉴别鱼能不能吃、好不好吃的鉴别方式(实现方法)发生变化的时候,使用属性的方式就难以扩展了,只能修改代码了,但 是使用接口的好处是我可以使用其它的方式补救,例如做一个实现IEatable接口的装饰对象来装饰鱼对象。
    另外,导致需要鱼对象实现IEatable接口的原因可能是出于接口隔离原则的考虑,如果使用属性来辨别鱼是否能吃,必然使用的地方就依赖鱼对象了,提高了系统的耦合性。示意代码如下:

 1 '检索是否可以吃的食物
 2 Public Function GetEatableFish(ByVal foods As IEatable()) As IEatable()
 3 
 4     '用于保存列表
 5     Dim tempList As New ArrayList
 6 
 7     '循环的检索
 8     For Each item As IEatable In foods
 9 
10         '判断是否可以吃
11         If item.IsEatable Then
12 
13             tempList.Add(item)
14         End If
15     Next
16 
17     '返回结果
18     Return tempList.ToArray(GetType(IEatable))
19 
20 End Function
21 
22 '是否可以吃接口
23 Public Interface IEatable
24 
25     '是否可以吃
26     Function IsEatable() As Boolean
27 
28 End Interface

软件设计的时候没有一味的好,也没有一味的差,任何事情都有其两面性,这个是需要取舍的,我们能够做到的事情就是让设计可控,如果设计失控了,那就全部完 蛋了。话说回来,如果能够确认当前的系统中评判鱼能不能吃的标准不会发生改变,把这个不会发生改变的东西集成到鱼对象中是完全可以的,在具体的实现上用属 性来实现也是一个非常不错的搞法。

  • 来自名为 Anders Liu 的评论
嗯。。。建议你在多想想再继续写。

比如这个:public class Goby : IFish, IClimbable, IEatable
我认为这样比较好:public class Goby : Fish, IClimbable, IEatable

看到区别了么?

至于Anders Liu 的评论应该与wanghualiang 的意见基本上是一致的,如果我没有理解错误的话。我们引入一个Class的时候需要考虑的是引入这个Class的目的,如果没有任何目的的引入一个类或者是仅仅简单的为了封装一个方法来引入一个类是不可靠的,后面我会写一篇随笔来专门讨论类和接口。

严重声明:本文版权属原作者所有    本文重在收藏和学习

原文地址:http://www.cnblogs.com/zengezenge/archive/2007/08/01/838812.html

转载于:https://www.cnblogs.com/yonge/archive/2011/11/25/2262525.html

颠覆传统-面向对象的设计思想(序章续)相关推荐

  1. 面向过程和面向对象的设计思想、java类、Java类的定义、java对象、对象的创建和使用、类和对象、变量分类、方法分类、构造方法、方法的重载

    1.面向过程和面向对象的设计思想 面向过程:procedure oriented programming 缩写 POP. 分析出解决问题所需要的步骤,然后把步骤一步一步实现. 面向过程直接关注流程. ...

  2. java面向对象的设计思想,java设计形式之面向对象的思想(think in OO(Object Oriented))...

    java设计模式之面向对象的思想(think in OO(Object Oriented)) 面向对象的概念: 就是用对象的思维方式,抽象生活中的事物,设计程序,其基本思想是使用对象,类,继承,封装, ...

  3. 响应式设计课程(序章)

    第一课时 响应式开发概要 1.什么是响应式网页 2.Web开发常用工具 3.响应式开发中的媒体查询@media 3.1不同断点区间的媒体查询语句的书写 1.什么是响应式网页 在前端开发过程中,为解决网 ...

  4. DDD的创新思想:开发即设计思想

    领域驱动设计(DDD)和微服务架构(MSA)近年来非常火热,尤其是在互联网公司的生产实践过程中.微服务架构为互联网公司自身业务的发展壮大提供了技术支撑,日渐显现出解决复杂业务需求的威力.更多的IT公司 ...

  5. Linux设备驱动的分层设计思想

    1.1 设备驱动核心层和例化 在面向对象的程序设计中,可以为某一类相似的事物定义一个基类,而具体的事物可以继承这个基类中的函数.如果对于继承的这个事物而言,其某函数的实 现与基类一致,那它就可以直接继 ...

  6. java面向对象编程的思想_java面向对象编程思想

    Java与面向对象 一.类与对象 (1)对象是Java程序的核心,对象可以看成是静态属性(成员变量)和动态属性(方法)的封装体 (2)类是用来创建同一类型的对象的"模板",在一个类 ...

  7. C++ 软件设计思想

    一,如何设计出优秀的软件系统? 优秀的软件系统,必须是易扩展.易维护.高可复用性的.要做出这样的系统,就要采用面向对象的设计思想.如果我们的设计仅仅符合面向对象的三大特征,这并不是很好的面向对象的软件 ...

  8. 17、Java中的面向对象的编程思想

    Java中的面向对象的编程思想 作者:韩茹 公司:程序咖(北京)科技有限公司 程序咖:IT职业技能评测平台 网址:https://www.chengxuka.com 任务 1. 面向对象 2. 面向过 ...

  9. PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则

    2019独角兽企业重金招聘Python工程师标准>>> 第二章 面向对象的设计原则 2.1 面向对象设计的五大原则 单一职责原则 接口隔离原则 开放-封闭原则 替换原则 依赖倒置原则 ...

  10. 《SolidWorks 2014中文版完全自学手册》——第1章 SolidWorks 2014入门 1.1 SolidWorks的设计思想...

    本节书摘来自异步社区<SolidWorks 2014中文版完全自学手册>一书中的第1章,第1.1节,作者:槐创锋 , 黄志刚著,更多章节内容可以访问云栖社区"异步社区" ...

最新文章

  1. log file switch (checkpoint incomplete)
  2. 【OpenCV学习笔记4】OpenCV GUI 之VCWin32+OpenCV 实现细胞计数
  3. 【NOIP模拟题】Incr(dp)
  4. mysql row 格式binlog 恢复_为什么要把MySQL的binlog格式修改为row
  5. Python 学习随笔
  6. P2并联cruise混动仿真模型 本模型基于Cruise软件搭建整车模型,基于Matlab/Simulink软件搭建整车控制模块,包括整车模式控制、扭矩分配、能量回收及机械制动等功能模块
  7. AutoCAD2004下载AutoCAD2004中文版安装教程
  8. 利用Bitvise SSH Client与proxifier实现SSH全局代理
  9. 普通正态分布如何转换到标准正态分布
  10. 图片打包下载,本地服务器打包文件下载,及线上图片地址下载
  11. Flutter中StatefulWidget生命周期小记
  12. dsolve 的 用法
  13. ctfhub中Git泄露-log
  14. Push rejected Push to origin/master was rejected
  15. java 使用jacob实现word转pdf
  16. spring源码解析(一)迈向学习spring之路
  17. 软件测试学习教程(一)-学习路线图
  18. 使用正则表达式去除斜杆(\)
  19. 想要成为黑客?那你需要学会这些知识
  20. linux c语言设置ip,linux 下用指令和C语言来设置IP,MASK,gateway

热门文章

  1. 七日Python之路--第十一天
  2. 计算机网络基础(二)
  3. 推荐制作精良的笔记软件Wire Note 应用键盘钩子技术获取即时数据 资料查阅的好工具 建立代码片段数据库...
  4. django 开发 - 小心模板文件的编码格式(utf-8)
  5. cc ai条码插件_科脉神秘黑科技产品横空出世,AI能为生鲜称重带来哪些变革?
  6. 二叉树 -- 5.1.1 Binary Tree Level Order Traversal-1 -- 图解
  7. c#json对象转数组_C#中将json字符串转为List数组对象
  8. 纽约出租车计费问题:数据清洗与初探
  9. 2018北理复试机试题
  10. 【实物】端到端自动驾驶搭建教程(一)附完整资料