代码改变世界

OOP的几个原则-----DIP:依赖倒置原则(下)

2012-03-16 23:28 by 宅的一米, 344 阅读, 0 推荐, 收藏, 编辑
摘要:我们来看一个有关一个类向另一个类发送消息的示例:Button对象感知外部环境的变化,当接收到Poll指令后,它会控制Lamp对象的显示或熄灭.如何设计一个用Button对象控制Lamp对象的系统呢?通常我们会按照下图的意思去实现这个功能.在这里,Button类直接依赖于Lamp类,当它接收到Poll消息后,判断按钮是否被按下,接着简单的发送TurnOn或者TurnOff消息给Lamp.按照这样的实现,当Lamp类改变时,Button类会收到影响.此外想让Button控制一个Motor对象是不可能的,它只能控制Lamp对象.这个方案违反了DIP.应用程序的高层策略没有和低层分离.抽象没有和具体. 阅读全文

OOP的几个原则-----DIP:依赖倒置原则(上)

2012-03-14 06:46 by 宅的一米, 266 阅读, 0 推荐, 收藏, 编辑
摘要:DIP原则的定义是:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象.很多时候,一些传统的开发方式比较倾向于创建一些高层模块依赖于低层模块,策略依赖于细节.实际上这些方法的目的之一就是要定义子程序的程序层次结构,以描述该层次的高层模块如何调用低层模块.考虑下这些高层模块意味着什么?正是高层模块包含了应用程序中重要的策略选择和业务模型.这些高层模块使得所在的应用程序区别于其他.然而,如果这些高层模块依赖于低层模块,那么对低层模块的改动就会直接影响高层模块,从而迫使它们依次做出改动.此外,我们都希望能够重用高层的策略设置模块.我们已经经常通过子程序库的. 阅读全文

OOP的几个原则-----LSP:Liskov替换原则(下)

2012-03-09 02:47 by 宅的一米, 280 阅读, 0 推荐, 收藏, 编辑
摘要:LSP让我们得出一个结论:一个模型如果孤立的看并不具有真正意义上的有效性.最后那个版本的Square类和Rectangle类是自相容并且有效的,但是从Rectangle类作出合理假设的角度看,这个模型是有问题的.所以模型的有效性只能通过它的客户程序来表现.那么是什么原因导致Square和Rectangle这个显然合理的模型出现问题?难道Square和Rectangle不存在IS-A的关系吗?对于那些不是g函数的编写者来说,正方形可以是长方形,但是从g函数的角度来说,Square绝不是Rectangle对象,因为Square对象的行为方式和函数g所期望的Rectangle对象的行为方式不相容,. 阅读全文

OOP的几个原则-----LSP:Liskov替换原则(上)

2012-03-08 00:54 by 宅的一米, 374 阅读, 0 推荐, 收藏, 编辑
摘要:LSP的定义是:子类型必须能够替换掉它们的基类型.OCP主要的机制是抽象和多态.而LSP探讨的问题是如何构建最佳的集成层次,它们的特征是什么?如何避免使我们创建的类层次结构掉进不符合OCP的陷阱中去.Barbara Liskov在1988年首次提出这个原则:若对类型S的每一个对象O1,都存在一个类型T的对象O2,使得在所有针对T编写的程序P中,用O1替换O2后,程序P的行为功能不变,则S是T的子类型.按照这个原则我们可以大致推导出这样一段代码:View Code classProgram{staticvoidMain(string[]args){So1=newS();P.Show(o1);C. 阅读全文

OOP的几个原则-----OCP:开闭原则(下)

2012-03-05 23:44 by 宅的一米, 365 阅读, 0 推荐, 收藏, 编辑
摘要:上一篇着重介绍了开闭原则的概念,通过类图我们可以看出,如果不对Client和Server类进行解耦,当Client类需要使用另外一个Server类时,必须对相关代码进行修改.导致不必要的僵化性和脆弱性.下面将通过一个渐进的示例来展示如何运用开闭原则:1.客户需要有一个在标准GUI上绘制圆应用程序.Circle类View Code classCircle{privateGuid_id;publicCircle(){_id=Guid.NewGuid();}publicvoidDraw(){Console.WriteLine("ID:{0}圆形绘制",_id.ToString(& 阅读全文

OOP的几个原则-----OCP:开闭原则(上)

2012-03-05 01:32 by 宅的一米, 525 阅读, 0 推荐, 收藏, 编辑
摘要:开闭原则的定义是:软件实体(类/模块/函数)应该是可以扩展的,但是不可以修改如果程序中的一处代码修改产生连锁反应,导致一系列相关模块的修改,那么设计就具有僵化性.开闭原则建议我们对系统进行重构,这样以后对系统在进行同样的改动,就不会导致更多的修改.如何正确使用开闭原则,那么以后再进行同样的改动时,只需要添加新的代码,而不必改动正常运行的代码.遵循开闭原则的模块主要有两个特征:1.对于扩展是开放的:意味着模块的行为是可扩展的,当应用程序发生变化时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.换句话说我们可以改变模块的功能.2.对于修改是封闭的:对模块进行扩展是,不必改动模块的源代码或. 阅读全文

OOP的几个原则-----SRP:单一职责原则

2012-02-29 22:29 by 宅的一米, 686 阅读, 0 推荐, 收藏, 编辑
摘要:单一职责原则的定义是:一个类应该只有一个发生变化的原因.为什么需要将不同职责分离到单独的类中?每个职责都存在一个变化点,当需求发生变化时,该变化会反映为类的职责变化.如果一个类承担了太多的职责,那么引起它变化的原因就会有多个.同时,一个类承担太多职责,说明这个类具有很强的耦合性,如果依赖的模块越多,当该类发生变化,脆弱性就越严重.考虑一个示例,有两个应有程序使用Rectangle类,其中一个应用程序是有关计算几何方面的,利用Rectangle类计算几何形状,但不会绘制在屏幕上.另外一个应用程序是关于图形绘制的,它可能也会进行一些几何计算方面的工作,并在屏幕上绘制矩形.下面代码是我的一个实现.. 阅读全文

关于软件设计臭味的一些解释

2012-02-28 01:38 by 宅的一米, 338 阅读, 0 推荐, 收藏, 编辑
摘要:1. 僵化性a) 定义:僵化性是指难以对软件进行修改,即使是简单的改动.b) 表现:如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计是僵化的.必须要改动的模块越多,设计就越僵化2. 脆弱性a) 定义:脆弱性是指,在进行一个改动时,可能会导致程序的许多地方出现问题b) 表现:出现新问题的地方与改动的地方没有概念上的关联,要修正这些问题又会引起其他问题3. 顽固性a) 定义:设计中包含了对其他系统有用的部分,但是要把这些部分从系统中分离出来所需要的努力和风险是巨大的.b) ... 阅读全文

Web 服务寻址 (WS-Addressing)

2012-02-27 00:49 by 宅的一米, 1127 阅读, 0 推荐, 收藏, 编辑
摘要:转载自MSDN技术文章中的Web 服务寻址 (WS-Addressing) Web 服务寻址 (WS-Addressing) 发布日期 : 4/1/2004 | 更新日期 : 4/1/2004 由Adam Bosworth,BEA, Don Box,Microsoft(编辑), Erik Christensen,Microsoft, Francisco Curbera,IBM(编辑),... 阅读全文