对软件开发中的"抽象"的理解

前言:
在软件开发过程中,经常会提到"抽象"这一概念,无论是应用层、操作系统层,还是驱动层,都会涉及到抽象编程,那到底什么是抽象呢?

1 何为抽象?
1.1从哲学的角度看:
抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。
例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。要抽象,就必须进行比较,没有比较就无法找到在本质上共同的部分。共同特征是指那些能把一类事物与他类事物区分开来的特征,这些具有区分作用的特征又称本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃非本质的特征。所以抽象的过程也是一个裁剪的过程。在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度取决于分析问题的目的。

1.2从自己的理解角度:
先假设下,抽象 = “抽大象”, 让你去抽大象,你会思考什么问题呢?
1.用什么抽?
2.怎么抽?
3.抽哪种大象?
**将 “抽大象” 分解成三个问题,每个问题都是抽象的,不具体。**但是解决问题是需要具体化的,只有当我们去指定问题的具体对象时,才是解决问题的过程的,比如"用木棍轻轻地抽非洲的未成年大象"。
这里的木棍可以竹条、铁棍等等,共性就是可以用来抽的工具。
这里的轻轻地可以的狠狠地等,共性就是抽的方法。
这里的非洲的未成年可以是成年的、公的、母的等,共性就是大象的属性。

那为什么需要抽象呢?在什么时候需要抽象?如何抽象?

2.为什么需要抽象?
因为抽象可以屏蔽差异性,对于使用者来说,调用的对象都一样,他并不关心你的具体实现。
写软件不仅仅是实现功能需求,这只是最基本的,除此之外,需要考虑可移植、可扩展、易维护,这就延伸出软件分层的需要了,如果不分层,移植、扩展、维护都是很头痛的事情。
软件分层之后,需要移植换平台,就改驱动层;需要增加应用,就扩展app;主框架不动,哪里不对改哪里,这就是分层的优势,而层与层之间的接口就会用到抽象。

3.在什么时候抽象?
在每层的接口函数中实现,接口函数需实现功能,并提供输入、输出即可。每个接口函数是对对象的方法类型抽象、接口函数的形参就是对对象的数据类型抽象。达到不论操作什么对象,对于接口调用者来说并不受影响。就像操作系统中的open()、close()、write()、read()一样,一切皆文件。

4.如何抽象?
1.找到共同的数据类型,用结构体打包
2.找到共同的方法类型,分别用函数实现
举例:app编程—实现与上位机的网络通信
**1.底层:**从socket读或者写数据
实现通信的硬件方式:udp、tcp
1)找到共同的数据类型:socket_fd、socket_in、ip、port
2)找到共同的方法类型: init()、recv()、send()、close()

**2.中间层:**通信线程:发送线程(按协议规范打包发送),接收线程(按协议规范解析数据)
发送线程: 组包;包转buffer;调用send()
接收线程:调用recv();buffer转包;解析包

**3.上层:**数据与其他任务进行交互(IPC,进程间通信)
可以对应一个或多个对象,比如与其他多个任务通信;

好的框架,在于用正确的角度去分层、分类的拆分问题,再使用共同的数据类型和共同的方法类型将层与层之间抽象化,去实现抽象编程,进而实现可移植、可扩展,易维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值