那么我们下面呢就是
结合另一个例子进一步来介绍一下它里面的细致的这样一些思考。
那么图书管理系统是在座的同学每天相当于可能都会涉足到的,或者使用的。
那么它是用计算机对图书进行管理,它主要涉及四个方面的工作,比如说新书入库、 读者借书、
读者还书以及图书注销,以及查询某位读者的借书情况。
包括某种图书和整个图书的库存情况等信息。
那么这样的一些功能需求,我们进一步把它细化,大家可以看到,就是说分成这么几点,第- 一个就是
在购入新书的时候,图书管理人员为购入的新书编制图书卡片。
包括分类目录号、 流水号,那么书名、 作者、 内容
摘要、 价格、 购书日期等并写入图书目录文件中。
第二个呢,读者借书的时候,首先要填写借书单,包括姓名、 校园卡号、
预借图书分类目录号等信息,然后管理人员呢将借书单呢输入系统。
继之呢系统检查读者号是否是有效的。
若无效,拒绝借书,否则进一步检查该读者所借图书是否超过最大限制数。
我们假定每位读者,相当于同时只能借阅不超过 5 本,已经超过了
这样的一个限制就拒绝借书,否则呢读者可以借出这个图书。
那么登记图书分类目录号、 读者号和借阅日期 号等,写入到借书文件中。
所以大家看,这是它给的 需求陈述。
那么第三点大家 看,就是在读者还书的时候,读者要填写还书单,
管理人员呢将其输入系统后,系统根据其中的学号
从借书文件中读出该读者的借阅记录,获取该书的还书日期。
判定该书是否预期,以便呢按照规定做出相应的处罚。
那么再对一些过时或者无继续使用价值的图书进行
注销的时候,管理人员要从图书的这个目录文件中删除相关的这个记录。
那么当图书馆领导提出查询要求的时候,系统 要根据查询的要求来给出相应的这样的一些信息。
其中假设为购入的新书编制图书卡片 读者首先填写借书单等功能均由人工实现,
这个太重要了,对吧?有的同学说,老师,你不实行了这个计算机这个图书管理系统?
一下都流水线的,对吧?所有的东西,我就站在那,就说,我要借
软件工程北大出的第三版,如果它能够识别建立好 图书卡号是多么好。
但这个呢毕竟现在还是有一定的难度,所以我们这里面把
一些没有办法通过计算机能够去进行详细处理的这样的 一些功能呢告诉你是人工实现。
所以你就意味着这样的一部分功能不需要在系统内 进行去考虑的,对吧?所以这是帮助你去确定这个系统的边界。
那么根据这样的一个问题陈述呢,
我们把它分为两大块,大家看我是从什么样一个角度分成为两大块?
一个是借还书等事务的处理,一个是咨询事务的处理。
大家看,这是
为什么我要分成这样的两大块?我是从什么样一个角度去进行分割的? [空白_录音]
因为我已经注明了,说不同的功能 出现将导致不同的结果,但它们实际上都是对于
功能的整个内涵的这样的一个体现,都应该体现相应的这个系统 要体现上述的这些功能描述。
那我们这里面是 从整个图书的管理的角度借还书,
那还有一个从图书的什么?信息查询的角度来给出咨询事务的处理,所以我是从
图书的这样的一个被处理,一个是它的管理,还有一个图书 信息的查询这样的一个视觉,相当于来给它分成的这么两大块。
那么根据这样的一个抽象,我们来识别一下顶层的数据流。
有借还书等事务处理要求,那么还有咨询事务的要求,还有相关的数据流,对吧?
那这里面的数据源和数据潭有什么?我们从上面呢可以看到,有图书管理人员,
还有读者,还有什么?时钟?为什么需要时钟?你想,我如果
没有时间车怎么来判定你这个书超期与否给出罚单呢?所以这个时钟是非常重要的。
另一个就是说,你在每次结束的时候,对吧?都应该有一个时间车,还书相当于都需要跟时间- 挂钩,所以也会
有时间车的这样的一个烙印,所以这里面的时钟就是在系统之外,相当于,但是与系统打交道- 的很重要的实体。
所以很多同学会把时钟这样的一个,一个实体给漏掉。
那我们根据这样的一个分类的要求
来把整个的这样的一个图书管理系统进行了它的顶层数据流图的这样的一个 给出。
我们看一下,那么图书管理员 读者和系统时钟,相当于三个实体,是在系统之外的这样的一个实体。
分别起到数据源和数据潭的这样的一个作用啊。
那这里面的 这个相应的输入数据流,大家看有什么?图书管理要求,对吧? 查询要求,还有当前的日期。
那这里面的输出的数据流有什么?图书的 统计表,图书的情况,读者的情况,还有罚款单。
那这个整个,我们大家看,这个图书管理系统
它还是很复杂的,我们并不知道它里面到底还暗含了哪些的功能,对吧?我们这里面只知道它-
进行了一个图书的 通用的这样的一个管理。
所以我们要对它自顶向下来进行分解。
我们希望的是按照一个借还书的这样的一个事务的处理,就是说
从单纯的图书的管理的角度,还有一个图书的信息的这样的一个查询的角度。
这两个方面,所以我们在零层数据流图的时候把 顶层的数据流图里面的加工分成了下面的两个加工。
这两个加工里面大家可以看到,就是说 我要上层的数据流分派到这一层次的加工上去,对吧?
所以那里面有相应的三个输入数据流,还有三个输出数据流
所以我们相当于也要把它分派到这个点上,就可以看到,比如说当前的日期,这是借还书
这个里面,图书管理的要求,对吧?那么这个罚款单。
这个里面呢,大家可以看到,因为在借还书的这个过程中,你会需要借助于 去看一下这个借书的文件记录,包括这个
图书的目录文件这样的信息,来进行借还书的这样的一个处理。
那么还有会借鉴这个读者的这样的一个信息,也就是说
我们因为借还书,最终相当于会把这个读者借了什么样的书,记录到相应的读者文件中。
那么在这个处理的咨询里面,大家可以看到 会给出整个的这样的一个查询的要求,给出
图书的这个统计表,读者的情况,图书的情况等等这样的一些 这个统计的最终的结果,就作为输出数据流。
所以这样的一个过程,大家可以看到 实际上我们在 0 层数据流图里面很重要地要考虑的是什么?
数据库设计的问题,对吧?也就是说形成哪些的文件去存储相应的这样的一些数据,所以这里面
形成了,大家看,有三个数据存储,一个是目录文件、 借书文件和读者文件。
同时我们也要考虑我们采用什么样的数据库 格式,还是普通的文件的形式相当于来对这些数据进行存储,所以
就涉及到一个数据库的一个整体设计理念在这个 0 层数据流图里面,已经相当于要去进一步地去考虑。
那么同样的方式我对加工 1
要进一步地去细化, 那么这个加工 1
呢相当于我们可以把它进一步地细化成这么 五个这个子加工。
那么可以看一下,大家看一下,这个图书管理要求,根据图书管理要求,
我们可以来去处理图书的管理要求,这是总体的,就是把它相当于 这样的一个复杂的打包的数据流进一步去给它什么?分割。
那么形成了下层的数据流,比如说入库单,进行入库、 新书入库的这样的一个功能。
借书单,进行借书功能的处理,包括注销单,注销图书的这样的一个处理。
还有一个, 还书单,还书的这样的一个功能这样一个处理。
所以大家可以看到在这个过程中,我同时把相应的这样的一个数据存储也都分别什么? 在这个地方相当于给它分散了。
那么把这样的一些加工处理的 结果,包括从这样的一个数据存储中拿数据的这样的一些特点,相当于体现出来。
所以这个里面大家就要注意一个, 平衡的问题,也就是说顶层的数据流图
里面的数据流要分散到下一层次的数据流图中去, 一定两者是数量上面是保持一致的。
第二点就是平衡化的这样的一个问题,也就是说, 比如说 7 加减
2 原则,对吧?就在一步这个图里面,它的这个元数 不要超过 7 加减 2 个啊,这样的一些信息。
所以我们要注意,不要过于复杂,把这个加工 相当于分解地过于细小,对吧?那可能就是说这样的一个加工,它虽然说
它的内部的这样的一个处理很简单,但是由于过于
过细了,就使得整个的数据流图看起来特别地什么?复杂,可能有的时候也没有必要,所以- 大家来看
这样的一个数据流图划分完之后,我们要来看一下这样的一个加工是不是 还很复杂,需要进行一步地去细化。
所以这个里面如果觉得还需要进一步地细化,那进一步地去把 相应的这个加工再进行分解,形成下一层的数据流图。
所以,一般情况下,大家看,因为这个已经是作为 这个一层的数据流图,对吧?就说是。
那一般情况下,一个系统三层的数据流图就可以了,比如说顶层 0层、 1层。
那除非比如说再复杂一点的系统,可能相当于就是说,再往下再划分 1 层就可以了。
所以,所以大家在进行课程实践的过程中,我们也建议 画到 3
层数据流图,就能足以表达这个系统的一些功能的细节。
那么这里面的借书,我们认为说还是比较复杂的。
所以呢,我们把这个借书的这样的一个处理逻辑,或者是这样的一个加工,进一步地去进- 行细化。
我们大家看一下,比如借书单,这里面相当于检查读者的有效性,对吧?
无效读者,有效的读者呢,相当于就可以进行 有效读者的借书单去检查读者的资格,对吧?看一下他能借多少本书,如果
借书超限的话,也是输出这样一个。
那么在这里面 如果核准之后他有这样的一个资格,那么就看
一下这个借书单 来去检查这个图书的库存的情况,大力借书。
那如果这本书相当于已经借完了,要输出,该书 已经借完。
所以大家看一下,老师在形成 二层数据流图的时候,有这么几个加粗的数据流。
在顶层的数据流图里面有这几个数据流吗?
没有吧?所以这一层以后,你发现了说,根据你的这样的一个分割,
分解,那你的这个相当于又形成了相当于这三个数据流 这三个数据流是我们在这一层里面单独的呢?还是说
在上一层次我们给它漏掉了?就需要
进一步地去核实,就是说这样的数据流在上一层次没有 那么它是否是应该在这一层次中出现?
是否是在上一层次中已经漏掉了?如果是漏掉了,我们 把它补充到上一层次,或者是它对于上一层次的数据流的一个什么?
打包,在这一层次的什么?进一步的细化,所以要来从两个方面来考察。
一方面看一下上一层的数据流是不是通过打包可以包含这样的 最下层的数据流。
如果可以包含,这样的数据流存在是有意义的。
它是作为上一层的数据流的这样的一个进一步的细化,否则的话,
这样的数据流就说明可能是在上一层的数据流漏掉的,如果它有必然存在的 这个意义的话。
或者是说,你在这一层次它根本就不应该出现。
所以从这几个方面,把相应的这样的一个出现的数据流进行 进一步的确认,它到底属于什么层次的。
所以这个里面,因为在整个的这个
上层的数据流图向下分解的时候,经常会出现这样的问题,所以我说是我们需要考虑的很重要- 的一个问题。
老师在这里面强调了一下。
那么根据上面的 数据流图已经到了二层,于是我们相当于去来描述一下
上层的数据流图里面相应的这个数据流
数据存储,以及构成数据流和数据存储的基本的数据项的 它的这个数据结构。
我们来看一下数据流的条目 有哪些。
比如说查询要求,它就是一个打包的这样的一个上层的数据流,对吧? 那么它包括了读者的情况、
图书的情况和图书统计表 这三个这个进一步的信息。
那么读者情况又进一步地 相当于可以细化成这样的一个通过姓名、
校园卡号、 可借图书数 这样的一个"与"的关系表达出来的这样的一个描述结构。
图书情况就是这样的,那么图书统计表大家看这是一个什么? 选择的关系,A 或 B 或
C 或 D 或 E,对吧? 那么图书管理要求大家看,也是一个打包的这样的一个情况。
实际上它是包含了入库单或者借书单或者还书单或者注销单。
在这个里面,也是分别对入库单、 借书单、 还书单、 注销单进行了进一步的说明。
那么查询结果大家看有读者情况、 图书情况、 图书统计表。
所以大家看这个 读者情况整个就你要来看,整个它到底是不是有效的,对吧,还是无效的?
所以上面的那样的一个结果,就属于一个什么?读者情况可以 进一步细化的有效的读者,还是无效的读者的这样的一个表示。
所以大家在数据流的上下的这样的一致性 检查的时候,特别要切记整个它们之间的一致性的问题。
那么数据存储就要对,比如说借书文件,这是,实际上这里面 是每个都是由
N 条的借书单的这样一个记录单来构成的,目录文件是入库单加上库存量。
读者文件是读者情况的这样的一个多条目录的这样的一个重复。
所以数据项这里面我就没有给出来,实际上是对于数据存储和数据流中相应的构成单位
整个的它的一个进一步的基本数据结构的描述。
比如我上面借到了比如说姓名,对吧?读者姓名,读者姓名你实际上 你在这里面,读者姓名等于字符串,对吧?就是要给出这样的一个描述。
那么进而呢相当于要建立加工
小说明,由于这个本例子呢加工逻辑呢比较简单,所以我们采用结构化的自然语言来给出这个- 加工的说明就可以。
比如说加工2.1,这个查询读者的借书情况可以描述如下。
比如说加工2.1,这是加工编号,大家要记住了。
那么加工的名字是查询读者的借书情况,那么
这个加工的输入数据流有读者的校园卡号,输出的数据流有读者的借书情况。
那么加工的逻辑这里面就通过 begin end 这一段的什么?
自然语言的这样的一个描述,来给出来它的整个的处理。
比如根据 读者的校园卡号在借书文件中获取该读者的借书记录,
准备输出流中的数据,并输出之,所以大家看很简单,对吧?就是把整个的它的这个
借书的这个情况相当于就给它描述清楚了。