如何理解面向对象编程?
如何理解面向对象编程?
总觉得面向对象编程这个概念比较抽象。对象是个什么鬼?编程不就是写代码吗?你写一堆代码,然后运行,然后得到或显示运行结果,不是这样的吗?为什么还要说是面向对象编程?难道是程序员写代码时,面前要摆个“对象”,然后心里默念“对象保佑”,才能少出bug吗?
哈哈!没错、没错,只有对象保佑,才能少出bug。
其实,对于现在的新人来说,学习什么样的编程方法,都应该没有太大的障碍。相反对于有过程化编程经验的人来说,学习面向对象编程才是一件比较痛苦的事情,因为,他有面向过程的包袱,思维被“过程”格式化,忽然要采用面向对象的编程模式,比较难以跳出既定的思维习惯。好在“面向过程”的这一批“老人”,现在应该都切换过来了吧,估计想要他们再回到面向过程都难了。
首先,我想说,相比过去的面向过程编程,面向对象编程是一种轻量级的编程方法。
从两个层面来理解这里所谓“轻量级”的含义:
其一,从开发项目的角度。因为,它将你的开发项目定义为一个总体对象,然后,根据功能模块、服务对象等的不同被规划为若干子对象。咱们编程不再是直接为一个项目编程,而是为每一个子项目(子对象)编程,从而实现每一个功能子集。
其二,从代码组织的角度。因为,面向对象编程的编程思想,将程序相关的一切资源,包括代码本身都称之为对象。那么程序代码描述的任何目标,都是一个对象,程序员可以再面向这个对象来组织新的代码。所以,我们编程的过程不再仅仅只是处理数据,还会将已经组织好的代码块作为新的对象来处理。
正因为如此,现代程序员极少有写长代码的机会和习惯,甚至在一个对象里,连续超过100行代码的机会都是极少的,绝不像过去动辄上万行代码。这会带来一个极大的好处,就是一次性的代码量少了,程序员在写代码的间隙有更多踹息的机会,感觉写代码更“轻量”,也有更多的时间思考代码优化和重构的可能,或者能将更多的关注点放在组织架构和业务逻辑的处理上。
这就是面向对象编程之所以能取代和流行原因。
那么,究竟什么是面向对象的编程呢?下面我们来细细解读。
假定读者已经学习了一些关于编程的基本概念,诸如:变量、变量的运算、数据类型,包括数组、列表,还有流程控制语句等等。有了这些基本的概念,对下面的内容就应该比较好理解了。
面向对象编程,既是一种编程思想,也是一种编程方法论。
我们需要从这两个方面来理解:
- 究竟是一种什么样的编程思想?
- 又是一种什么样的编程方法论?
第一,它建立了这样一种编程思想
简单说,就是面向对象编程的思想。编程的过程,就是创建对象和创建对象的行为能力的过程。
包含三层含义:
1、万物皆对象,包括数据和代码。
2、创建对象,就是创建对象的描述,设计对象的行为。
3、编程的过程,就是创建对象的过程。
分述如下:
1、万物皆对象,包括数据和代码
既然万物皆对象,认识事物,就是认识对象。
包括我们开发的程序项目,也是对象,以及项目中要实现的一切功能细节,一切可视化的界面元素,一切不可视的变量、类型等数据和代码,都是对象。
2、创建对象,就是创建对象的描述,设计对象的行为
认识对象,就是认识对象的属性和行为。包含两个方面:
其一,一切对象,作为一个实体,皆有属性。所谓属性,是对对象特征的描述,就是定义它叫什么名字?长什么样子?是什么类型?有什么特性?等等。
其二,只有属性的对象是死的,一个有生命的对象,还必须有行为的能力。编程的目的就是为了创建有生命的对象。
比如一个项目,光好看不中用是不行的。它需要具备必要的功能,也就是行为的能力。项目中,我们定义的一切对象(如变量和类型等)都是有生命的,它们通过人机交互,甚至自动触发,能够产生行为,这个行为被称之为“事件”》。
这些对象的属性和事件,都是程序员需要定义的。
3、编程的过程,就是创建对象的过程
从形式上看,编程是写程序代码块,是不断定义对象的属性和行为的过程,本质上,就是创建各种对象的过程。
只不过,在这个过程中,我们一方面需要把对象的属性定义好,也就是对象的特征需要描述清楚。另一方面,我们更多的精力是要把对象的行为定义好,让它能按照我们规划设计的目标功能去实现。比如,某个对象在什么情况下会触发什么事件,来完成什么功能。
实际情况往往是,一个程序员在创建了一个项目以后,就会不断的按照项目规划设计的架构,来一层一层的搭建和填充整个项目的对象,也就是不停的定义对象的属性和行为,并让其实现既定的功能。
第二,它创造了这样一种编程方法论
简单说,就是一种基于对象、属性、事件和方法的编程方法论。
包含三层含义:
1、定义一个对象,首先定义其属性。
2、其次定义对象的行为,包括对象可能发生的事件及事件的结果。
3、定义对象行为的过程,通常是通过事件和方法来实现。
分述如下:
1、定义一个对象,首先定义其属性
属性用于描述对象的个性特征。比如外观特征、数量特征、访问特征等等,是创建对象时首先要完成的任务。
2、其次定义对象的行为,包括对象可能发生的事件及事件的结果。
为了让你创建的某个对象,具有某种行为能力,你必须规划设计好这个对象的事件,事件用于实现对象的功能。
3、定义对象行为的过程,通常是通过事件和方法来实现
我们说定义对象的行为,就是设计对象的事件,并通过事件的发生,来实现对象的功能。
举一个简单的例子,来解读上面的方法论。
比如,我们要创建一个按钮对象,这个按钮能够实现在用户使用鼠标单击以后,弹出一个对话框,提示“你好!”。
那么,我们分三步来完成它:
第一步,创建一个按钮,定义它的属性。包括:按钮的名称、ID、尺寸大小、显示位置等等。
第二步,给它设计了一个鼠标单击事件。那么,这个按钮就能接受一个鼠标单击的行为。
第三步,为鼠标单击事件添加方法代码,代码运行的结果,也就是单击事件的行为结果。
实例代码如下:
//创建按钮对象
<input type = ’button’ value = ’单击按钮’ style = ’width: 90px; height: 30px;’ onclick = ’ClickMe()’ />
上面的按钮中,对象的属性定义了,类型为“button”,显示为“单击按钮”,它的外观属性定义在style中,包括宽度和高渡,以像素px为单位。同时,还为它定义了一个鼠标单击事件,该事件会触发一个叫“ClickMe()”方法。
//创建按钮对象的事件方法
function ClickMe()
{
Alert(‘你好!’);
}
所谓的方法,就是能够实现特定程序功能的代码块。
在程序项目中,程序员需要处理几乎他能想到的所有对象的所有事件,并为这些事件的完成编写实现其功能的代码。
面向对象编程不仅帮助我们建立了对象、属性、事件和方法的思想概念,而且可以说,面向对象编程的过程,就是一个程序员主动规划和设计“对象、属性、事件和方法”的过程。
我们为一个应用项目编写程序代码,通常不是被动地了解这个项目的对象、属性、事件和方法。而是根据项目需求,主动地设计它,从无到有地创建它们,设计出所有的对象,对象的属性,可能发生的事件,以及与事件相关的各种程序方法。
这是就一个主动的过程,即便是面对一个历史遗留的维护项目,我们依然应该拥有这个项目的全局观念,知道它是由哪些对象构成的,所有的对象可能发生哪些事件,每一个事件的方法是如何实现的,等等。
至于代码本身,它也是一种对象。这个对象,我们会更多的运用到“封装、继承和多态”的编程理念,来进一步优化我们的编程方法和代码结构。
所以,面向对象编程为我们创造了一套完整的、成熟的、科学的方法体系,归纳为一句话,那就是:面向对象的编程,就是基于对象、属性、事件和方法的编程思想,以及基于封装、继承和多态的编程方法。
- [libvirt][nginx]libvirt文档访问速度提高的小技巧
- 图论----同构图(详解)
- 基数排序与桶排序,计数排序【详解】
- SG函数和SG定理【详解】
- 密码学经典之生日悖论与生日攻击【详解】
- POJ 1659 Frogs' Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】
- BZOJ 1192: [HNOI2006]鬼谷子的钱袋(新生必做的水题)
- 快速傅里叶变换(FFT)算法【详解】
- Codeforces Round #416 (Div. 2)(A,思维题,暴力,B,思维题,暴力)
- 作为程序员的你在外行人眼里是一个怎样的群体?
- 高斯消元法(Gauss Elimination)【超详解&模板】
- [快学Python3]读写Excel - openpyxl库
- HDU 2147 kiki's game(规律,博弈)
- HDU 1847 Good Luck in CET-4 Everybody!(规律,博弈)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AndroidQ 沙箱适配多媒体文件(小结)
- Bitcron 主题 Berry(简约wordpress主题)
- Android 实现图片转二进制流及二进制转字符串
- Android 如何实现exclude aar包中的某个jar包
- android 实现控件左右或上下抖动教程
- Android Studio引入FFmpeg的方法
- Android Studio 中获取屏幕宽度实例
- Android studio 生成带Kotlin文档的实现方式
- 基于Android FileProvider 属性配置详解及FileProvider多节点问题
- Android 通过API获取数据库中的图片文件方式
- android尺子的自定义view——RulerView详解
- 浅谈Android Studio3.6 更新功能
- Android 自定义View手写签名并保存图片功能
- android 使用Xml文件定义Shape方式
- Android 判断所有字段是否已经输入的实例