对面向对象的理解

————前车之鉴,后车之师:对面向对象的理解

1.考虑问题的过程和思想的转变:

在对问题的考虑时人的主观思维起到重要作用,遇到问题会对整体问题进行考虑看是否遇到过类似问题,人为的向经验靠拢,对问题事件进行分析,归纳,延伸,将多个经验组合在一起对更大的问题进行处理。

人能够解决问题的复杂性直接取决于抽象的类型和质量,看是否能够对问题进行拆分,将一个大的问题转化为多个小的问题,所谓的类型是指所抽象的是什么?就是问题的一部分,例如:所有的语言都提供抽象机制,第二代语言汇编语言就是对底层语言的轻微抽象,而第三代语言是对汇编进行的抽象出现了命令式的C、BASIC等。但是这些抽象是针对计算机而言的,是为了基于计算机的结构更好的对硬件进行控制,而不是直接为了方便解决问题所以面对更大的代码量就显的略有不足(因为问题更加复杂导致代码繁杂)。所以必须建立起在计算机模型和实际待解问题之间的关联,这种映射是困难的,因为编程语言的功能限制所以并不可行(面向过程是不够的)

这就出现了只针对待解问题建模,早期的语言例如LISP和APL都选择了针对问题的思路进行编程(分别对应“所有问题最终都是列表”和“所有问题都是算法形式”),还有将问题转换为决策链的语言和基于约束条件的编程语言,但是这些语言都有着局限性,这时就体现出了面向对象的优势,因为它的方式非常通用,使人不会受限于任何特定类型的问题,将问题空间中的元素称为对象,程序可以添加新类型的对象使自身适用于某个问题,面向对象是根据问题来描述问题,而不是根据执行解决方案的代码来解决问题。这就体现了面向对象的特征和针对问题的灵活多变

2.面向对象的特点:

Simula 67是第一个支持面向对象的语言,但是之后的Smalltalk是被认为是最纯正的面向对象开发语言,对之后的面向对象语言,C++、java等产生了深远影响,出现了五个基本特性,表现了一种面相对象的设计方式:

(1)万物皆对象:

可以抽取待解问题的任何概念化构建,将其表示为程序中的对象

(2)程序是对象的集合:

对象之间根据消息来告知彼此要做的,要想请求一个对象就必须对该对象发送一个消息,这个消息相当于一个调用请求

(3)每个对象都可以有由其他对象构成的存储:

可以构建复杂的体系,通过创建包含现有对象的包的方式来创建一个新的类的对象

(4)每个对象都有其类型:

每个对象都是某个类的实例,每个类最重要的区别其他类的特性是“可以发送什么信息给它”

(5)某一特定类型的所有对象都可以接收同样的信息:

简单来说就是具有相同特征的类之间具有可替代性

这些特点成为了面向对象的基础,是面向对象编程的关键

对象具有状态、行为和标志,分别是内部数据、方法、和每个对象在内存中的唯一个地址,面向对象应该具有封装、继承、多态、组合等特性,面向对象编程是具有这四个特性的编程方式

3.面向对象和面向过程

我觉得面向对象分为思想和编程格式两方面,在考虑问题时使用思想分析问题,在编码时使用其格式,面向过程也是同理的分为思想和格式,但是只使用格式并不能成为真正的面向对象

为什么使用面向对象?因为在思想方面解决了问题的复杂化并针对问题来进行设计,这样在编程格式上解决了安全性、易于修改、可复用等问题。在面向对象成为主流之前,结构化(命令式)编程起到了重要作用,虽然两者有明显的界限但是不是互相排斥的,因为对计算机操作必然会出现命令式的编程,两者之间是互补的,面向对象不一定完全替代结构式代码,很多遗留系统仍在正常工作,这些系统都是非面向对象的编写方式。面向过程的开发制约了维护和扩展,因为自上而下的结构化的开发导致功能结构死板不易改变,导致一修改就会影响到其他的功能模块就成为了严重缺陷。

两者思想上的简单区别:

1)但是我认为处理问题时面向过程是必不可少的,因为要获得一个结果就必须执行一定的步骤,这与面向过程的思想:即分解执行步骤采用每一步都是命令相似,但在处理问题时采用面向对象的思想进行对问题的分析,这些步骤指令被划分到自然界的元素中进行封装,以实现每个自然元素的独立功能

2)在面向过程中通过各种功能来实现各种步骤和划分结构,把整个软件系统划分为多个模块每个模块实现预期的子功能,所以将问题拆分的过程就是执行解决步骤实现功能的时候;而面向对象是把问题通过功能来划分为各个对象,而不是单纯的进行功能之间的组合,而是描述这个元素在整个问题的解决步骤中的行为和状态

3)对象式的编程先不管步骤,而是确定对象的存在去然后通过对象来实施行为,然后去通知另外一个对象自己的行为,而不是按照流程对计算机进行命令

4)我认为面向过程和面向对象的主要分别在于对方法功能的使用上不同,面向过程是为了解决一个问题将功能步骤依次使用,即使划分模块也是为了解决子问题而执行步骤,由数据来控制功能(函数);而面向对象虽然针对待解问题包含的元素而进行对象的划分,但是我认为是依据功能的共性进行抽象成类,使有共性的功能成为一个独立整体,而不是松散的结构,通过功能来控制封装内部的数据

包装对象是指在面向对象的类中包含其他代码,你可以将结构化的代码包装到一个对象的内部,使其行为就像对象一样,即对功能的分类

4.如何进行面向对象的思想

在开始的时候需要建立模拟问题的对象领域模型,这时就有自底向上的抽象过程,自上而下的分解过程:

自底向上的抽象:针对问题分析各个元素之间的供需关系(即各个最基本对象之间的关系),寻找到最基本的对象后再将其抽象为类,在将这些类抽取共性建立父类,这样可以避免类的抽象层次过高,而复杂化问题。

自上而下的分解:每一步分解都有具体的对象,方便的分清功能,但是不同于结构化(命令式)的思想,因为不像面向过程一样去分解功能,而是将功能分开,降低耦合性在开发过程中针对的问题不断扩大,导致需要建立模拟问题的各种对象模型。

建立模型必要的组成部分:

问题领域 :是软件系统对真实系统的模拟,是系统对真实的映射

对象 :在问题领域对各自然元素的抽象,由众多对象组合起来构成对问题领域的系统

属性、行为 :包括具有的实现和功能,在设计时只需要考虑有什么功能

状态 :状态是对象的某个状态的属性取值,是可以改变的

实例 :同种类的实例具有相同的属性,表明具有相同的含义

消息和服务 :一个功能可能由多个对象协同工作,一个对象根据一个对象发送的消息来执行相应的方法,消息由调用者发送,服务由被调用者提供。一个软件对使用者来说就是一个服务提供者,在系统内部的子系统也是服务提供者,子系统就是对象或多个对象的组合,每个子系统都是独立的个体通过消息来获得服务

接口 :每个对象都是服务提供者,通过接口对外提供服务,由公开的方法构成接口,但在java中的接口还有另一个意思即接口类型,明确的描述系统对外提供的所有服务,能够更加清晰的把实现细节和接口分离

5.面向对象的特点

封装(透明):隐藏内部细节仅对外公开接口,可以避免暴露内部的内聚关系,降低整体的耦合度通过访问控制机制来进行封装

抽象 :从问题领域的事物开始,对事物抽取属性和行为成为一个对象,在抽象对象把具有相同属性和行为的对象抽象为类,在对类实现抽象成为父类,在java语言中则有两种意思,一是抽象的思维过程,二是用来修饰类和方法,若一个方法被abstract修饰则表明这个方法没有具体的实现,若一个类被abstract 修饰则表明这个类没有办法被实例化

继承 :在父类和子类之间存在着继承和扩展关系,子类继承了父类的方法还同时扩展出新的功能和方法,并且可以覆盖父类中的方法实现方式(覆盖:指在子类中重新实现父类的方法)

组合 :组合是一种用多个简单子系统来组装出复杂系统的有效手段 ,对于子系统之间存在关联或依赖关系

多态 :当系统A访问系统B时,B可以通过多种实现方式来提供服务,而对于A来说是透明的,动态绑定(是指在执行期间判断所引用对象的实际类型,根据其实际类型决定其相应的方法,在运行过程中把函数的调用与响应所需要的代码相结合的过程称为动态绑定)

6.UML对面向对象的帮助

UML主要是建模用的,是一种设计方法,是在软件设计开发时进行沟通的,是开发团队内部的高效手段

你可能感兴趣的:(对面向对象的理解)