Pulpcode

捕获,搅碎,拼接,吞咽

0%

从面向对象到设计模式

《thinking in c++》这本书上,作者将一段代码先用c去实现,然后再用c++来重写它,通过这种方式来论述c++在面向对象方面的优点。

这里可以看出,其实C也可以写出“面向对象”的代码,只不过非常蹩脚(据说当年oop正当流行的时候,将汇编代码设计成oop的),因为它不支持这些语法特性。

而支持面向对象的语言可以将面向对象的功能做的很好。而作为支持面向对象的语言,如果面向对象编程都不能解决复用性和可维护性等问题,这个时候就需要使用设计模式了。

也许将来会有一种语言直接支持设计模式吧。

面向对象是什么

教科书会告诉你,面向对象是“封装,继承,多态”。所谓封装,就是为了隐藏一个对象的实现细节,对外提供接口。而继承,是为了提高软件的复用性,父类的属性和代码可以直接继承,不用重复编写。多态,则是在运行时通过对一个对象指针赋不同的对象,而表现出多种形态。

但其实,就目前我对面向对象的理解而言,我觉得建模才是面向对象最基本的东西。这一点我在写orm的时候深有体会。因为面向对象编程,其实就是在建立对象之间的关系,让这些对象之间相互发送消息。

当然,面向对象编程不局限于orm之类的建模,比如大量的handle类,controller类。主要封装代码,具体的算法设计实现。

就语言而言,支持oop的语言,可以提供给你编写面向对象代码的基本元素。

比如你可以设计一个类,然后用这个类来创建对象,或者把这个类当作父类,去被继承,被重用。还可以已它的类型创建指针,指向它的子类对象,实现多态。

或者你可以设计一个基类,主要用于继承。或者设计一个没有属性,只有虚函数的类,这其实就是接口了。

再比如public,protected,private这些关键字就是控制一个对象的访问权限,也可以控制继承方式,是公有继承,还是私有继承。

设计模式是什么

之前说过,面向对象的语言,提供类,基类,接口等基本的元素供你使用,直接使用它们是没问题的。但是项目变得更大更难以维护的时候,就需要在面向对象的基础上,使用设计模式了。

比如说,抽象类继承后能够获得很高的重用性,但是很不灵活,直接实现接口,能够带来灵活性,但是接口里面什么都没有,所以无重用性可言。不是直接使用,而是组合这些功能特性,解决更大的软件问题,这就是所谓的设计模式。

从面向对象到设计模式

其实我一直觉得,越是高等的越专一,也是原子的越灵活。比如设计模式能够处理等大的软件问题,但是它做的事情也就更专一了,只能解决更局限的问题了。

而那些语言提供的基本元素,本身确实是基础。所以我们的代码都离不开这些元素,但是原子的东西,确实是因为它什么都没有,所以它才什么都能干。

多用组合,少用继承

设计模式中常常会说“多用组合,少用继承”。

其实原因是继承的重用性是静态的,而组合的重用性是动态的。为什么这么说呢,因为继承就是在使用基类来定义另一个类,在写好这个类之后,就“定死了”。这种重用感觉就像是减少了赋值粘贴重复的地方。

而组合可以在运行的时候,”随意“设置一个对象的属性,让它表现出多种形态。