作者:极客小俊
我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人!
原创技术文章
前言
这一章节的内容不仅仅适合JavaScript 也适合其他面向对象编程语言!
第一节: 什么是面向对象?
==官方摘要==
**面向对象(Object Oriented): ** 是软件开发当中的一种方法 或者说 方式,更加可以说成是一种思维方式、它是一种对现实世界理解和抽象的方法, 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式
它现在的应用领域也不仅仅局限于程序设计和软件开发了,它扩展到了数据库、分布式系统、网络管理结构、交互式界面、等领域!
面向对象导论
随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题。
一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,
现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。
通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。
同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。
面向对象也是指一种程序设计范型,同时也是一种程序开发的方法。
对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
面向对象的思想已经涉及到软件开发的各个方面。
面向对象的分析 (OOA,Object Oriented Analysis)
面向对象的设计 (OOD,Object Oriented Design)
面向对象的编程实现(OOP,Object Oriented Programming)
面向对象起源背景
面向对象是在结 ==构化设计方法== 出现了很多问题之后 才应运而生的。
==结构化设计方法==求解问题的基本策略是从功能的角度审视问题! 也就是 解决“做什么 怎么做 从行为的角度出发!
==结构化设计方法==将应用程序看成实现某些特定任务的功能模块,在这个应用程序中的每一个模块,都是实现应用程序某项具体操作的底层功能和具体的操作过程! 如果说应用程序系统比较小那么还好,如果是复杂的应用系统 那么这种做法显然是有弱点的,如下:
审视问题的视角
结构化设计方法所采用的设计思路是以==功能==为目标来设计构造应用系统,也就是行为, 比如说: 要做一个企业站系统,功能有发布文章、显示文章、添加文章、这些都是行为功能, ==但行为是不稳定的!== 因为这些每一样功能所实现的过程有很多种 并且还有其他的功能 这些是不能确定的!
通俗点说就是:确定的功能、确定模块、以及每个模块算法和编写具体的代码就写在一堆,或写在一个函数中 直接使用! 初学者就习惯这样干!
==结构化设计方法==设计建立在不稳定的操作之上,使得应用程序的日后维护和扩展相当困难,甚至一个微小的变动,都会波及到整个系统, 所以这就是诞生面向对象编程的首要原因
抽象级别
好的抽象策略可以控制问题的复杂程度,增强系统的通用性和可扩展性
抽象主要分: ==过程抽象==和==数据抽象==
==结构化设计方法==应用的是过程抽象 就是将问题中具有明确功能定义的操作代码抽取出来 直接写上 并看成一个整体
过程抽象级别对于软件系统结构的设计显得有些武断,并且稳定性差
一旦某个表示方式发生了变化,就有可能牵扯到已有系统的很多部分。
==数据抽象==是,将描述主体[客体]的属性和行为绑定在一起,实现统一的抽象,从而达到对现实世界主体对象的真正模拟。
封装的体现
==结构化设计方法==没有做到客观事物主体的整体封装,只是封装了各种功能模块,就从代码书写的角度来将, 比如你写了很多功能独立的函数一样, 或者说就把一些代码裸露的写在一个页面上一行一行的执行下来!
而每个功能模块又有可能操作到没有保护能力主体事物代码, 也就是说其他的功能代码的 属性变量 或者执行流程被 实施操作覆盖等等!!
并且==结构化设计方法==是把描述属性的数据与行为被分割开的,
一旦某个主体事物属性的表达方式发生了变化,或某个行为效果发生了改变,可能就是对整个系统产生巨大影响, 也就是改一个地方其他很多地方都需要改动的原因
面向对象就把封装体现得很好,把该逻辑单元负责将所描述的属性隐藏起来,外界对主体事物内部属性的所有访问只能通过提供的用户接口来实现
这样做既可以实现对主体对象属性的保护作用,又可以提高软件系统的可维护性。
只要用户接口不改变,任何封装体内部的改变都不会对软件系统的其他部分造成影响!
可重用性
==重用性==是衡量一个软件产品成功与否的重要标志!
然而,==结构化程序设计方法==的基本单位是模块,每个模块只是实现特定功能的过程描述, 因此,它的可重用单位只能是模块。
所以在软件开发的时候必须要考虑代码的==重用性==是必然也是必须的!!
例如,在PHP语言编写程序时使 写一些标准函数或者自定义函数, 但对于今天的软件开发来说,这样的重用力度显得微不足道,而且当参与操作的某些数据类型发生变化时,就不能够再使用那些函数了 因为不够灵活
因此,渴望更大力度的可重用构件是如今应用领域对软件开发提出的新需求,
这些弱点驱使人们寻求一种新的程序设计方法, 来适应现代社会对软件开发的更高要求, 因此==面向对象==由此诞生了!
面向对象 和 基于对象的区别
很多人在这个问题上是分不清楚的,甚至也可以说是他们已经是混淆概念
==面向对象== 必然有三大特点(封装,继承,多态)
==基于对象== 是使用对象, 就是无法利用现有的对象产生新的对象类型,继而产生新的对象,也就是说基于对象没有继承的特点!
而且 “多态”表示为父对象的子对象实例,没有了继承的概念也就无从谈论“多态”。
所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断,也就是 ==继承==和==多态==
“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些
面向对象 和 面向过程
==面向过程==就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了!
==面向对象==是把构成问题事务分解成各个方法行为,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象的三大特性与五大原则
三大特性
1、封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
2、继承
提高代码复用性;继承是多态的前提。
3、多态
父类 或 接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性
五大原则
1、==单一功能原则==SRP (Single Responsibility Principle)
类的功能要单一,不能包罗万象,跟杂货铺似的
2、==开放封闭原则==OCP(Open-Close Principle)
开放封闭原则主要体现在两个方面:
1、对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
2、对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对其进行任何尝试的修改。
也就是说一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
3、==里氏替换原则==LSP(the Liskov Substitution Principle LSP)
子类可以扩展父类的功能,但不能改变父类原有的功能。
子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4、==依赖反转原则==DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
听起来更像是“针对接口编程,而不是针对实现编程”
问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。
解决方案: 将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。
在java、php中,抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是==制定好规范和契约==,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。
依赖倒置原则的核心思想是面向接口编程。
5、==接口分离原则==ISP(the Interface Segregation Principle ISP)
接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。
为什么有人说JavaScript是基于对象的语言?
JavaScript不是面向对象的语言, 并且上面我也阐述了面向对象 和 基于对象的区别,
因为JavaScript没有继承的概念,进而也没有多态的概念,缺少了继承和多态的特性,所以我们就可以判定JavaScript就只是个基于对象的语言
简单地讲,“面向对象就是把现实中的事物抽象化”
面向对象方法是一种运用对象、类、封装、继承、多态和消息等概念来构造、测试、重构软件的方法。
简言之,面向对象就是面向事情本身,面向对象的分析过程就是认识客观世界的过程。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏”
一键三连哦!
如果以上内容有任何错误或者不准确的地方,欢迎在下面 留个言指出、或者你有更好的想法,欢迎一起交流学习