面向对象方法综述(工具<方法<思维<价值观)-编程知识网
思想起源于上世纪六十年代(和结构化方法一样)
最早的OOPL:Simula67
最纯的OOPL:Smalltalk

smalltalk的贡献:它在系统设计中强调对象概念的统一,引入对象,对象类,方法,实例等概念和术语,采用动态联编和单继承机制。此外,还引入虚拟机(Java的基础);提出了MVC架构;在用户图形界面方面发挥了重要作用。

Alan Kay的名言:预测将来最好的办法就是发明。

面向对象方法没结构化方法发展地那么快,上世纪九十年代才开始流行。

可以从以下4个方面理解:
指导思想:尽可能模拟人类习惯的思维方式(类,继承)就是使软件解空间和现实世界的问题空间保持对应关系。

基本原则:
对象是类的实例,类是将和数据和数据有关操作封装在一起,这是一种局部化,使得维护,复用更加高效,其次通过类成员的访问限制,使得类的使用和实现分离。如果程序设计语言只提供对象和消息通信,它就只是基于对象而不是面向对象。继承是面向对象的重要特征,反映了类之间普遍和特殊的关系,是面向对象实现重用的重要手段之一。极大增加了代码复用的可能性。复用不是调用,调用是全有或全无。继承分为单重继承和多重继承,单重继承每一个子类只有一个父类(Java),多重继承……(c++,python)。继承增加了类之间的耦合性,也就增加了程序的复杂性,因为每一次继承都可能部分重用已有类的成员,继承得越深,子类就越难以理解。所以继承的问题就是增加了程序的耦合性。消息就是对象发送的服务请求,发送消息的对象称为发送者,接收消息并执行指令的对象称为接收者。对象接受到消息才能执行,完成消息指定的服务。由此,对象模型是网状的,不是层次的。消息通信还挺复杂的,同一对象可以接受不同形式的消息,从而产生不同响应(这个对象可以提供很多不同服务);相同形式的消息可以发送给不同对象,产生不同响应(多态性)。使用多态性有三个方面的好处:1.消息发送者不需考虑消息不同。2.增加了消息的可扩展性,如果要新的响应,可将消息发送给不同的对象,增加新的子类,将消息发送给该子类的对象即可。无需修改消息发送者的代码。3.分离实现者和使用者,使得程序更加灵活。最简单的多态是重载,有运算符重载,和函数重载。运算符重载:对已有的运算赋予新的含义,使同一运算符作用于不同的类型时产生不同行为。同一作用域类形参不同(顺序,个数)但函数名相同,称为函数重载。编译器可根据形参实参类型个数等进行匹配。多态性使得程序用以扩展,如有新的数据需要新的处理,简单地追加一个子类,不影响已有的。程序根据数据不同,自动地选择合适的处理方法。对象和消息通信,反映了事物和事物间的联系。类和继承反映了人类的思维方式。

方法论:系统是由一些对象的相互联系,相互作用而形成。同样是成绩管理系统,用OOP看,是由老师,学生等一系列对象相互联系和作用形成的。

UML现在是面向对象技术的标准建模语言。
面向对象方法综述(工具<方法<思维<价值观)-编程知识网
与以功能为核心的结构化方法相比,面向对象具有以下优势——

1.对象在现实世界客观存在,比功能更容易理解,计算机上的解空间和现实中的问题空间一致
2.功能带有主观性,不同的人看来不一样,变化频繁
3.面向对象中的概念和表示符号不仅适用于分析阶段,而且设计阶段也用这些符号
4.面向对象分析和设计均使用同意模型,不像结构化方法使用不同模型,分析和设计之间没有鸿沟,设计之后回过头来还可对这个模型进行扩充,对于需求变化或模糊的情况容易处理。(反映了面向对象方法适合于迭代增量式的软件开发)
5.继承机制的存在
面向对象方法综述(工具<方法<思维<价值观)-编程知识网
不足——
1.一个功能的完成往往需要若干类共同完成
2.增加了复杂性,耦合性,降低了可维护性
3.数学基础薄弱,导致不能正确设计,繁杂而充满不确定性
4.复杂在哪:通过消息通信,网状结构无法逐步分解(适合迭代增量式地开发)把类封装好往往很麻烦

要真正体会面向对象的优秀,还是有难度的。此外,面向对象的多态性要用得好很麻烦。

Why OO Sucks(网址见图)