问题一:什么是面向对象编程(OOP)与面向对象语言(OOPL):
面向对象编程时一种编程范式,它是以类或对象作为组织代码的基本单元,并使用封装、继承、多态三大特性,作为代码设计和实现的基石
面向对象语言:是自身的机制能够支持类或对象的语法机制,能过方便地使用面向对象的编程的三大特性的编程语言
论理:
如何判断一种编程语言是否是面向对象的勒?
根据上面给出的定义:如果一定要严格来说的话,很多语言都不能算的上是面向对象编程语言,但如果不严格按照上述给出的定义,那么大部分语言都是面向对象的?为什么会有这么模糊不清的界限勒?
因为面向对象编程只是一种编程范式而已,众所周知java是一种面向对象的编程语言,难道就不能够使用java做面向过程的编程了嘛?我们依然可以在一个类里面将所有过程放入!将操作和数据进行杂糅!而c语言是一种面向过程的编程语言,难道就不可以使用面向对象编程的思维模式了嘛,对于c语言而言,不是说完全不可以。根据面向对象语言的定义,由于c本身并没有什么机制来支持类或对象的语言机制,而且也没有机制可以使用面向对象的编程的三大特性。但不过我们依然可以利用复杂的手段进行实现:例如使用c进行编程时,我们按照功能的不同,把函数和数据结构放到不同的文件里,已达到给函数和数据结构分类的目的,这是一种类似于类的组织结构。但不过对于面向对象语言来说本身提供了类的概念,并强制你使用类进行编程,而面向过程并不强制你这样干,并且也可以能不会有相对应的语法机制来支持面向对象的三大特性。但不过利用一些较为复杂的手段面向过程的编程语言也可以写出面向对象代码风格的代码,只不过相比于面向对象编程语言来写面向对象的风格,付出的代价会高的多!
反而随着面向对象语言的发展发现,面向对象的三大特性之一的继承容易的造成层次不清、代码混乱,因此在新兴的编程语言设计中就开始摒弃继承特性,比如Go语言。因此我们不能因为其没有完全实现面向对象语言的三大特性,而说其不是面向对象的编程语言了!
因此宽松来说面向对象,面向对象,只要语言支持类和对象的语法概念,就可以被称为是面向对象的编程语言
因为在此基础上进行分析和设计系统的交互,按照对象之间的交互,活动进行设计。而不是按照过程化的思想进行设计的。就已经是面向对象编程的思维模式了!
扩展:(与面向对象相关的概念):
这里也扩展两个概念:
面向对象分析(OOA)和面向对象设计(OOD)
和上面的面向对象编程(OOP)三者连起就是面向对象软件开发经历的三个重要过程(一般能在软件工程中学到(笼统的,专门的还会细化))对象分析、设计、编程实现。
面向对象分析:分析分析,在软件工程中,主要由需求分析,在按照得出的需求提取出类和对象。这一阶段只是提取出做什么,需要使用那些类;
面向对象设计:设计,就已经涉及到怎么去做,如何去做,就是去设计这些类。比如说这个类里面会有哪些属性会有哪些方法,提前进行设计好。
面向对象编程:最后的编码实现!
一般情况下:
在分析和设计阶段,如果类的设计都比较随意的话,那么分析的人一多,系统稍微大一点。那么分析出来的结果根本就看不懂,更别说设计了。因此一般需要借助统一的工具:
统一建模语言UML;
因为UML学习成本很高,沟通成本不低
因此UML在互联网公司的项目开发中,用处可能并不大。为了文档化软件设计或者方便讨论软件设计,大部分情况下,随手画个不那么规范的草图,能够达意方便沟通就可以了,因为要是完全按照UML规范来画,付出的时间,金钱并不值得!
问题二:面向对象特性到底可以解决那些编程问题?
封装(也叫信息隐藏或者数据访问保护!)
定义:类通过暴露有限的访问接口、授权外部仅能通过类提供的方式(或者函数)来访问内部信息或者数据!
实现:对于语言来说一般都会提供相对应的语法机制来支持!就是我们的访问修饰符!
解决什么问题勒?
- 保护数据不被随意修改,提供代码可维护性;
说明:如果对类中属性的访问不做限制,那任何代码都可以访问、修改类中的属性,看似更加的灵活,但不过过度的灵活会导致修改的逻辑可以散落在代码中的各个角落,就会影响代码的可读性、可维护性。特别是对于对改业务逻辑不是很理解的人。假设在一个银行卡系统中银行卡的实体类,那么该实体类属性:银行卡号,应该只能对外提供get方法而不能提供set方法,不是很懂业务逻辑的人不小心在哪里修改了一下属性值那么就会产生大的问题;
2.仅暴露有限的必要的接口,提高类的易用性!
比如一个遥控器,如果提供了太多太多按钮的化,那么是不是第一次用的时候就会非常麻烦?类也是如此如果没有方法的私有化的话,那么当你去查看这个类的方法时很有可能需要较为完整的查看这个类的代码!
继承
定义:继承是用来表示类之间的is-a关系。
划分:可以分为 多继承和单继承
实现:需要编程语言提供特殊的语法机制来支持;java中使用关键字extends
解决什么问题?
代码复用!
使用层次理解:如果一组相同的类和属性,那么我们就进行抽取到父类中去,让这些类继承父类,这样两个子类就可以重用父类中的代码,避免代码重复写很多遍;
思维层次理解:我们人出生都会继承的一些东西,最直观的就是继承父母的基因,因此会有很多相似的地方!这是非常符合人类的认识的。
缺点:随着面向对象的发展,逐渐发现,如果过度的使用继承,继承的层次过深过复杂,就会导致代码的可读性、可维护性变差。还有子类和父类的高度耦合。而且代码的复用并不只是继承能实现,组合也同样能够实现,因此到后面会有“多用组合少用继承”的设计思想
多态:
实现:编程语言需要支持
-
父类对象引用子类对象。
-
需要支持继承。
-
继承之后可以重写父类的方法。
当然还有方法的重载也是多态的体现;
划分:
功能:
- 提高代码的可扩展性和复用性
问题三、什么是面向过程?
引言:
面向对象编程和面向过程编程确实大多数人都难以区分其区别,总以为使用java就是在面向对象编程,用c则是在面向过程编程。其实这是不对的。语言是分面向对象和面向过程的,但不过编程的范式,是由编程人程序员自己选择或者是无意识的选择的!现在来详细对比一下面向过程和面向对象这两种编程范式的区别:
由问题得出:
- 什么是面向过程编程与面向过程编程语言?
- 面向对象编程相比面向过程编程有哪些优势?
3.1什么是面向过程编程与面向过程编程语言?
类比面向对象编程与面向对象编程语言的定义
- 面向过程编程是一种编程范式或编程风格。它以过程(可以理解方法、函数、操作)作为组织代码的基本单元,以数据(可以理解为成员变量、属性)与方法相分离为最主要的特点、面向过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
- 面向过程编程语言,最大的特点是不支持类和对象两个语法概念,不支持丰富的面向对象编程特性(比如继承、多态、封装
3.2面向对象编程相比面向过程编程有哪些优势?
1.面向对象更加能够应对大规模的复杂程序的开发(因为现在的软件也是越来越复杂)
在小的程序题之中,或许使用面向过程的方法有可能还会显得更加的简单。
但不过随着现在软件的日益庞大。如果只是使用面向过程的方法,因为面向过程的分析方法都是按照某一流程进行展开,而复杂程序往往是多主线的。那么这时候很难分析出如果多个流程中,代码的复用关系,而且也比较难以构建出高内聚低耦合的系统出来。而面向对象的分析设计编程,是以类为思考对象,先将类的属性方法进行完善,然后在每一个流程中像是搭积木一样,需要哪个类做什么事情,就去这个类里面找。这样的开发模式,能使我们在应对复杂程序开发的时候更加清晰!并且类的功能单一高度内聚。
2. 面向对象风格的代码更易复用、易扩展、易维护
回顾上述的面向三大特性,就可以使得代码根据上面三种特性
3.面向对象风格更加贴近于人的思维
人类的语言开发,从机器码开始慢慢的像汇编语言如何再是高级语言:面向过程和面向对象,这是越来越贴近人类的思维,也是一个逐渐高级的过程
总结这个的。。嘿嘿