李笑来一直强调概念的重要性,这两天参加培训,对“面向对象”这个概念进行了深入的思考。
几乎每一本“xx从入门到精通”编程书籍的开头都会说这个概念,基本上都是一翻而过,然后就是从入门到放弃了。
首先,编程是什么?它是在计算机中模拟外部世界的实现,需要把外部世界的逻辑、数据进行抽象。根据需要描述的外部世界的具体情况来选择适当的抽象方式。搬运货物这个事情,如果货物固定、路线固定,就可以简化为一个过程:抓取、运输和卸下。这时候,用C语言这种面向过程的语言来抽象就很合适。但如果每次货物的形状不一、重量不同,路上需要躲避各种障碍,这时候也许面向对象就是一个好选择。
其次,面向过程和面向对象只是思考问题、抽象世界的手段。它们具备不同的适用范围,面向对象更擅长于描述交互复杂、种类多样的世界,因为它具备封装性、继承性、多态性。封装性是指对外只暴露必须的接口,便于维护与调用。继承性是指可以对类似的事物抽取公共属性形成基类,然后这些事物继承于它,可以实现更好的复用。多态性是指继承者可以重写基类的接口和函数的重载,实现了适应性的变异。
最后,使用任何方法都没法避免复杂事物的复杂性。如果一个事物本身是十分复杂的,选用适当的工具可以逐步条分缕析进行描述。但不存在一个神奇的方法让它立即化繁为简,工作量不可少。正因为如此,伴随着面向对象概念,UML实践也需要跟进,各种图形也是不可跳过的步骤。