面向对象技术能力等级杂谈
能把面向对象和具体语言的对象抽象联系起来
在面向对象刚刚入门的时候,一大顿理论加上解释又是只言片语,什么原则,方法等根本好像是没有用的嘛。唯一看明白的就是对象,类就是Class。在编程的时候,碰到一个名词就把它写成class,以为这就是面向对象编程。拿图书馆案例来讲,初步分析后可能就把我们的学生Student作为我们的Class来编程,并设计了它的属性,方法和操作,具体来说就是给Student加上了name属性,借书方法等。
仿佛面向对象技术就是这么简单,这时候就会怀疑面向对象语言书本上开头讲的什么封装,多态,继承等到底有什么作用,简直就是一大堆废话!?
这个时候如果去看Javascript那种面向对象技术的实现,简直由于地狱一般,忽然就有上当受骗的感觉,原来对象不止可以用Class来表示啊,还有其他的实现表示方法。
能把面向对象的方法运用到编程中
经过不断编程实践,武功已经从乱招到有招了。还是以图书馆为例,发现学生Student具有借书方法,Teacher也有借书方法。于是就想着能不只写一个借书方法,而Student和Teacher都有借书功能。这个时候我们的面向对象的方法包括封装,多态,继承等就派上用场了。我们可以简单吧Teacher和Student都可以从Reader这个类来继承,而Reader设计借书方法。
在这个阶段才发现原来面向对象的方法封装,继承,多态等还是有用的。不过封装,继承,多态这几个名词太抽象,要是有个具体的使用指南或者说能不能有个归纳这些方法的武功心法?
能使用设计模式
武功心法有没有呢,还真有。前人为我们准备上等的武功秘籍–设计模式。设计模式,这个堪比使用刀、枪、剑的武功秘笈,加以勤练必能武功大进。设计模式这种武功套路能灵活运用对象技术,把对象之间的关系,结构,行为和协作搞得一清二楚。
这个时候疑问有上来了,设计模式大师还给了一句金玉良言“优先使用组合,不要动不动就使用继承”。心里不仅就会寒蝉,大师给我武功心法,到头来还给我留了一招。
能搞懂本质是什么
我们在运用面向对象技术的时候,是用类概念从内部结构,行为来运用,来设计实现计算逻辑。
有很多的时候我们不能准确把握一个事物的本质,可能就是光从一个角度来看问题。既然从内部看了也实践了,那么现在就可以从外部角度来观察事物。对象有它的环境,在环境中分工合作,这个就像我们的现实社会,人与人之间,人和大自然都是分工协作,和谐共处的。
话题扯远了,再回到我们的程序世界中,假如有一天我们要去社区办个什么事情,去影院看个什么电影等等这些都可以抽象,建立一个模型,我们去社区办事,电影院看电影都是去享受服务的,把这些服务的提供者都抽象到程序世界中,就可以用类来表示同时提供办事、看电影等行为。社区办事,影院看电影这两个风马牛不相及的事情,在程序世界可以抽象成两个提供不同服务的对象。从契约的角度,任何实现了这些服务的对象,都需要履行服务契约,从对象外部来讲我们是不需要知道这些对象内部的,也就是我去办事情,看电影,关键不是在什么地方能够把握解决这些问题,而是什么服务能提供给我以完成目的。
试想有一天去看电影的同时也能把社区办事的给解决了。那么就不能光光用类这个抽象事物来表示和思考,另外还有一个东西在设计模式中没有明显提到的,就是几乎每种模式里面都有两个层次,一个就是Abstract层次,一个就是Concrete层次。说白了就是对象的上面还有一个接口的东西,这里暂且不论Interface和Abstract Class的区别。这个时候想想那句“优先使用组合”的锦囊妙计,那么既能办事又能看电影的超级英雄便能应运而生,当然在分析的时候我们不需要具体知道这个到底是什么地方来提供这些服务的,只需要设计办事和看电影两个接口就可以了,至于谁来实现这个服务,I don’t care.
能灵活运用面向对象技术在编码,设计,分析等领域中
我们在使用面向对象技术去解决具体问题的时候,不及不觉就把这个武功练得如火纯清。面向对象技术已经从起步阶段把面向对象理解为就是把名词转化成类Class这种基础的理解,上升到能够从现实社会体验面向对象的真正含义。每个人都有分工,我们也是社会系统的一个对象,我们也需要对外提供一个服务。比如我可以是一个编码对象,我专门负责把程序的设计转化成编码,这个就是我提供的服务。可是光光有编码对象还不行,还需要有设计对象提供设计服务,分析对象提供分析服务。术业有专攻,编码对象可以不断学习,可以往深度方面发展,也可以往横向发展。
总结
最后我想用上面的层次图来表示面向对象技术,最外面的一层是技术在编码,设计,分析等领域的具体运用,然后是面向对象语言层次,初学者在学习的时候往往从这个层次进入,而且极容易造成理解片面。然后是设计模式这种武功套路,虽然套路只是形式,但是对于刚刚面向对象需要提升的时候,还是很有用处的,可以作为行动指南。接下来的层次就是面向对象本质的理解,SOLID原则运用,封装,继承,多态等方法的灵活运用。