面向对象编程语言的产生是由于发现过程性语言(诸如C、Pascal和早期版本的Basic)在处理大型的复杂问题时有些力不从心。为什么会这样呢?
有两类问题:一是程序与现实世界缺乏对应关系,二是程序内部的结构出了问题。
对现实世界建模的无能为力。
使用过程性语言对现实世界问题进行抽象及概念化十分困难:方法执行任务,而数据存储信息,但是现实世界中的事务是对二者同时进行操作的,例如,炉子上的自动调温执行任务(炉子的开关) 但同时也存储信息(现在的温度和所希望的温度)。
如果用过程性语言来写一个自动调温器控制程序,可能会以两个方法func_on() 和 func_off().即开和关。但是还会有两个全局变量currentTemp和 desiredTemp,即现在的温度(由调温器控制)和希望的温度(由用户设置),然而这些方法和变量并没有形成任何变成对象,在程序中不会出现任何可以称之为自动调温器的单元,这个单元的唯一概念只存在于程序员的脑海之中。
对于大型的程序,有可能包括上百个类似调温器的实体,过程语言在面对这种情况会将程序员搞得极为混乱,错误频繁出现,有时还完全不可能实现,因此需要一种可以更美好地将程序中的事物与现实世界中的事物相匹配的语言。
粗糙的组织结构:
解决程序的内部组织结构是一个更微妙而且事关重大的事情。面向过程的程序被划分为一个一个的方法。这种基于方法组织形式的一个巨大问题时它仅仅考虑了方法,而没有重视数据。当不得不面对数据时,它没有更多的选择。简言而之,数据可以是一个特定的方法的局部变量,也可以是所有方法都可以存取的全局变量,就是无法规定一个变量只允许某些方法存取而不允许另一些方法存取。
当几个方法都要存取同一个数据时,这种不灵活性会产生问题。如果一个变量要想被一个以上的方法存取到,这个变量必须是全局变量。但是全局变量会在不经意间被程序中的任何一个方法存取,这就导致了频繁的变成错误,因此需要一种可以精调数据的可访问性的方法,使数据对应该存取它的方法是可用的,而对其他方法是隐藏的。