面向对象--抽象化

面向对象–抽象化

​ 今天我们上了数据结构课,老师给我们讲了面向对象的思想,其中关于面向对象思想方面的内容,我有很大的疑惑。问了老师一些问题,才发现自己的理解有些偏差。于是整理了一些资料,归纳一下什么才是面向对象。

从问题开始

我原来理解的面向对象被老师批判了,老师说了一句话:面向对象是在抽象层面构建概念的 。我对此有些不解,便以此为关键,搜索了一下。

起源

​ 最早的汇编语言中使用的子例程到结构化编程(C语言),然后到面向对象(C++,java,等)、面向组件(面向组件开发)以及面向服务(面向服务架构)。其实都是不断地提升抽象的层次。在汇编时代问题规模都很小,所以我们需要的抽象能力不需要太强。而现代的软件项目,问题的规模非常庞大,需要考虑的事情非常多(虽然纯粹的技术含量不一定有汇编时代的高),我们就必须使用抽象层次更高的方法来匹配我们的问题规模。于是,我们来看看面向对象的相关资料。

文章引用:https://blog.csdn.net/chenlycly/article/details/8656348

首先,了解一下什么是OO?

​ OO(Object–Oriented )面向对象,Object Oriented是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。所谓面向对象就是基于对象概念,以对象为中心(我在此处犯迷,老是无法理解以对象为中心的抽象性.接下来会详细说一下),以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。

什么是OOP?

​ 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP核心思想:封装,继承,多态。

文章引用:https://blog.csdn.net/hai__chen/article/details/79836467

oop的特点:

1、识认性,系统中的基本构件可识认为一组可识别的离散对象;

2、类别性,系统具有相同数据结构与行为的所有对象可组成一类;

3、多态性,对象具有惟一的静态类型和多个可能的动态类型;

4、继承性,在基本层次关系的不同类中共享数据和操作。

关于第二点,我详细说明一下。我原来把OOP的类别性理解为面向对象,其实不是。这也是我为什么把‘以对象为中心’当作面向对象。此处,再谈一个问题:高内聚,低耦合

高内聚,低耦合

高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合)。这一点也是把代码提升抽象化层次的关键。

此处有代码分解的过程,请大家参考原博客的代码:

https://blog.csdn.net/chenlycly/article/details/8656348

我的理解就是把一个代码块的功能实现后,把这个功能用到的对象继续抽象,剥离原来的主体,单独封装成一个类,有点类似,一个代码块只实现一个小功能,从侧面也体现了低耦合

低耦合:减少类内部,一个成员方法调用另一个成员方法。

此处,我产生了疑问:为什么会这样呢?java不就是靠着不同的类之间的相互调用实现强大的功能呢吗?于是百度了一下什么是耦合。

耦合:是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。 模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。

从百度的结果来看,这个耦合它并不是说,不能耦合。只是说要尽少量的耦合来方便以后代码模块甚至一个小功能的修改。什么意思呢?我理解是这样的:既然要实现一个独立的工程,那么就得分很多小的功能模块,这些小的功能模块啊,它难免会有些关联。怎么样才能使他们的关联性最小呢?我们就把一个功能不断的细化。把用到这个功能的主体继续抽象,就类似于高内聚的方法。这样的话,减少这个功能模块对于其他功能模块的依赖。也就体现了这一段代码的耦合性比较低,假如你把它干掉引用它的功能比较少,其他的代码模块受影响也比较小。

​ 看一下博主的代码,邮件这个对象最后单独成为一个类。他为什么要这么写呢?人这个对象不也是调用了这个邮件吗?耦合度不是增加了吗?其实不然。假如说现在遇到了问题,人不单单发邮件了,人还能发短信。这样我们在改的时候,只能对着人这个类去改。我们为什么不单独做一个短信类出来让人去调用它呢?如果我们把短信这个东西写在了人这个类里面。假如某天短信要增加一点属性呢,我们就还得把人这个类里面的短信给它改掉。而且凡是涉及到人使用短信的,你都得改。到时候就会乱成一团麻,不如直接创建一个短信的类,想增加什么属性就增加什么属性,想怎么改就怎么改,就让人去调用就行了。反过来思考。邮件单独成为一个类也是因为这个原因。在对邮件不断细化的过程中,自然而然要用到结构化的语言,也就是数据结构方面的内容。这就是一个简单的封装。那么它和人这个主体使用邮件又有什么关联呢?关联其实不大。发邮件这个功能也可以被其他的角色所调用。就相当于这样,我们把一个一个的物品都细分成类。他们之间相互调用来触发成一个大的功能。然而我们要在最小的范围内来使他们相互调用的次数更少。假如人一生下来就能发邮件,那么他应该当做一个属性封装在人这个类里面。但事实是一个人他生成之后就没有什么特殊的东西。所以我们不断的创建对象,不断的调用,不断的封装。就形成了一个很大的程序。

发布了83 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43759910/article/details/104815257