面向对象,还是面向对象

前一阵子闲暇,看了几本面向对象的书,在工作的时候也尝试了一下面向对象的分析与设计,理论和时间一结合,感觉受益匪浅,也想写点东西,后来,项目一忙,就把这事给忘记了。

最近为了写一个界面友好一点的驱动测试程序,我又拾起了MFC。说实在,以前我就感觉MFC就是一些控件,所以以前也没认真看看,只是了解一点皮毛。以前主要写一点控制台应用程序,后来就转入驱动程序的开发了,不过这几天尝试了一下MFC,发现并不像我以前想象的那样,因为我做的那个测试程序实在是不怎么的,自我很不满意。看了一点资料之后,我才发现,MFC程序设计,原来也是面向对象啊,呵呵,这个相对而言,我就感觉亲切了许多,接受起来速度也快了不少。经过这件事,我感觉还是得把学的那点有关面向对象的东西整理整理,总结一下,也算自己的一点经验吧!

提起面向对象,我们就不得不说面向对象的三大特征:封装、继承、多态。

封装,其实就是保护对象本身的个人隐私,私有资源只有我能调用,如果你想使用,告诉我,如何合适的话(有接口)我可以内部执行。另外,你想请我做什么,告诉我就行了,怎么做是我自己的事情,你没必要知道。从另外一个角度,这也是对象本身生存的根本--有什么本领。

继承,有点像遗产,老子打下的江山,儿子可以继承,不过,这也是有限制的。本领(方法)你尽管学,这点可以全部交给你;至于资源(属性),这点要区别对待,公开的和受保护的,你也可以使用,私有的嘛,你还没那个权力,举个不恰当的例子,就像儿子不能继承老子的老婆(涉及伦理问题,呵呵)。

多态,就是一个方法有多个实现方式。给我的印象就是C#中的抽象类、C++中的虚基类或者虚函数。在基类定义的时候只声明而不实现,实现放到子类中。

另外,关于面向对象,我们也不能不提接口(Interface)。面向对象的特征在接口上也有很好的体现。接口有利于数据的封装,同样多态的实现也需要通过接口来实现。

面向对象的分析与设计,一个很有效的工具就是UML,因为它很直观,可视化。UML建模的工具比较成熟同时功能比较强大的就是IBM 的Rational Rose,也很老牌。除了这个之外,我还推荐一下StarUML这个工具,也蛮好用的,还是开源的,也不用注册什么的。

说完工具,下面说说设计中几个重要的原则。面向对象的分析与设计,说白了就是抽象呗!关键是怎么抽象,抽象的过程要遵循什么原则。

怎么抽象呢?按照工作流程。每一个软件项目都要牵涉到最终产品使用者的工作流程,我们可以通过使用者的工作流程,一步一步分析其中的Use Case和Actor。先分析商业模型,也算需求采集的过程,然后要把这些东西详细化、文档化,尤其是Use Case。分析完商业模型之后,下面就要考虑技术模型,毕竟有些商业需求是无法满足的。我们可以考虑技术解决方案,分析其中的技术要素,划定系统的范围。我个人感觉划定系统的范围非常重要,这关系到以后项目的成败。划定范围之后,进一步分析Use Case,写出更加详细的Use Case描述和Glossary。

我这里有一个用例描述的模板,贴上来与大家一起分享

 Use Case #1

描述

前提

触发

成功

终止

参与者 主要的

          次要的

过程 步骤(Step #) 简称<动作> 描述

 

 

变更 步骤(Step #) <动作> 描述

 

 

异常 步骤(Step #) <动作> 描述

 

 

抽象的原则,主要需要考虑这么几个:

1、 单一职责原则(SRP)

描述:就一个类而言,应该仅有一个引起它变化的原因。

应用:在构造对象时,将对象的不同职责分离至两个或多个类中,确保引起该类变化的原因只有一个。

带来的好处:提高内聚、降低耦合。

2、 开放-封闭原则(OCP)

描述:"对于扩展是开放的"(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,可以对模块进行扩展,使其具有满足改变的新行为。也就是说,我们可以改变模块的功能。"对于更改是封闭的"(Close for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。

应用:高级语言中的接口与虚拟类。带来的好处:提高灵活性、可重用性、可维护性。

3、 Liskov替换原则(LSP)

描述:若对每个类型S的对象O1,都存在一个类型T的对象O2,使得在所有针对T编写的程序P中,用O1替换O2后,程序P行为功能不变,则S是T的子类型。

应用:在实现继承时,子类型(subtype)必须能替换掉它们的基类型(base type)。如果一个软件实体使用的是基类的话那么也一定适用于子类。但反过来的代换不成立。

4、 依赖倒置原则(DIP)

描述:A .高层模块不应该依赖于低层模块。二者都应该依赖于抽象。B .抽象不应该依赖于细节。细节应该依赖于抽象。

应用:要依赖抽象,不要依赖于具体。即针对接口编程,不要针对实现编程。针对接口编程的意思是,应当使用接口和抽象类进行变量的类型声明、参量的类型声明,方法的返还类型声明,以及数据类型的转换等。不要针对实现编程的意思就是说,不应当使用具体类进行变量的类型声明、参量的类型声明,方法的返还类型声明,以及数据类型的转换等。

5、 接口隔离原则(ISP)

描述:不要强迫客户依赖于它们不用的方法。

应用:一个类对另外一个类的依赖性应当是建立在最小的接口上的。如果客户端只需要某一些方法的话,那么就应当向客户端提供这些需要的方法,而不要提供不需要的方法。提供接口意味着向客户端作出承诺,过多的承诺会给系统的维护造成不必要的负担。就说这么多吧!设计模式这本书还没看,最近有点忙,有时间一定看看。

PS:推荐两本书,个人感觉不错。

第一本:《Object-Oriented Analysis and Design》

副标题:Understanding System Development with UML 2.0

作者:Mike O'Docherty 全英文的,读书需要一定的英文功底和耐心,嘿嘿!网上有电子版的,书店似乎没有卖的

第二本: The Object-Oriented Thought Process (3rd Edition)

原出版社: Addison-Wesley Professional

作者: (美)Matt Weisfeld

译者: 张雷生;刘晓兵好像是人民邮电出版的,当时是在国图看的,记不清了。这本是中文的,很通俗易懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值