计算机软件设计中的抽象分层思想: *** 作系统,网络协议等

计算机软件设计中的抽象分层思想: *** 作系统,网络协议等,第1张

计算机中最重要的思想就是抽象,或者说是封装. 

抽象和分层是我们的强力武器,我们可以利用它们让我们的计算机系统更加强大,完成各种”不可能“。携宽册

*** 作系统,应用软件设计,网络协议栈等等,都体现了分层思想。分层中,每个层次负责不同的功能。一般来讲,下层为上层提供服务,上层不要知道下层的具体实现细节,辩宏只需使用下层提供的服务。而层与层之间联系的桥梁就是“接口”(Interface)。

OS调用硬件提供的api,软件调用OS提供的api,而用户调用软件提供的api。

举个例子,在计算机网络中,处于应用层的协议,如http,ftp等,可以”享受"传输层提供给他们的服务,他们无需考虑底层链路细节,无需考虑报文是如何到达接收方,这就是分层带来的好处!

我们有了分层之后,所带来的可复用性,亦是独立性等,都有助于我们更好的管理计算机这一庞大的系统。

比如,对于物理硬盘的抽象,可以把巧脊它看成一个存储各种数据的对象,有read和write方法。

在设计 *** 作系统时,就体现了主要的分层思想. os管理计算机硬件, app 通过os提供的接口调用使用硬件, 在os的设计中, 广泛使用了分层设计的思想:

计算机网络分层架构

应用软件的设计应该采用分层设计。

分层的程序设计带来的好处是显而易见的,由于层间松散的耦合关系,使得我们可以专注于本层的设计,而不必关心其他层的设计,也不必担心自己的设计会影响其它层,对提高软件质量大有裨益。而且分层设计使得程序结构清晰,升级和维护都变得十分容易,更改层的具体实现代码,只要层接口保持稳定,其他层可以不必修改。即使层的接口发生变化,也只影响上层和下层,修改工作量小而且错误可以控制,不会带来意外的风险。

要保持程序分层设计的优点,就必须坚持层间的松散耦合关系。设计程序前,应先划分出可能的层次,以及此层次提供的服务和需要的服务。程序设计时,应尽量保持层间的隔离,只是使用层归档提供的服务。

下面以一个具体的应用为例加以说明。这个应用主要的功能就是提供银行间跨行的电子票据交换,即甲行输入票据信息,提交到中心清算后转发给乙行。传输的票据信息使用某种可扩充的规范化报文,通过建立在TCP/IP上的MQ传输通道传输,传输中提供端到端加密处理。

首先,分析应用的典型流程。不难知道,整个应用主要流程是业务处理(输入数据),提交通信,报文组织,MQ报文传输,解析报文,业务处理(清算或票据打印)。明显地,MQ传输与具体传输的内容无关,可以作为独立的一层。报文的组织方式,只和对端报文的解析方式有关,和具体的业务处理无关,也可以作为独立的一层。具体业务处理作为独立一层。于是,整个应用分为三层:业务层,报文层,通信层。业务层负责业务数据的处理,报文层完成业务数据交换格式组织,通信层完成报文的传输。其中业务层处于顶层,通信层处于低层,报文层处于中间层。

然后,分析各层提供的服务。通常定义服务,均指下层为上层提供的可使用的功能。

通信层提供报文传输,必然提供发送Send和接收Recv两个功能。它不关心具体的报文内容是什么,也不关心报文格式是什么,因此传递给Send/Recv的参数只能是字符串或文件名。通信层还需要知道报文传输给谁,因此还需要提个参数接收者Receiver。此外通信层可能提供优先级服务,则上层还可以设置一个传输优先级,等等。为此,我们设计一个接口结构,用于报文层和通信层交换数据,结构定义如下:

struct MQMessage

{

// 发送方

// 接收方

// 优先级

// 报文内容

// 报文类型(文件/缓冲区)

// …. 其他的定义

}

再设计两个函数,用于收发友帆报文:

Send(MQMessage & msg)

Recv(MQMessage & msg)

报文层需要发送数据时,组织好报文内容,填写MQMessage结构,然后调用Send()将报文发出。通信层分析MQMessage结构,采取合适的方式将报文内容发送到对端。对端通信层收到报文后,进行必要的报文内容组织好仔雹,填写MQMessage结构,返回给报文层。报文层分析MQMessage结构,获取报文内容。

报文层完成报文组织,就必然提供报文封装和解析两种服务。如果有多种报文格式,则每种格式都需要提供相应的封装和解析服务。它不需要知道业务数据内容,业务层也不需要知道报文的组织形式。下面假定报文格式为:{字段名=字段值;字段名=字段值;戚清…}。报文层提供函数供应用添加字段名、字段值和通过字段名获取字段值,还提供一些必要的管理函数,象这样:

AddField(FieldName,FieldValue) -- 增加

GetField(FieldName,FieldValue) -- 获取

SetField(FieldName,FieldValue) -- 修改

DelField(FieldName) -- 删除

这样,应用层就可以根据自己的需要任意地设置或获取报文具有的内容。应该注意到,由于报文层不关心字段值的含义,因此全部的FieldValue都需要转换成统一的格式,即字符型。完成封装后,应用层还需要将报文发出,因此报文层还需要提供两个函数:

Send() 发出当前的内容

Recv() 接收一个报文

应用层调用Send()时,报文层将当前设置的字段按报文格式封装成一个串,再调用通信层将这个报文发出。应用层调用Recv()时,报文层调用通信层接收一个报文,再将其解析,供应用层获取。

这样我们就完成了系统基本的结构设计和接口设计。

从上面的分析可以看出,分层的程序设计主要有以下特点:

1. 层和层之间通过接口相互访问。层接口是其功能的最小集合,即接口应该尽量的小。

2. 层功能是彼此独立和内敛的。不同层提供的功能不重叠,各不相同。例如报文层决不修改数据库,通信层决不解析报文,等等。同样, *** 作相同数据的功能一定在同一个层中,决不会散列在多个层中。

3. 不垮层访问。如应用层不直接访问通信层。如果应用需要发送不必编码格式的报文,如字符串,则应扩充报文层接口,提供没有格式的报文,而不是应用直接调用通信层传输。

这是由于这些特点,才使得层间分界线十分明显,层间耦合关系松散,才使得分层设计的优点得到体现的

分层思想是一种软件工程方法中最常用的思想,本系列力图通过直白的语言来探讨这种思想背后的故事。

说到软件工程,很多人学软件工程就只誉物是在学校里学了一堆过时的技术,踏上工作岗位后却发现大部分的技术都很难用得上,也因此很多人都在质疑软件工程的价值。

这种现象是有原因的,软件工程是一门年轻的学科,实际开发中的工程方法一直在变化,很多时候当工程方法形成教材的时候就已经过时了;另外因为软件不像其他领域有物理空间、自然法则等的约束(可能唯一的约束就是摩尔定律了),夸张点说拥有无限的可能性。

另一方面在实际应用中大部分软件都是直接面向“人”的问题的,任何问题只要一有“人”的因素,复杂度就会成倍的增加,因此也就很难像其他领域的工程学一样把大部分情况都照顾到并形成一致的规范。所以想要通过学习一些规范就能成为一名合格的工程庆桐液师是不可能的。

软件工程中缺少普适性的规范(当然现在也正在不同的细分领域中逐步轮铅探索),很多时候现有的规范和方法都只能当作一种参考,在实践中更需要创造性,如果只会死记硬背所谓的规范而不去理解背后的思想是没有意义的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12284523.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存