OO设计
评OO设计
昨天在微博上看到InfoQ提供了一本新书《完美软件开发:方法与逻辑》的PDF迷你版,这本书的介绍吸引了我:
这书是培养帅才的书。如果想成为一方悍将(比如:C++高手,Android高手),那这书是不太适合的;但如果想鸟瞰全局,运筹帷幄,带领团队攻城略地,那这书是很有参考价值的。
我重点看了它的第7章“完美设计和编码之解构”,应该说这是一本好书,但是对我来说总体上没有什么新的收获,作者对软件设计的理解和我两三年前比较类似,而最近两年我对软件设计的理解发生了很大的变化。从书的内容看得出,作者受OO方法影响很大,我也经历过这个阶段,所以,今天想通过这篇博文谈谈我对OO方法的看法。
我喜欢从道、术、灵3个角度看技术。道是事物的本质,是事物的共同性,修道最简单,一点就通,只需要悟性;术是具体技术和应用,修术比较难,需要长期积累和实践;灵是创造性,并由此产生事物的差异性,修灵最难,无规律可言,但它是道和术到达一定程度的自然产物。这里只讨论道的范畴,即主要探讨设计的本质和共同性。
所谓本质就是“变化中的不变”,所谓抽象也就是找到这个“不变”。我用提取公因子来比喻,假设你只有6、9两个数,你提取的公因子可能是3,并把3当成本质,但是其实1是更本质的,这时被你忽略了;当你有2、6、9三个数的时候,你突然发现3还不够本质,原来1更本质。这是个比喻,我不追求准确,目的在于比喻视野和广度的重要性。你的视野越宽涉猎范围越广越容易找到更深层次的本质。反过来,要检验你找到的本质是不是足够深,也要放到尽量宽的范围去。
两三年以前,我主要从事企业级软件开发,也认真学习和研究过OO方法,包括OOP基础理论、GoF设计模式、S.O.L.I.D设计原则、契约式设计、IoC原理等等,应该说对于OO方法的理解也代表我当时的阶段性水平。近两三年,我涉猎范围更加广泛,现在我系统底层、中间件、服务器、桌面/移动应用、Web什么都做。现在让我再回头看OO,就像找最大公约数的例子,它显然不是那个我要找的1,在谈论设计之道时,我已经基本上没有兴趣再谈OO了,就像我两三年前没兴趣谈“指针使用”这样的非设计的本质问题。现在如果让我来谈设计之道,OO的影子几乎都找不到;相反,如果我看到别人在谈设计之道时还在大量地围绕OO相关的话题来讨论,即使某些思路和传统方法不同,我还是感觉作者的视野和深度有进一步提高的空间。
Brooks讲的“根本任务是指打造构成抽象软件实体的复杂概念结构”没错,但是不论是面向过程还是OO方法都不是这一思想的最好体现。许多人也认识到软件设计是一个多维度、多层次的抽象过程,但是问题不在于这一认识本身,而在于如何定义这些维度和层次。基本上,我所了解的熟悉OO方法的人都很难脱离OO带来的思维局限,比如,不少人熟背“设计首先要抽象”,但是当他具体做设计的时候,一上来就定义了几个接口,几个基类,永远跳不出这个圈子,这就是各种OO设计模式和设计原则的副作用,它让人们潜意识里面把真正意义的抽象建模和OO的抽象建模混在一起。
有人用切蛋糕比喻软件开发,要把蛋糕切成8份,在1维空间需要切7刀,2维空间需要4刀,3维空间只需要3刀。所以,关键的问题在于如何选取下刀的维度。在我看来,OO方法基本上都属于这个比喻中的2维,好像比最笨的方法高明一点,但是其实远远不够。OO作为一种范式它本身代表了一定的抽象维度,在切蛋糕的比喻中就是下刀的位置。这种方法恰好碰对了问题的时候也是有的,比如,如果问题是让你切成4块,这种方法就完美了。但是,OO的根本性问题在于它不是从问题本质出发,而是强行地把实体、实体间关系、继承、子类型等概念往问题上加。
我们在评价一个方法是不是好方法的时候一定要坚持价值判断,即这种方法带来的软件“开发量、可读性、可维护性、可扩展性、可测试性”和其他方法比怎么样?我对OO以及相关各种方法的评价是:有一定价值,但远远不够。
architecture
评OO设计
posted @ 2013-11-26 11:19 Todd Wei 阅读(713) | 评论 (4) 编辑
程序的本质复杂性和元语言抽象
posted @ 2013-10-28 17:09 Todd Wei 阅读(1284) | 评论 (11) 编辑
需求变化与IoC
posted @ 2012-03-24 17:55 Todd Wei 阅读(5284) | 评论 (20) 编辑
MVCC思想在分布式系统中的应用
posted @ 2012-03-13 07:35 Todd Wei 阅读(2582) | 评论 (6) 编辑
海量用户积分排名算法探讨
posted @ 2012-03-01 10:05 Todd Wei 阅读(12536) | 评论 (53) 编辑
理解HTTP幂等性
posted @ 2011-06-04 20:51 Todd Wei 阅读(10604) | 评论 (20) 编辑
系统的层次性与单一职责原则
posted @ 2010-09-11 14:27 Todd Wei 阅读(1604) | 评论 (13) 编辑
系统的维次与层次
posted @ 2010-07-11 00:25 Todd Wei 阅读(1164) | 评论 (1) 编辑
REST构架风格介绍之二:CRUD
posted @ 2009-05-09 09:11 Todd Wei 阅读(2106) | 评论 (4) 编辑
REST构架风格介绍之一:状态表述转移
posted @ 2009-05-08 01:38 Todd Wei 阅读(3860) | 评论 (21) 编辑
3层构架.NET还缺点儿什么?
posted @ 2008-10-12 12:04 Todd Wei 阅读(3255) | 评论 (20) 编辑
OO设计的更多相关文章
- OO设计原则 -- OO设计的原则及设计过程的全面总结
这部分增加一点自己的感想,OO设计原则下面讲述的很清晰;看完之后有点感想如果我们在实际开发当中能够把这些原则熟烂于心的话那我们的代码质量和个人能力会有很显著的提神.根据自己的实际经验看很多开发者在开发 ...
- 常用的OO设计原则
常用的OO设计原则: 1 封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起. 2 针对接口编程,而不是针对实现编程. 3 多用组合,少用继承. 4 松耦合:为了 ...
- OO设计基本原则
OO本身就是一种大的设计模式,它是随着软件规模越来越大产生出来帮助人们建模和开发的理念,生来就带着封装.继承.多态等可复用基因.为了充分发挥这些基因的功效,使用者需要遵守一定的原则,就是所谓的面向对象 ...
- 动态变化的OO设计
今天看到个题目:对象会动态的变化. 游戏精灵,有人和神仙,但是随着人的不断积分,会升级为神仙:神仙也可能会因为积分的减少而降级为人.这种情况怎么画出个类图来. 这是第一版的设计,正常思维.人和神仙都是 ...
- HIS系统患者实体OO设计的一点思考
软件开发的生命周期中,数据库建模后,在某个数据库系统中形成相对应的表,之后再根据数据库模型设计相关的业务对象及其关系.这其实是进行了两次设计,一次是数据库模型设计,数据库模型设计是根据现实业务提取出来 ...
- OO设计原则
开闭原则(OCP) 里氏代换原则(LSP) 依赖倒转原则(DIP) 接口隔离原则(ISP) 合成/聚合利用原则(CARP) 迪米特法则(LOD)
- 鸡和蛋的OO设计
一个题目:用类图表示出鸡和蛋的关系. 第一版: 第二版: 一个鸡可以下N个蛋,一个蛋可以浮出0或者1个鸡. 问题是公鸡不会下单,第三版:
- 设计模式——如何避免在OO设计中违反依赖倒置原则
1 变量不可以包含具体类的引用.一旦new,就对具体类产生依赖,用工厂模式来避开. 2 类不要派生至具体类.用派生抽象类避开. 3 不要覆盖基类已经实现的方法.基类中已实现的方法应该由所有子类共享.
- 【设计模式系列】之OO面向对象设计七大原则
1 概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2 七大OO面向对象设计 2.1 单一 ...
随机推荐
- Nyoj 修路方案(次小生成树)
描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. 现在已经知道哪些城市之间可以修路,如果修路,花费是多少. 现在,军师小工已经找到 ...
- unity3d NGUI入门(描述和使用插件参数)
我用NGUI它是3.5.4,Unity3d版本号是4.3.4f需要 NGUI3.5.4 下载NGUI,这是破解版的,用于学习.假设是商用.请支持正版 插件的导入 1.NGUI的导入,双击NGUI Ne ...
- mysql_navicat_快捷键
快捷键能节省很多时间,之前一直研究oracle,plsql有自定义自动补全, 比如 sf 直接回车 可以出现 select * from 等等(参照http://www.cnblogs.com/cph ...
- 私人定制javascript中对象小知识点(Only For Me)
废话不多讲,先上笑话,然后再,.看懂这个的说明你的节操已经不再了. 晚饭后去理发店理发...割了吧...老板问我怎么剪,我悠悠的来一句往帅了剪...高潮往往令人想不到....旁边一在焗油烫头发的大妈说 ...
- EasyUI Combobox 默认设置
/** *绑定运营商,默认设置, 演出CMCC, 传统的价值观念1 */ $('#operatingId').combobox({ url:'data_url', valueField:'id', t ...
- Redis源代码分析(一)--Redis结构解析
从今天起,本人将会展开对Redis源代码的学习,Redis的代码规模比較小,很适合学习,是一份很不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望终于能把他啃完吧,C语言好久不 ...
- SVN & Git (一)
(一)SVN的使用.CornerStone图形化管理工具! SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. ...
- FPGA 异步时钟处理方
1 假设FPGA设计,包括不同的频率的时钟,它会发出涉及异步时钟. 我们需要一些方法来使时钟同步,从而保证FPGA可靠性设计. 2 在建立和保持时间所构成的有效时间窗体内,数据输入到触发器进行转换. ...
- .net 伪静态、真静态 (mvc)
MVC 模式下的伪静态: 通过路由就可以搞定 首先说下路由规则,允许多个路由规则,会从上之下寻找匹配 伪静态: 如果只写一个路由 那么 所有页面都必须是 html 结尾. 如果再加一个路由 就都支持了 ...
- C#中实现WebBrowser控件的HTML源代码读写
原文:C#中实现WebBrowser控件的HTML源代码读写 C#中实现WebBrowser控件的HTML源代码读写http://www.blogcn.com/user8/flier_lu/index ...