面向过程让计算机有步骤地顺次做一件事情,是一种过程化地叙事思维。但是在大型软件开发过程中,发现用面向过程语言开发,软件维护、软件复用存在着巨大困难,代码开发变成了记流水账,久而久之就称为“面条”代码,模块之间互相耦合,流程互相穿插,往往牵一发而动全身。面向对象提出一种计算机世界里解决复杂软件工厂的方法论,拆解问题复杂度,从人类思维角度提出解决问题的步骤和方案。
比如“开门”这个动作,面向过程是“open(Door door)”,“door”是被作为操作对象的参数传入方法的,方法内定义开门的具体步骤实现。而在面向对象的世界里,首先定义一个对象“Door”,然后抽象出门的属性和相关操作,属性包括门的尺寸、颜色、开启方式(往外开还是往内开)、防盗功能等;门这个对象的操作必然包括open()和close()两个必备的行为。面向过程的结构相对松散,强调如何流程化地解决问题;面向对象地思维更加内聚,强调高内聚、低耦合,先抽象模型,定义共性行为再解决实际问题。
但是,编程语言仅是一个工具,就像练武之人地剑,武功高者草木皆剑,武功差者即使莫邪剑在身也依然平庸。所以,能否将工具的价值发挥得淋漓尽致,最终还是取决于开发工程师本身。优秀的开发工程师用面向过程的语言也能把程序写的非常内聚,可扩展性好,具备一定的复用性;而平庸程序员用面向对象语言一样能把程序写得松散随意、毫无抽象与建模、模块间耦合严重、维护性差。
传统意义上,面向对象有三大特性:封装继承多态。本文(参考的《码出高效》一书)明确将“抽象”作为面向对象得特性之一,支持面向对象“四大特性”得说法。抽象是程序员的核心素质之一,体现出程序员对业务的建模能力,以及对架构的宏观掌控力。虽然面向过程也需要进行一定的抽象能力,但是相对来说,面向对象思维,以对象模型为核心,丰富模型的内涵,扩展模型的外延,通过模型的行为组合去共同解决某一类问题,抽象能力显得尤为重要;封装是一种对象功能内聚的表现,使模块之间耦合度变低,更具有维护性;继承使子类能够继承父类,获得父类的部分属性和行为,使模块更有复用性;多态使模块在复用性基础上更加有扩展性,使运行期更有想象空间。
抽象是面向对象思想最基础的能力之一,正确而严谨的业务抽象和建模分析能力是后续的封装、继承、多态的基础,是软件大厦的基石。在面向对象的思维中,抽象分为归纳和演绎。前者是从具体到本质,从个性到共性,将一类对象的共同特征进行归一化的逻辑思维过程;后者则是从本质到具体,从共性到个性,逐步形象化的过程。在归纳的过程中,需要抽象出对象的属性和行为的共性,难度大于演绎。演绎是在已有问题解决方案的基础上,正确地找到合适的使用场景。演绎错误在使用集合时比较常见,比如针对查多改少的业务场景,使用链表是非常不合理的;底层框架技术选型时如果有错误,则有可能导致技术架构完全不适应业务的快速发展。
封装的主要任务是对属性、数据、部分内部敏感行为实现隐藏。对属性的访问与修改必须通过定义的公共接口来进行,某些敏感方法或者外部不需要感知的复杂逻辑处理,一般也会进行封装。
继承是面向对象编程技术的基石,允许创建具有逻辑等级结构的类体系,形成一个继承树,让软件在业务多变的客观条件下,某些基础模块可以被直接复用、间接复用或增强复用,父类的能力通过这种方式赋予子类。继承把枯燥的代码世界变得更有层次感,更有扩展性,为多态大侠语法基础。
人人都说继承是is-a关系,那么如何衡量当前的继承关系是否满足is-a关系呢?判断标准即是否符合里氏代换原则。任何父类能够出现的地方,子类都能够出现。
方法污染是指父类具备的行为,通过继承传给子类,子类并不具备执行次行为的能力。方法爆炸是指继承树不断扩大,底层类拥有的方法虽然都能够执行,但是由于方法众多,其中部分方法并非与当前类的功能定位相关,很容易在实际编程中产生选择困难症。提倡组合优先原则来扩展类的能力,即优先采用组合或聚合的类关系来复用其他类的能力,而不是继承。
多态是以上述的三个面向对象特性为基础,根据运行时的实际对象类型,同一个方法产生不同的运行结果,使同一个行为具有不同的表现形式。我们来明确两个容易混淆的概念:“override”和“overload”,“override”译成“覆写”,是子类实现接口,或者继承父类时,保持方法签名完全相同,实现不同的方法体,是垂直方法上行为的不同实现。“overload”译成“重载”,方法名称是相同的,但是参数类型或参数个数是不同的,是水平方法上行为的不同实现。多态是指在编译器层面无法确定最终调用的方法体,以覆写为基础来实现面向对象特性,在运行期间由JVM进行动态绑定,调用合适的覆写方法体来执行。

OOP理念的更多相关文章

  1. 《码出高效 Java开发手册》第二章 面向对象

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding 第2章 面向对象 Object-Oriented Pro ...

  2. 云计算VDI相关职位招聘

    中电科华云信息技术有限公司是中国优秀的云计算方案提供商和服务商之中的一个.公司依托中国电子科技集团公司,实施"自主.可信.定制.服务"的差异化发展战略,以实现自主创新的技术研发.自 ...

  3. 重塑云上的 Java 语言

    音乐无国界,但是音乐人有国界. 云原生亦如此.虽没有限定的编程语言,但应用所使用的编程语言已经决定了应用部署运行的行为. Java 诞生于20年前,拥有大量优秀的企业级框架,践行 OOP 理念,更多体 ...

  4. Python 面向对象编程之封装的艺术

    1. 面向对象编程 OOP ( Object  Oriented Programming) 即面向对象编程. 面向对象编程是一种编码思想,或是一种代码组织方式.如同编辑文章时,可以选择分段.分节的方式 ...

  5. java温故而知新(9)OOP(面向对象编程)理念

    Object   Oriented   Programming   (面向对象的程序设计) 1.定义 面向对象程序设计(OOP)的具体定义很难下,也很容易因此而引起争论,在   Object-Orie ...

  6. scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

    一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...

  7. atitit.attilax的软件 架构 理念.docx

    atitit.attilax的软件 架构 理念.docx 1. 预先规划.1 2. 全体系化1 3. 跨平台2 4. 跨语言2 5. Dsl化2 5.1. 界面ui h5化2 6. 跨架构化2 7. ...

  8. c#面向对象基础技能——学习笔记(二)基于OOP思想研究对象的【属性】

    字段(成员变量): 字段只能从对象中访问实例字段,无法直接从类中访问(换言之,不创建实例就不能访问),可以理解为:字段一般用在内部数据交互使用,当需要为外部提供数据时,(要优先使用自动实现的属性而不是 ...

  9. 一个简单oop的changeTab

    好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...

随机推荐

  1. 获取当前exe的绝对路径

    string GetExePath(void) { ]={}; GetModuleFileNameA(NULL, szFilePath, MAX_PATH); (strrchr(szFilePath, ...

  2. kubernetes 存储volume,pv和pvc的使用

    emptyDIR 临时目录 hostPath :使用主机的路径 网络存储: 传统的设备存储:NAS,SAN 分布式存储:glusterfs,rbd,cephfs 云存储:EBS,Azure,阿里云的 ...

  3. 【转载】BERT:用于语义理解的深度双向预训练转换器(Transformer)

    BERT:用于语义理解的深度双向预训练转换器(Transformer)   鉴于最近BERT在人工智能领域特别火,但相关中文资料却很少,因此将BERT论文理论部分(1-3节)翻译成中文以方便大家后续研 ...

  4. Codeforces 1009 E. Intercity Travelling(计数)

    1009 E. Intercity Travelling 题意:一段路n个点,走i千米有对应的a[i]疲劳值.但是可以选择在除终点外的其余n-1个点休息,则下一个点开始,疲劳值从a[1]开始累加.休息 ...

  5. Vue 使用百度地图组件

    npm 安装 npm install vue-baidu-map --save组件官网地址 https://dafrok.github.io/vue-baidu-map/#/

  6. mybatis 对string类型判断比较 group case when then 综合

    [quote] 特别注意两点 一个是where 的用法group的用法 case when的用法 <if test='hasLoanApplicationFlag == "1" ...

  7. ImportError: DLL load failed: 找不到指定的模块

    如果遇到错误:ImportError: DLL load failed: 找不到指定的模块出现错误原因:安装包的来源问题,也可以理解为包版本兼容问题,有的包使用官方出版,有的包使用whl文件安装 解决 ...

  8. 【零基础】搞懂GPU为什么比CPU“快”

    一.前言 近几年深度学习在各领域大显神威,而”GPU加速"也得到了越来越多的篇幅,似乎任何程序只要放到GPU上运行那速度就是杠杠的.GPU代替CPU计算已成了大势所趋?我先告诉你结论”那是不 ...

  9. KERNEL_SECURITY_CHECK_FAILURE

    出现错误提示重装系统可以解决问题,但不需要重装系统.win8错误提示:KERNEL_SECURITY_CHECK_FAILURE提示对应错误代码:0x00000139 (0x00000003, 0x8 ...

  10. HSBToolBox

    HSBToolBox.exe Unzip all files to the folder where Hearthbuddy.exeThen just run HSBToolBox.exe [asse ...