《松本行弘的程序世界》精彩书摘

来源:互联网 发布:p2p网络摄像机app 编辑:程序博客网 时间:2024/05/11 13:34

《松本行弘的程序世界》精彩书摘

以下是2011年4月份在复审《松本行弘的程序世界》期间,随手摘录发表在微博上的精彩书摘。虽然都是只言片语,也没有上下文,但几乎哪一段话读下来,都有让人猛然醒悟的感觉。我们常说“与君一席话,胜读十年书”。透过这寥寥数条简短的书摘,不难窥见《松本行弘的程序世界》是一座多么令人垂涎的编程思想宝库,更不难想象与身为Ruby语言之父的松本君促膝长谈会给你带来什么惊喜了。

Enjoy!

  • 像结构化编程解决GOTO语句的问题一样,引入受限多重继承是一个好方法。在Java语言中,这个方法就是接口,在Lisp或Ruby中,就是Mix-in。
  • 单一继承只能有一个父类。在现实中,一个公司职员同时也可能是一位父亲,一个程序员同时也可能是一位作家。于是,多重继承的思想就这样诞生了。多重继承与GOTO语句比较相似,但因其极为灵活会导致复杂性。多重继承除了会导致结构复杂,还会导致优先顺序模糊、功能冲突的问题。
  • 有了数据抽象,程序处理的数据就不再是单纯的数值或文字这些没有具体内容的东西,而变成了人脑容易想象的具体事物。而代码的“抽象化”则是把想象的过程“具体化”了。这种智能数据可以模拟现实世界中的实体,因而被称为“对象”,面向对象编程也由此得名。
  • 程序里不仅包含控制结构,还包含要处理的数据。结构化编程虽然降低了流程复杂性,但随着数据增加,程序复杂性也会上升。面向对象编程就是作为对抗数据复杂性的手段出现的,其核心是数据抽象。数据抽象就是要使用事先定义的方法操作数据,数据和处理方法结合起来成为一个黑盒子。
  • 针对程序控制流的复杂问题,结构化编程采用了限制和抽象化的武器。实践证明,结构化程序设计是成功的,现在几乎所有编程语言都支持结构化编程,结构化编程已经成了编程的基本常识。
  • 在结构化编程出现之前,可以用GOTO语句来控制程序的流程。而结构化编程只用顺序、分支和循环3种语句来控制流程。一方面降低了程序流程的复杂性,另一方面引入了较为抽象的处理块(例程)的概念,也就是把基本相同的处理抽象成例程,其中不同的地方由外部传递进来的参数来对应。
  • 软件开发的最大敌人是复杂性。最初挑战这种复杂性的是“结构化编程”。结构化编程的基本思想是有序地控制程序执行流,即把程序执行顺序限制为顺序、分支和循环这三种,把共通的处理归结为例程。
  • 面向对象编程方法和编程语言一样在不断地演变发展。1994年,当时主要的面向对象分析和设计方法Booth、OMT以及OOSE的发明人Grady Booch、Jim Rumbaugh和Ivar Jacobson合作设计了UML。UML是用来描述通过面向对象手法设计的软件模型的图示方法,也是利用该方法法分析设计的方法论。
  • 面向对象的发展历史5。强调与C语言兼容的C++能够写低级的方法,这样有利也有弊。为了克服低级语言的缺点,20世纪90年代Java语言应运而生。Java放弃了和C的兼容性,增加了Lisp中一些好的功能。此外,通过Java虚拟机,Java程序可以不用重新编辑而在所有操作系统中运行。
  • 面向对象的发展历史4。1980年代,世界上很多地方都在研究面向对象。贝尔实验室的Bjarne Stroustrup为了把C语言的高效率和Simula的面向对象结合,在C语言中追加了面向对象功能,开发了“C with Class”,也就是后来的C++。
  • 面向对象的发展历史3。麻省理工学院及周边地区在Lisp语言中发展了面向对象思想。Lisp有浓厚的数学背景,本身有很强的扩展性,由此产生了很多创新。多重继承、Mix-in和Multi-method等等,许多重要的面向对象概念都是从Lisp的面向对象机制中诞生的。
  • 面向对象的发展历史2。Simula的面向对象思想被广泛传播。1980年初,施乐PARC开发了Smalltalk编程语言,旨在让“儿童也可以使用”。在Lisp和LOGO设计思想基础上,Smalltalk吸取了Simula的面向对象思想并独创一格,而且还有一个很好的GUI。Smalltalk的创新使世人开始肯定面向对象。
  • 面向对象的发展历史。面向对象编程思想起源于瑞典20世纪60年代诞生的仿真编程语言Simula。表示仿真对象的数据和仿真方法互相独立,需要分别管理,程序员必须将两者正确结合,负担很大。Simula引入了数据和处理数据的方法自动结合的抽象数据类型。随后又增加了类和继承的功能。
  • 多态性、数据抽象和继承,被称为面向对象编程的三大原则。这三项原则通常也会有别的称谓。例如,把“多态性”称为“动态绑定”,把“数据抽象”称为“信息隐藏”或“封装”。虽然名称不同,但内容都是相同的。
  • 面向对象编程语言中最重要的技术是“多态性”。多态,就是可以把不种类的东西当作相同的东西来处理。多态性的优点一是各种数据可以统一处理,二是可以根据对象不同自动选择最合适的处理方法,三是如果有新数据需要对应,简单追加即可,不用改动原来的程序。多态提高了开发效率。
  • 算法和特定的数据结构关系很大。所以一位计算机先驱(Pascal之父Niklaus Wirth)曾经说过:“程序就是算法加数据结构。”设计模式是指设计软件时,根据以前的设计经验而对设计方法的分类。算法和数据结构从广义上来说也是设计模式的一种分类。有名的分类(设计模式)有23种。
  • 算法是解决问题的方法。现实中各种算法都已经广为人知了,所以编程时的技巧也就是对这些算法的具体应用。有很多算法,如果单靠自己去想是很难想出来的。比方说数组的排序就有很多算法,如果我们对这些算法根本就不了解,那么要想做出高速排序程序会很困难。
  • 具体来说,继承就是在保持既有类的性质的基础上而生成新类的方法。原来的类称为父类,新生成的类称为子类。子类继承父类所有的方法,如果需要也可以增加新的方法。子类也可以根据需要重写从父类继承的方法。
  • 随着软件规模的扩大,用到的类的个数也随之增加,其中也会有很多性质相似的类。这就违背了我们多次提到的DRY原则。程序会变得重复而且不容易理解。修改程序的代价也会变高,生产力则会降低。所以,如果有把这些相似的部分汇总到一起的方法就好了。继承就是这种方法。
  • 跟原型不同,面向对象编程语言的类和对象有明显区别,就像做点心的模具和点心的区别一样,又如整数的类和1这个对象、狗类和名字是poochy这条狗的区别一样。为了清晰地表明类和对象的不同,对象又常常被称作实例,叫法虽然不同,但实例和对象是一样的。
  • 同样的对象大量存在的时候,为了避免重复,可以采用两种方法来管理对象。一种是原型,即用原始对象的副本来作为新的相同的对象。Self、Io等语言采用了原型。有名的编程语言使用原型的比较少,很意外的是,JavaScript也是用原型的。另一种是模板,在面向对象编程语言中称为类。
  • 重复的程序是冗余的。人们解读程序、理解程序“意图”的成本也会增加。请记住,计算机是不管程序是否难以阅读,是否有重复的。然而,开发人员要阅读和理解大量的程序,所以程序的可读性直接关系到生产力。重复冗长的程序会降低生产力。
  • 如前所述,程序的重复是一切问题的根源。重复的程序在需要修改时,所涉及的范围就会更广,费用也就更高。当多个重复的地方都需要修改时,哪怕是漏掉其中之一,程序也将无法正常工作。所以重复降低了程序的可靠性。
  • 一个子类只能有一个父类,这称为“单一继承”。从自顶向下的方法来看,通过扩展一个类生成新类是很自然的。但是,从自底向上的方法提取共通部分的角度来看,一个子类只能有一个父类的限制是太严格了。一个子类可以有多个父类,这称为“多重继承”。
  • 利用现有的类派生新类的方法称为“差分编程法”。通过抽象把共通的部分提取出来生成父类,与利用已有的类来生成新类,是同一手法的两种不同表现形式。前者称为“自底向上”法,后者称为“自顶向下”法。
  • 继承有两个含义:一个是“类都有哪些方法,支持哪些操作”,即规格的继承;另一个是“类中都用了什么数据结构、什么算法”, 即实现的继承。在静态语言中,这两者的区别很重要,比如在Java中,实现的继承用extends表示继承父类,而规格的继承用implements来指定接口。