目前编程范式有三种:面向过程,面向对象,函数式编程。 所有代码最终会转换成汇编,二进制到CPU里一条条的执行,所以编程语言最终目的就是提高硬件运行效率和程序员开发效率,而两者不可兼得。但是在软件开发中面向对象是主流,面向对象语言是更接近人类语法的语言,所以又叫高级语言。面向过程以过程组织代码,面向对象则是数据和方法的分离,更有丰富的面向对象特性。不过面向过程是接近机器逻辑的语言,运行效率更高,在硬件和系统开发中,面向过程语言还是主流。 既然面向过程运行效率更高,为什么不用面向过程语言开发呢?
- 对于大规模复杂的程序开发,程序逻辑错综复杂的网状结构,面向对象比面向过程更能应付这种复杂的开发。
- 面向对象比面向过程有更丰富的特性:封装,抽象,继承,多态。利用这些特性更容易扩展,复用,维护。
从另个角度看,随着硬件越来越便宜,从以前内存几M到现在几G甚至十几G,程序员不用死扣每一寸内存。虽然面向对象没有面向过程运行效率高,但是提高了开发效率,空间换时间,自然面向对象更加流行。
面向对象
理解面向对象关键就是理解四大特性:封装,抽象,继承,多态,不同的语言通过不同的方式提供四大特性。
封装
封装就是数据访问保护,外部只能通过类授权的接口访问数据,例如private关键字。封装的意义是保护数据不被随意修改,仅暴露必要接口。iOS开发中有许多私有属性方法就是封装的体现。
抽象
抽象就是隐藏方法的具体实现,让使用者只关心类提供了哪些方法,而不需要知道如何实现的。iOS中打包后的swift文件和.h就是抽象的体现。
继承
继承是表示类之间的is-a关系,分为两种模式:单继承和多继承。iOS里不支持多继承,但是可以通过代理,组合,分类实现。
多态
多态指子类可以代替父类,子类可以调用父类方法。多态可以提高代码的扩展性和复用性,是很多设计模式,设计原则,编程技巧的代码实现基础。OC里通过runtime来实现,元类里维护一个方法list,子类里找不到去父类找。
所有的面向对象语言都包含以上4大特性,但是底层实现不一样,掌握语言的底层实现对灵活使用4大特性非常有用。 了解面向对象后,还有几个原则必须掌握,避免不自觉的面向对象写成面向过程而不自知。
基于接口而非实现编程
做开发时候,一定要有抽象,封装,接口意识。越抽象,越脱离业务实现的设计,越能提高代码的复用性,扩展性,维护性。通常网络接口封装能提现基于接口而非实现编程思想。
多用组合少用继承
继承可以代码复用的作用,但是过深复杂的继承影响代码的维护性,建议继承必要超过3层。对于复杂的情况,使用组合既能表示is-a关系,实现多态特性,代码复用,又能减少层次过生,关系过复杂影响代码维护性。在MVP和MVVM中viewmodel和ctr就是一种组合关系,不仅使UI和逻辑分离,ctr使用不同的viewmodel实现不同的应用场景。
贫血模式和充血模式(DDD)
贫血模式是业务逻辑和数据分离,充血模式相反业务逻辑和数据结合是领域驱动开发。贫血模式使用成本低,大部分都是使用贫血模式。充血模式在业务稳定,封装数据,复用更有优势,一半SDK开发就是充血模式。
上面就是面向对象的4大特性,三种思想。这些也是一个优秀的开放人员必须熟练掌握,许多设计模式都大量使用到上面几种特性。