最近参与了一个面向对象程序设计(以下简称OOP)的培训,这两天才有空整理一下思路,现在拿出来给大家来分享。本文旨在说明以何种方式学习OOP,文中如有不当之处还请大家指正。
上周看到一个人的帖子,大致的意思是对OOP中的一些概念很困惑,不理解什么是“面向对象的五个特性”或“三个原则”。说实话,最早我对这些概念的认识是背下来的,如果有人问,答得很流畅;后来发现这些概念很空洞,不知道在说些什么,这时候就答不上来了;直到现在,也不该完全保证对这些概念完全了解,只能结合具体的应用说出个一二。
这也是我对OOP的学习认识过程,以下就是这过程中总结的经验,如下:
1.任何OOP都有其独特的场景,离开了场景,一切设计都可能毫无意义;同样,也不能假设场景,因为任何人都不能把握下一步会是什么样子。这就好比收割麦子,除了要知道麦子熟了之外,还要了解交通等状况。不然等你开着收割机去收割的时候发现山路崎岖,收割机根本进不了田。我之前做过一个优化项目。该项目一要支持很多厂家的设备,二对性能要求很高,三时间有限。经过再三讨论后,公司决定将影响性能的算法用C++实现,将影响兼容性的部分用C#实现。结果,算法中丝毫没有用的OOP,交互部分充满了OO设计。最终该项目比较成功的完成了。
2.OOP的实现在不同平台下有不同的呈现方式,脱离平台,依葫芦画瓢最总结果是不论不类。举个例子,C#,Java以及C++是现在主流的三种OO语言,从可维护性,可扩展性等多方面出发,如果用这三种模式去实现一个工厂,其最终结果必有差异。Java和C++差异不大,但经过优化后的C#实现方式与前者有很大的不同,因为C#中可以有反射的加入使设计模式出现了很大的改观(个人认为虽然反射破坏了OOP,但其带来的好处足以掩盖其不足,说到底它是双刃剑,就看怎么用了);
3.OOP是程序设计的一个分支,有长有短,有它特有的职能,与其他程序设计理论有同等的地位,他们相互补充,没有高低贵贱之分。在一个公司的软件系统中,面向过程,OO,SOA甚至AOP等同时存在相当普遍。相信做SOA的人都了解,SOA中每个业务的实现可能是用OOP的方式,但SOA本身却不是;同样,过程语言C今天依旧流行;
4.OOP是人经验的积累,并不是一成不变的。这句话的意思很简单,论坛中每个人在发表自己的见解时,不管这个观点正确还是错误,愚蠢还是高明,都是在表达一种软件开发技术思想。这时候,如果你的思想能够成功的解决某一领域中的难题,那么你的观点就进入的教科书,供更多的人研究学习。面向对象的三个原则,五个特性就是这么来的,它们并不是圣经,它们一样需要不断加入新鲜血液。到目前位置,最经典的血液就是设计模式了。同样,研究过设计模式的人都知道设计模式不仅是四人组的23种,还有很多。但是一旦结合的具体的语言平台,适合的就不多了。所以在学习的时候一要踏实学习,二要不拘泥与字面,三要大胆假设,勇于改进,加入自己的观点;