在”1.1抽象过程”中间有一小段讲述了早期编程语言对机器建模的方式只是针对待解问题的建模形式,比如举了两个例子,LISP语言选择的方式是所有问题最终都是列表;APL语言选择的方式所有问题都是算法性的;Prolog语言将所有问题都归结为一系列决策。举这些语言的例子目的是说明他们都不够灵活,只是针对特定类型的问题,超出了特定类型的领域就不好使了。上述语言我们也没用过,比较小众,可能在特定领域非常出名,但是在这里无非就想说明的是,他们还不能表示通用的问题。接下来就是我们本章甚至本书重要的角色出场了:面向对象方式(这里不是指具体语言,先不要把JAVA放在首位)。
书中接着写到的是”面向对象的方法进一步提供了工具,使程序员能够表示问题空间中的元素。这种表示足够通用,使程序员不受任何特定类型问题的限制。”。这句话只当是看来可以说史无前例,感觉我们找到了灵丹妙药,而且独霸一方。但是现在在看,在这个人工智能的时代,大数据的时代,通用大语言模型盛行的时代,面向对象方式还是我们计算机解决现实问题唯一选择的方式吗?有部分问题的解决已经不是通过面向对象的方式去解决了。但是大多数问题还是的。
下面我们继续沿着书中认为面向对象是如何表达我们现实世界的通用性这个话题走下去。”面向对象编程允许您根据问题而不是计算机的角度来描述问题,而不是描述解决方案将运行的计算机。仍然存在与计算机的联系”。在这句话的后面还有一段,我们暂时不去管他,可能我认为把对象比喻成一个小型计算机不合适。按照面向对象的方法现在我们做系统设计确实是从现实世界问题角度和考虑的,比如E-R图,这个软件工程中的概念,翻译过来就是实体-关系图。可以把现实世界总业务问题中的名词以及名词之间的关系通过E-R图表示,E-R图就可以转换成我们计算机世界中的类,这样就可以通过程序去实现了。
这一小节的最后一部分有一个叫Alan Kay的名人,他总结了面向对象编程语言的五个基本特征,虽然是基于第一种成功的面向对象编程语言Smalltalk的,但是针对其他所有的面向对象语言都是通用的。
我们在使用面向对象的编程语言去写程序的时候,程序中任何变量(定义出来的东西)都是对象(先忽略java中的原子类型)。我们的程序就是这些对象组成的,程序需要对象做什么事情,就调用该对象的方法(就是发消息)。每个对象可以包含其他对象,可以构建满足自己业务需求的复杂的对象。第4点我觉得是个公理,没必要解释,属于自然现象。第5点涉及到继承多态的概念。这个概念后续会详细介绍。很重要的一点。
还有一个叫Booch的名人用更简洁的一句话描述了对象的概念:对象具有状态、行为和标识。
状态不是说静止的,活动的意思,当然也包含上面的意思,就是我们说的一名客户的姓名,年龄等也属于状态,行为就是客户买东西,标识这个对我们来讲不够明显,可以理解为对象的身份证,唯一的,在计算机里就是一段内存地址码,一串看不懂的英文文字。