精华内容
下载资源
问答
  • 文章目录(一)数据流图的定义:(二)数据流图中的主要图形元素及符号(三)如何画数据流图(四)数据流图的层次结构1. 顶层流2. 底层流(零层)3.中间层流图数据流图设计原则:分层的数据流图(五)实践(六...

    找了一晚上,感觉有的文章介绍的不够全面,现结合教材作一些自己的理解

    (一)数据流图的定义:

    1.数据流图(DFD): 描述数据在系统中如何被传送或变换,以及描述如何对数据流进行变换的功能(子功能);
    2.数据流图就是用来刻画数据流和转换的信息系统建模技术,任何软件系统都可以用数据流图表示。
    –《软件工程》(第三版)高等教育出版社

    (二)数据流图中的主要图形元素及符号

    在这里插入图片描述
    附加符号:
    在这里插入图片描述

    (三)如何画数据流图

    1. 从问题描述中取出4种基本组成成分
    2. 根据1的结果画出系统的基本系统流图(顶层图)
    3. 把由2得到的基本系统模型细化为系统的功能级数据流图
    4. 对功能级数据流图中的主要功能进一步细化,直至满意为止。

    (四)数据流图的层次结构

    为什么要是用层次结构?
    为了表达数据处理过程的数据加工情况,需要采用层次结构的数据流图。按照系统的层次结构进行逐步分解,并以分层的数据流图反映这种结构关系,能清楚地表达和容易理解整个系统。

    1. 顶层流图

    仅包含一个加工,它代表被开发系统。它的输入流是该系统的输入数据,输出流是系统所输出数据

    2. 底层流图(零层图)

    是指其加工不需再做分解的数据流图,它处在最底层,分解原来庞大的系统,增加数据存储和对加工和外部实体的编号

    3.中间层流图

    表示对其上层父图的细化。它的每一加工可能继续细化,形成子图。

    数据流图设计原则:

    在这里插入图片描述

    分层感觉就是在上一层的变化流的基础上扩展

    分层的数据流图

    在这里插入图片描述

    (五)实践

    写了一晚上,感觉画数据流图就是要多看多练才有感觉,直接上题

    实践例题1:图书预定系统
    在这里插入图片描述
    第一步:画出顶层数据流图
    在这里插入图片描述
    第二步:细化
    在这里插入图片描述
    第三步:逐步细化
    在这里插入图片描述
    实践例题2:
    在这里插入图片描述
    在这里插入图片描述
    第四步:对主要功能进一步细化

    因为用户命令在上一步已经细化得很彻底了,所以这里只需要进一步细化传感数据

    在这里插入图片描述

    (六)数据词典

    为什么要使用数据字典?
    答:数据词典与数据流图配合,能清楚地表达数据处理的要求

    词条描述:
    对于在数据流图中每一个被命名的图形元素,均加以定义,其内容有: 名字,别名或编号,分类,描述,定义,位置,其它等

    数据流词条描述:

    数据流名:
    说明:简要介绍作用即它产生的原因和结果
    数据流来源:来自何方
    数据流去向:去向何处
    数据流组成:数据结构
    数据量流通量:数据量,流通量

    数据元素词条描述:

    数据元素名:
    类型:数字(离散值,连续值),文字(编码类型)
    长度:
    取值范围:
    相关的数据元素及数据结构:

    数据文件词条描述:

    数据文件名:
    简述:存放的是什么数据
    输入数据:
    输出数据:
    数据文件组成:数据结构
    存储方式:顺序,直接,关键码
    存取频率:

    加工逻辑词条描述:

    加工名:
    加工编号:反映该加工的层次
    简要描述:加工逻辑及功能简述
    输入数据流:
    输出数据流:
    加工逻辑:简述加工程序,加工顺序

    源点及汇(终)点词条描述

    名称:外部实体名
    简要描述:什么外部实体
    有关数据流:
    数目:

    例如:
    名字:零件编号
    别名:
    描述:唯一地标识库存清单中一个特定零件 的关键码
    定义:零件编号=8{字符}8
    位置:定货报表
    定货清单
    ……

    简而言之就是对我们已经编号的各个成分进行解释说明

    (七)变换分析方法

    在这里插入图片描述

    步骤1. 复审基本系统模型

    什么是基本系统模型
    —基本系统模型即SRS中的顶级数据流图
    为什么需要对基本系统模型进行复审
    —对系统规格说明书和SRS进行评估,以确保系统的输入和输出数据符合实际

    步骤2. 复审和精化数据流图

    为什么需要复审和精化数据流图
    —确保DFD给出目标系统正确的逻辑模型
    以获得足够详细的DFD
    ---- 确保DFD中每个转换代表一个规模适中、相对独立的子功能

    步骤3. 确定数据流图的类型

    信息流都可用变换流表示,但是如果有明显的事务流特征,则还应采用事务流的映射方法。
    设计人员负责判定在数据流图中占主导地位的信息流是变换流还是事务流。

    步骤4. 划分输入流、输出流边界

    在这里插入图片描述
    在这里插入图片描述
    划分流界例子
    在这里插入图片描述

    步骤5. 执行一级分解

    任务: 导出三个层次结构的软件结构

    • 底层模块:用于输入、输出和计算等基本功能
    • 中间层模块:协调、控制底层模块的工作
    • 高层模块:用于协调和控制所有的从属模块
      原则
    • 在确保完成系统功能并保持低耦合度、高内聚度的情况下尽可能的减少模块数目
      一级分解的结果可以用层次图、结构图等来表示

    在这里插入图片描述

    步骤6. 执行二级分解

    在这里插入图片描述
    在这里插入图片描述

    步骤7. 精化软件结构改良软件质量

    以“模块化”的思想,对软件结构中的模块进行拆并,以追求高内聚、低耦合、易实现、易测试、易维护的软件结构
    在这里插入图片描述

    画图不上例题就是耍无赖,安排

    先展示一下书本上的例题:家庭安全系统
    在这里插入图片描述
    在这里插入图片描述
    第一层:
    在这里插入图片描述
    第二层:
    在这里插入图片描述
    第三层:
    在这里插入图片描述
    转化成的结构图:
    在这里插入图片描述

    书上的例题看完后,我不是很理解,不知道你们感觉如何,既然这条路走不通,咱就换条

    将下列数据流图转换成SC软件结构图:
    例题一:
    在这里插入图片描述
    在这里插入图片描述

    例题二:
    在这里插入图片描述
    在这里插入图片描述

    总结:

    1.这个数据流程图呢,结合例题多看,多做吧,实践中加深理解。
    2.细化的画法不唯一,我们老师说画的合情合理即可。

    展开全文
  • OpenCV 读取数据流图片

    2021-03-17 22:49:20
    背景OpenCV 提供的 API 是直接根据路径读取图片的, 在实际生产环境中,可能大部分情况下都是直接读取网络图片在内存就完成图片和 opencv 的 Mat 对象的转换那么该如何读取 byte[] 的图片呢?APIopenCV 提供的 APIMat ...

    背景

    OpenCV 提供的 API 是直接根据路径读取图片的, 在实际生产环境中,可能大部分情况下都是直接读取网络图片

    在内存就完成图片和 opencv 的 Mat 对象的转换

    那么该如何读取 byte[] 的图片呢?

    API

    openCV 提供的 API

    Mat src = Imgcodecs.imread("/static/img/17.png");

    很简单的就转化为 Mat 对象

    而 该方法后面还有一个参数, flags, 该参数可选项有:

    IMREAD_UNCHANGED = -1,

    IMREAD_GRAYSCALE = 0,

    IMREAD_COLOR = 1,

    IMREAD_ANYDEPTH = 2,

    IMREAD_ANYCOLOR = 4,

    IMREAD_LOAD_GDAL = 8,

    IMREAD_REDUCED_GRAYSCALE_2 = 16,

    IMREAD_REDUCED_COLOR_2 = 17,

    IMREAD_REDUCED_GRAYSCALE_4 = 32,

    IMREAD_REDUCED_COLOR_4 = 33,

    IMREAD_REDUCED_GRAYSCALE_8 = 64,

    IMREAD_REDUCED_COLOR_8 = 65,

    IMREAD_IGNORE_ORIENTATION = 128;

    IMREAD_UNCHANGED: 以图片原有的方式读入,不进行任何改变

    IMREAD_GRAYSCALE: 以灰度图读取

    IMREAD_COLOR: 以彩色图读取

    过渡

    为了支持 OpenCV 读取 byte[] 的图片,为此我查找了很多资料做了大量的实验,有很多失败报错了,也有读取成功的,下面我将一一列举出来….

    读取失败

    Converters 类

    我留意到 opencv 提供的 api 里有一个 utils 包, 里面有个转换类 Converters, 可以将 Mat 和 一些 java 的基本数据类型进行互相转换,其中有这样 2 个方法: vector_uchar_to_Mat 和 vector_char_to_Mat

    参数是 List

    private static Mat testConvertChar2Mat(byte[] bytes){

    @SuppressWarnings("unchecked")

    List bs = CollectionUtils.arrayToList(bytes);

    return Converters.vector_uchar_to_Mat(bs);

    // return Converters.vector_char_to_Mat(bs);

    }

    vector_uchar_to_Mat 指有符号

    转换出来的图片是一个像素的竖直线,读取失败

    new Mat

    Mat 对象除了转化得到,还可以 new , 再利用 Mat 的 put 方法,来创建 Mat

    private static Mat testNewMat(int height, int width, byte[] bytes) throws IOException {

    Mat data = new Mat(height, width, CvType.CV_8UC3);

    data.put(0, 0, bytes);

    return data;

    }

    转换出来的图片也不对,一些花花绿绿的像素点

    new BufferByte

    Mat 对象还有个构造方法,最后一个参数是传入 BufferByte,这时只需要在上述步骤中再将 byte[] 转化为 BufferByte

    private static Mat testNewBuffer(int height, int width, byte[] bytes){

    ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

    return new Mat(height, width, CvType.CV_8UC3,byteBuffer);

    }

    抛出异常: CvException [org.opencv.core.CvException: cv::Exception: OpenCV(4.1.0-pre) /Users/joylau/opencv4/opencv/modules/core/include/opencv2/core/mat.inl.hpp:548: error: (-215:Assertion failed) total() == 0 || data != NULL in function ‘Mat’

    读取成功

    BufferedImage 转换

    一次我在调试代码时 发现HighGui.waitKey(); 的实现是将 Mat 对象转化为 BufferedImage 的逻辑,于是我明白了,OpenCV 里操作的 Mat 在显示的时候也需要转化为 BufferedImage

    源码里有这样一段代码

    public static Image toBufferedImage(Mat m) {

    int type = BufferedImage.TYPE_BYTE_GRAY;

    if (m.channels() > 1) {

    type = BufferedImage.TYPE_3BYTE_BGR;

    }

    int bufferSize = m.channels() * m.cols() * m.rows();

    byte[] b = new byte[bufferSize];

    m.get(0, 0, b); // get all the pixels

    BufferedImage image = new BufferedImage(m.cols(), m.rows(), type);

    final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();

    System.arraycopy(b, 0, targetPixels, 0, b.length);

    return image;

    }

    此时,我逆向转化,将 byte[] 转 BufferedImage ,BufferedImage 再转 Mat 即可

    private static byte[] getBufferedImageByte(byte[] bytes) throws IOException{

    BufferedImage bImage = ImageIO.read(new ByteArrayInputStream(bytes));

    return ((DataBufferByte) bImage.getRaster().getDataBuffer()).getData();

    }

    // 再将从 BufferedImage 得到的 byte[] 使用 new Mat 对象

    private static Mat testNewMat(int height, int width, byte[] bytes) throws IOException {

    Mat data = new Mat(height, width, CvType.CV_8UC3);

    data.put(0, 0, bytes);

    return data;

    }

    该方法成功读取显示了图片

    于是又引发了我的思考: 为什么直接从文件读取的 byte[] 无法被转化,而 BufferedImage 中得到的 byte[] 却可以被转化

    于是我将 BufferedImage 中得到的 byte[] 在使用,调用 Converters.vector_char_to_Mat 方法

    可惜却失败了…..

    imdecode

    Imgcodecs 类中有一个编码的方法 Imgcodecs.imdecode(Mat buf, int flags)

    Mat 还有个子类 MatOfByte

    private static Mat testImdecode(byte[] bytes){

    return Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.IMREAD_COLOR);

    }

    该方法可成功转化

    而且比上一个方法的优势是:

    byte[] 不需要再通过 BufferedImage 转化

    不需要初始化 Mat 的长和宽

    为此还可以逆向得出 Mat 转换成 byte[] 的方法

    /**

    * Mat转换成byte数组

    *

    * @param matrix 要转换的Mat

    * @param fileExtension 格式为 ".jpg", ".png", etc

    */

    public static byte[] mat2Byte(Mat matrix, String fileExtension) {

    MatOfByte mob = new MatOfByte();

    Imgcodecs.imencode(fileExtension, matrix, mob);

    return mob.toArray();

    }

    最后

    以下是全部测试代码

    /**

    * Created by liuf on 2019-04-01.

    * cn.joylau.code

    * liuf@ahtsoft.com

    */

    @Slf4j

    public class Byte2Mat {

    public static void main(String[] args) throws Exception {

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

    // Mat mat = testImdecode(getImageByte());

    // Mat mat = testConvertChar2Mat(getBufferedImageByte(getImageByte()));

    // Mat mat = testNewBuffer(480,480,getImageByte());

    // Mat mat = testNewMat(480,480,getImageByte());

    Mat mat = testNewMat(480,480,getBufferedImageByte(getImageByte()));

    log.info("{},{}",mat.rows(),mat.cols());

    HighGui.imshow("byte2mat",mat);

    HighGui.waitKey();

    HighGui.destroyAllWindows();

    }

    private static byte[] getImageByte() throws IOException{

    Resource resource = new FileSystemResource("/Users/joylau/work/anhui-project/traffic-service-layer/src/main/resources/static/img/1.jpg");

    return IOUtils.toByteArray(resource.getInputStream());

    }

    private static byte[] getBufferedImageByte(byte[] bytes) throws IOException{

    BufferedImage bImage = ImageIO.read(new ByteArrayInputStream(bytes));

    return ((DataBufferByte) bImage.getRaster().getDataBuffer()).getData();

    }

    private static Mat testNewMat(int height, int width, byte[] bytes) throws IOException {

    Mat data = new Mat(height, width, CvType.CV_8UC3);

    data.put(0, 0, bytes);

    return data;

    }

    private static Mat testNewBuffer(int height, int width, byte[] bytes){

    ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

    return new Mat(height, width, CvType.CV_8UC3,byteBuffer);

    }

    private static Mat testConvertChar2Mat(byte[] bytes){

    @SuppressWarnings("unchecked")

    List bs = CollectionUtils.arrayToList(bytes);

    return Converters.vector_uchar_to_Mat(bs);

    // return Converters.vector_char_to_Mat(bs);

    }

    private static Mat testImdecode(byte[] bytes){

    return Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.IMREAD_COLOR);

    }

    /**

    * Mat转换成byte数组

    *

    * @param matrix 要转换的Mat

    * @param fileExtension 格式为 ".jpg", ".png", etc

    */

    public static byte[] mat2Byte(Mat matrix, String fileExtension) {

    MatOfByte mob = new MatOfByte();

    Imgcodecs.imencode(fileExtension, matrix, mob);

    return mob.toArray();

    }

    }

    留言

    展开全文
  • 数据流图(DFD)画法

    2021-01-28 11:35:42
    5-4-1 数据流图的基本符号例:5-4-2是一简单的数据流图,它表示数据X从源S流出,经P1加工转换成Y,接着经P2加工转换为Z,在加工过程中从F中读取数据。5-4-2 数据流图举例下面来详细讨论各基本符号的...

    数据流图(DFD)画法要求

    一、数据流图(DFD)

    1.数据流图的基本符号

    数据流图由四种基本符号组成,见图5-4-1所示。

    6a2e55a8f8372dbb29c1bb0db01bce87.png

    图5-4-1  数据流图的基本符号

    例:图5-4-2是一个简单的数据流图,它表示数据X从源S流出,经P1加工转换成Y,接着经P2加工转换为Z,在加工过程中从F中读取数据。

    b7e0f16622bc2e83931d3d9f96f0a431.png

    图5-4-2 数据流图举例

    下面来详细讨论各基本符号的使用方法。

    2.数据流

    数据流由一组确定的数据组成。例如“发票”为一个数据流,它由品名、规格、单位、单价、数量等数据组成。数据流用带有名字的具有箭头的线段表示,名字称为数据流名,表示流经的数据,箭头表示流向。数据流可以从加工流向加工,也可以从加工流进、流出文件,还可以从源点流向加工或从加工流向终点。

    对数据流的表示有以下约定:

    对流进或流出文件的数据流不需标注名字,因为文件本身就足以说明数据流。而别的数据流则必须标出名字,名字应能反映数据流的含义。

    数据流不允许同名。

    两个数据流在结构上相同是允许的,但必须体现人们对数据流的不同理解。例如图5-4-3(a)中的合理领料单与领料单两个数据流,它们的结构相同,但前者增加了合理性这一信息。

    两个加工之间可以有几股不同的数据流,这是由于它们的用途不同,或它们之间没有联系,或它们的流动时间不同,如图5-4-3(b)所示。

    f2277ec9c6c3542827ddc353a17ce175.png

    (a)                                 (b)                                  (c)

    图5-4-3 简单数据流图举例

    数据流图描述的是数据流而不是控制流。如图5-4-3 (c)中,“月末”只是为了激发加工“计算工资”,是一个控制流而不是数据流,所以应从图中删去。

    3.加工处理

    加工处理是对数据进行的操作,它把流入的数据流转换为流出的数据流。每个加工处理都应取一个名字表示它的含义,并规定一个编号用来标识该加工在层次分解中的位置。名字中必须包含一个动词,例如“计算”、“打印”等。

    对数据加工转换的方式有两种:

    改变数据的结构,例如将数组中各数据重新排序;

    产生新的数据,例如对原来的数据总计、求平均等值。

    4.文件

    文件是存贮数据的工具。文件名应与它的内容一致,写在开口长条内。从文件流入或流出数据流时,数据流方向是很重要的。如果是读文件,则数据流的方向应从文件流出,写文件时则相反;如果是又读又写,则数据流是双向的。在修改文件时,虽然必须首先读文件,但其本质是写文件,因此数据流应流向文件,而不是双向。

    例如,在图5-4-3 (a)中,检查合理性加工时,只从库存帐目文件中读出库存信息与领料单核对,所以数据流从文件流出,箭头指向加工。

    5.数据源或终点

    数据源和终点表示数据的外部来源和去处。它通常是系统之外的人员或组织,不受系统控制。

    为了避免在数据流图上出现线条交叉,同一个源点、终点或文件均可在不同位置多次出现,这时要在源(终)点符号的右下方画小斜线,或在文件符号左边画竖线,以示重复,如图5-4-4所示。

    f33c95790e43046bfbd4fdb5ff9a8bbd.png

    图5-4-4 重复的源点、终点或文件

    由上图可见,数据流图可通过基本符号直观地表示系统的数据流程、加工、存贮等过程。但它不能表达每个数据和加工的具体、详细的含义,这些信息需要在“数据字典”和“加工说明”中表达。

    6.DFD的画法

    一般遵循“由外向里”的原则,即先确定系统的边界或范围,再考虑系统的内部,先画加工的输入和输出,再画加工的内部。即:

    (1)识别系统的输入和输出。

    (2)从输入端至输出端画数据流和加工,并同时加上文件。

    (3)加工的分解“ 由外向里”进行分解。

    (4)数据流的命名,名字要确切,能反映整体。

    (5)各种符号布置要合理,分布均匀,尽量避免交叉线。

    (6)先考虑稳定态,后考虑瞬间态。如系统启动后在正常工作状态,稍后再考虑系统的启动和终止状态。

    对于不同的问题,数据流图可以有不同的画法。一般情况下,应该遵守“由外向里”的原则。即先确定系统的边界或范围,再考虑系统的内部,先画加工的输入和输出,再画加工内部。具体实行时可按下述步骤进行:

    (1)识别系统的输入和输出,画出顶层图

    即确定系统的边界。在系统分析初期,系统的功能需求等还不很明确,为了防止遗漏,不妨先将范围定得大一些。系统边界确定后,那么越过边界的数据流就是系统的输入或输出,将输入与输出用加工符号连接起来,并加上输入数据来源和输出数据去向就形成了顶层图。

    (2)画系统内部的数据流、加工与文件,画出一级细化图

    从系统输入端到输出端(也可反之),逐步用数据流和加工连接起来,当数据流的组成或值发生变化时,就在该处画一个“加工”符号。

    画数据流图时还应同时画上文件,以反映各种数据的存贮处,并表明数据流是流入还是流出文件。

    最后,再回过头来检查系统的边界,补上遗漏但有用的输入输出数据流,删去那些没被系统使用的数据流。

    (3)加工的进一步分解,画出二级细化图

    同样运用“由外向里”方式对每个加工进行分析,如果在该加工内部还有数据流,则可将该加工分成若干个子加工,并用一些数据流把子加工联接起来,即可画出二级细化图。二级细化图可在一级细化图的基础上画出,也可单独画出该加工的二级细化图,二级细化图也称为该加工的子图。

    (4)其它注意事项

    一般应先给数据流命名,再根据输入/输出数据流名的含义为加工命名。名字含义要确切,要能反映相应的整体。若碰到难以命名的情况,则很可能是分解不恰当造成的。应考虑重新分解。

    从左至右画数据流图。通常左侧、右侧分别是数据源和终点,中间是一系列加工和文件。正式的数据流图应尽量避免线条交叉,必要时可用重复的数据源、终点和文件符号。此外,数据流图中各种符号布置要合理,分布应均匀。

    画数据流图是一项艰巨的工作,要做好重画的思想准备,重画是为了消除隐患,有必要不断改进。

    因为作为顶层加工处理的改变域是确定的,所以改变域的分解是严格的自顶向下分解的。由于目标系统目前还不存在,应此分解时开发人员还需凭经验进行,这是一项创造性的劳动。同时,在建立目标系统数据流图时,还应充分利用本章讲过的各种方法和技术,例如:分解时尽量减少各加工之间的数据流;数据流图中各个成分的命名要恰当;父图与子图间要注意平衡等等。

    当画出分层数据流图,并为数据流图中各个成分编写词典条目或加工说明后,就获得了目标系统的初步逻辑模型。

    二、画分层数据流图时应注意的问题

    下面从四个方面讨论画分层数据流图时应注意的问题。

    1.合理编号

    分层数据流图的顶层称为0层,称它是第1层的父图,而第1层既是0层图的子图,又是第2层图的父图,依此类推。由于父图中有的加工可能就是功能单元,不能再分解,因此父图拥有的子图数少于或等于父图中的加工个数。

    为了便于管理,应按下列规则为数据流图中的加工编号:

    l          子图中的编号为父图号和子加工的编号组成。

    l          子图的父图号就是父图中相应加工的编号。

    为简单起见,约定第1层图的父图号为0,编号只写加工编号1、2、3...,下面各层由父图号1、1.1等加上子加工的编号1、2、3...组成。按上述规则,图的编号即能反映出它所属的层次以及它的父图编号的信息,还能反映子加工的处理信息。例如1表示第1层图的1号加工处理,1.1、1.2、1.3...表示父图为1号加工的子加工,1.3.1、1.3.2、1.3.3...表示父图号为1.3加工的子加工。

    为了方便,对数据流图中的每个加工,可以只标出局部号,但在加工说明中,必须使用完整的编号。例如图5-4-5可表示第1层图的1号加工的子图,编号可以简化成图中的形式。

    596fa7eaf49eea5bde0ef1eb2e0727df.png

    图5-4-5  简化子图编号示例

    2.注意子图与父图的平衡

    子图与父图的数据流必须平衡,这是分层数据流的重要性质。这里的平衡指的是子图的输入、输出数据流必须与父图中对应加工的输入、输出数据流相同。但下列两种情况是允许的,一是子图的输入/输出流比父图中相应加工的输入/输出流表达得更细。例如,在图5-4-6中,若父图的“订货单”数据流是由客户、品种、帐号、数量四部分组成,则图中的子图和父图是平衡的。在实际中,检查该类情况的平衡,需借助于数据词典进行。二是考虑平衡时,可以忽略枝节性的数据流。例如图5-4-6,在4号加工的子图中4.3号子加工中增加了一个输出,表示出错的数据流(由虚线所示),则子图和父图仍可看作是平衡的。

    3.局部文件

    图5-4-7中的父图和子图是平衡的,但子图中的文件W并没在父图中出现。这是由于对文件W的读、写完全局限在加工3.3之内,在父图中各个加工之间的界面上不出现,该文件是子图的局部文件或为临时文件。

    3d5e1eafed434c1e7896c9ee744b5848.png

    图5-4-7  数据流图中的局部文件

    应当指出的是,如果一个临时文件在某层数据流图中的某些加工之间出现,则在该层数据流图中就必须画出这个文件。一旦文件被单独画出,那么也需画出这个文件同其它成分之间的联系。

    4.分解的程度

    对于规模较大的系统的分层数据流图,如果一下子把加工直接分解成基本加工单元,一张图上画出过多的加工将使人难以理解,也增加了分解的复杂度。然而,如果每次分解产生的子加工太少,会使分解层次过多而增加作图的工作量,阅读也不方便。经验表明,一般说来一个加工每次分解量最多不要超过七个为宜。同时,分解时应遵循以下原则:

    l          分解应自然,概念上要合理、清晰。

    l          上层可分解的快些(即分解成的子加工个数多些),这是因为上层是综合性描述,对可读性的影响小。而下层应分解得慢些。

    l          在不影响可读性的前提下,应适当地多分解成几部分,以减少分解层数。

    l          一般说来,当加工可用一页纸明确地表述时,或加工只有单一输入/输出数据流时(出错处理不包括在内),就应停止对该加工的分解。另外,对数据流图中不再作分解的加工(即功能单元),必须作出详细的加工说明,并且每个加工说明的编号必须与功能单元的编号一致。

    三、数据流图的修改

    前面介绍了画数据流图的基本方法。对于一个大型系统来说,由于在系统分析初期人们对于问题理解的深度不够,在数据流图上也不可避免地会存在某些缺陷或错误。因此还需要进行修改,才能得到完善的数据流图。这里介绍如何从正确性和可读性方面对数据流图进行改进。

    1.正确性

    数据流图的正确性,可以从以下几个方面来检查:

    (1)数据守恒

    (2)文件使用

    在数据流图中,文件与加工之间数据流的方向应按规定认真标注,这样也有利于对文件使用正确性的检查。例如,在图5-4-8中,因为文件1和文件2是子图的局部文件,所以在子图中应画出对文件的全部引用。但子图中文件2好象一个“渗井”,数据只流进不流出,显然是一个错误。

    10c9f7a5646d38911e92b572c6170bc1.png

    图5-4-8  局部文件使用错误

    (3) 子、父图平衡

    造成子图与父图不平衡的一个常见原因是在增加或删除一个加工时,忽视了对相应父图或子图的修改。在检查数据流图时应注意这一点。

    (4) 加工与数据流的命名

    加工和数据流的名字必须体现被命名对象的全部内容而不是一部分。对于加工的名字,应检查它的含义与被加工的输入/输出数据流是否匹配。

    一个加工的输出数据流仅由它的输入数据流确定,这个规则绝不能违背。数据不守恒的错误有两种,一是漏掉某些输入数据流,二是某些输入数据流在加工内部没有被使用。虽然有时后者并不一定是个错误,但也要认真考虑,对于确实无用的数据就应该删去,以简化加工之间的联系。

    在检查数据流图时,应注意消除控制流。

    2.可读性

    数据流图的可读性,可以从以下几个方面来提高:

    (1)简化加工之间的联系

    各加工之间的数据流越少,各加工的独立性就越高。因此应当尽量减少加工之间数据流的数目,有必要时可采用后面要介绍的步骤对数据流图重新分解。

    (2)分解应当均匀

    在同一张数据流图上,应避免出现某些加工已是功能单元,而另一些加工却还应继续分解好几层的情况出现。否则应考虑重新分解。

    (3)命名应当恰当

    理想的加工名由一个具体的动词和一个具体的宾语(名词)组成。数据流和文件的名字也应具体、明确。

    3. 数据流图重新分解的步骤

    有时需要对作出的部分或全部数据流图作重新分解,可按以下步骤进行:

    (1)把需要重新分解的所有子图连成一张;

    (2)根据各部分之间联系最少的原则,把图划分成几部分;

    (3)重建父图,即把第二步所得的每一部分画成一个圆圈,各部分之间的联系就是加工之间的界面;

    (4)重建各张子图,只需把第二步所得的图,按各自的边界剪开即可;

    (5)为所有加工重新命名、编号。

    例如,图5-4-9中加工2和其它加工的联系太复杂以致很难独立理解,所以其结构不太合理。因为图5-4-9的子图是由不相连的两部分组成的,所以将它们的父图加工分成两个更为合适。

    416fabd593010e13beb8ba4efe6b264f.png

    图5-4-9 结构不合理的数据流图

    展开全文
  • 分层数据流图(画法+例子)

    千次阅读 多人点赞 2021-07-17 21:57:05
    根据刚刚我们画出的顶层,把系统的加工分成若干个子加工,这里是关键点,一个数据流图画的好不好大概率就取决于我们把加工分得合不合理。 画得时候搞清楚有哪些数据流注意一下数据该不该存储 1.2 具体步骤(说得...

    分层数据流图(画法+例子)

    数据流图基本元素

    1. 数据流图基本元素:
      1. 数据流:每个数据流都应该命名,以反映该数据流的含义
      2. 加工:每个加工应有名字和编号以反映其功能和在DFD中的层次位置。有输入无输出称位黑洞,输入不足以产生输出称为灰洞。
      3. 数据存储:读,写,修改
      4. 外部实体:存在于软件系统之外的人员或组织,指出系统数据的源和宿
    2. 数据流图一些扩充符号:
      1. 星号(*):表示数据流之间的“与”关系
      2. 加号(+):表示数据流之间的“或”关系
      3. 异或符号
    3. 数据流图层次结构:层次+编号;(一般控制在7±2的范围内)
      在这里插入图片描述

    1. 步骤

    1.1 个人理解(说人话)

    画数据流图的大概步骤就是:

    1. 我们根据题目分析出这个系统的外部系统,找出数据流的宿,搞清楚每个数据流的流向画出顶层图
    2. 根据刚刚我们画出的顶层图,把系统的加工分成若干个子加工,这里是关键点,一个数据流图画的好不好大概率就取决于我们把加工分得合不合理。
    3. 画得时候搞清楚有哪些数据流注意一下数据该不该存储

    1.2 具体步骤(说得人话过于简单,看看加深理解)

    1. 画系统的输入输出:
      系统的输入和输出用典藏图来描述 ,及描述系统从哪些外部实体接收数据,以及系统发送数据到哪些外部实体。顶层图只有一个加工及开发的软件系统 顶层图中的数据流就是系统的输入输出信息定成图中通常没有数据存储。

    2. 画系统的内部
      将顶层图的加工分解成若干个加工 并用数据流将这些加工连接起来 使得顶层图中的输入数据经过若干个加工处理后 变换成顶层图的输出数据流 这张图称为零层图 。从一个加工画出一张数据流图的过程 实际上就是对这个加工的分解 。

      1. 确定加工。 这里的加工指的是父图中某加工分解而成的子加工,可以采用下面两种方法来确定加工。
        1. 根据功能分解来确定加工。一个加工实际 上反映了系统的一种功能,根据功能分解的原理,可以将一一个复杂的功能分解成若干个较小的功能,每个较小的功能就是分解后的子加工。这种方去多应用于高层DFD中加工的分解。
        2. 根据业务处理流程确定加工。分析父图中待分解的加工的业务处理流程,流程中的每一步都可能是一 个子加工。特别要注意在业务流程中数据流发生变化或数据流的值发生变化的地方,应该存在一个加工, 该加工将原数据流(作为该加工的输入数据流)处理成变化后的数据流(作为该加工的输出数据流)。该方法较多应用于低层DFD中加工的分解,它能描述父加工中输入数据流到输出数据流之间的加工细节。
      2. 确定数据流。 当用户把若干个数据看作一个整体来处理(这些数据一起到达, 一一起加工)时,可以把这些数据看成一一个数据流。通常,实际工作环境中的表单就是一种数据流。在父图中某加工分解而成的子图中,父图中相应加工的输入/输出数据流就是子图边界上的输入/输出数据流。另外,在分解后的子加工之间应增添- 些新的数据流,这些数据流是加工过程中的中间数据(对某子加工输入数据流的改变),它们与所有的子加工一起完成了父图中相应加工的输入数据流到输出数据流的变换。如果某些中间数据需要保存,以备使用,那么可以表示为流向数据存储的数据流。
      3. 确定数据存储。 在由父图中某加工分解而成的子图中,如果父图中该加工存在流向数据存储的数据流(写操作),或者存在从数据存储流向该加工的数据流(读操作),则这种数据存储和相关的数据流都画在子图中。在分解的子图中,如果需要保存某些中间数据,以备以后使用,那么可以将这些数据组成一个新的文件。 在自顶向下画分层数据流图时,新数据存储(首次出现的)至少应有一个加工为其写入记录,同时至少存在另一个加工读取该数据存储的记录。注意,对于从父图中继承下来的数据存储,在子图中可能只对其读记录,或者写记录。
      4. 确定源和宿。 通常在0层图和其他子图中不必画出源和宿,有时为了提供可读性,可以将顶层图中的源和宿画在0层图中。当同一个外部实体(人或组织)既是系统的源,又是系统的宿时,可以用同一一个图形符号来表示。为了画图的方便,避免图中线的交叉,同一个源或宿可以重复画在DFD的不同位置,以增加可读性,但它们仍代表同一个实体。
    3. 画加工的内部。 当DFD中存在某个比较复杂的加工时,可以将它分解成一张DFD子图。分解的方法是将该加工看作一一个小系统,该加工的输入/输出数据流就是这个假设的小系统的输入/输出数据流,然后采用画0层图的方法画出该加工的子图。

    题目:考务处理系统

    考务处理系统的功能需求如下。
    ①对考生送来的报名单进行检查。
    ②对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷站。
    ③对阅卷站送来的成绩清单进行检查,并根据考试中心指定的合格标准审定合格者。
    ④制作考生通知单(内含成绩合格/不合格标志)送给考生。
    ⑤按地区、年龄、文化程度、职业和考试级别等进行成绩分类统计和试题难度分析,产生统计分析表。
    部分数据流的组成如下。
    报名单=地区+序号+姓名+文化程度+职业+考试级别+通信地址
    正式报名单=准考证号+报名单
    准考证=地区+序号+姓名+准考证号+考试级别+考场
    考生名单={准考证号+考试级别} (其中, {w}表示w重复多次)
    考生名册=正式报名单
    统计分析表=分类统计表+难度分析表
    考生通知单=准考证号+姓名+通信地址+考试级别+考试成绩+合格标志

    1. 顶层图分析:我们先分析以下题目找出外部实体。分析可知外部实体有:学生,阅卷站,考试中心。(特别说明一下,别把考务处理系统也理解成实体,处理系统要完成我们得数据处理工作,所以考务处理系统是加工)。接下来我们分析每个数据流的走向
      1. 报名单:考生–>考务处理系统
      2. 准考证:考务处理系统–>考生
      3. 考生名单:考务处理系统–>阅卷站
      4. 成绩清单:阅卷站–>考务处理系统
      5. 合格标准:考试中心–>考务处理系统(这里得好好理解,合格标准是审判合不合格的依据,也是数据流)
      6. 考生通知单:考务处理系统–>考试
      7. 统计分析表:考务处理中心–>考试中心(题中没有说清楚该数据流的宿,但是仔细分析,统计分析表应该是送回给考试中心,供他们进行下次考试的参考准备,所以宿应该的考试中心)
      8. 不合格报名单:考务处理系统–>考生(看到这里别觉得奇怪,题中确实没有这个数据流。但是仔细想想,我们的系统应该是有容错处理的,考试送上来一张错的报名单,系统应该退回告诉考生的。注意有提到要检查报名单的)
      9. 错误成绩清单:考务处理系统–>阅卷站(同上条,注意考务处理中心要检查阅卷站送来的成绩清单的)

    有了这些东西我们就能画出我们的顶层图啦, 图如下:
    在这里插入图片描述

    1. 画完顶层图(找动词, ),接下来我们就该分析我们的考务处理系统究竟做了那些工作了(加工–>子加工)。分析一下我们的考务处理系统为考生提供了啥处理?就登记学生提交的报名单,合格的报名单就等级上,给考生发准考证,不合格的就退回给考生;给考试中心提供了啥处理?就根据合格标准和成绩清单来统计考生成绩然后生成考生通知单和统计分析表和错误成绩清单。这里再考虑一个问题,我们登记和统计中间产物是啥?我们得形成一个正式得报名单(=考生名册)吧。上述分析中加粗字:动词是加工,名词是数据存储

    通过上述分析,我们把加工分为了两个子加工,画出0层图,图如下:
    在这里插入图片描述

    1. 同样的画出0层图之后,我们两个子加工工作量还是有点杂。我们尽力让我们的每个加工只完成一件事。(到这里了就看个人发挥了(记住加工找动词,数据存储找名词哈)。注意加工工作单一的同时,我们还要特别注意的是数据的流向,以及给每个加工标号)。下面的图就不一一赘述了
      在这里插入图片描述
      在这里插入图片描述
    展开全文
  • 怎么把图纸转换成t3格式

    千次阅读 2020-12-28 22:49:45
    cad转化t3格式1、 打开天正 cad3、 找到图纸保存的位置,点击点开5、 选择输出类型,输入 38、2020-05-2742人浏览在CAD看图中如何将图纸转T3格式浩辰 CAD 看图王官方页面:http://yun.gstarcad.com/在 CAD 看图...
  • 数据流程与er.doc

    2020-12-30 12:50:04
    简介:数据流图结构化分析方法中使用的工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型?数据流程中有以下几种主要元素:?例子:?实体-联系(ER...
  • (1)补充数据流图的 缺失部分,包括补充数据流、补充外部实体、补充数据存储以及处理过程(四部分) (2)数据流图的改错,包括修正数据流名称、数据流的起点与终点、删除多余数据流数据流图: 1、4部分组成...
  • 输入流和输出是javaIO的两类如果你曾经使用过Java IO 编程,很可能会遇到这样一状况,在一类中向OutputStream里面写数据,而另一类则从InputStream中读...
  • Python图片与其矩阵数据互相转换

    千次阅读 2021-01-13 19:30:54
    【python】bytearray和string之间转换,用在需要处理二进制文件和数据流上 最近在用python搞串口工具,串口的数据流基本读写都要靠bytearray,而我们从pyqt的串口得到的数据都是string格式,那么我们就必须考虑到如何...
  • Java输入输出

    2021-03-15 15:58:31
    该示例代码中的解析,只是将从对象中读取到的有效的数据,也就是data数组中的前n个数据转换为字符串,然后进行输出。 在该示例代码中,只是在catch语句中输出异常的信息,便于代码的调试,在实际的程序中,需要...
  • 数据规范化 ...但是,第一,范式级别越高,存储同样数据就需要分解张表,因此,“存储自身"的过程也就越复杂。第二,随着范式级别的提高,数据的存储结构与基于问题域的结构间的匹配程度也随之下降
  • java输入输出

    2021-03-13 07:19:03
    java输入输出java IO综述在整个Java.io包中最重要的就是5类和一接口。5类指的是File、OutputStream、InputStream、Writer、Reader;一接口指的是Serializable。Java I/O主要包括如下几层次,包含三...
  • Java输入输出详解

    2021-02-28 16:08:07
    通过数据流、序列化和文件系统提供系统输入和输出。Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要...
  • Java类图结构

    2021-02-26 12:18:40
    Java操作有关的类或接口:Java类图结构:...IO的分类根据处理数据类型的不同分为:字符和字节根据数据流向不同分为:输入流和输出字符和字节字符的由来: 因为数据编码的不同,而有了对字符进行高...
  • 引言——首先来聊聊现代企业数据架构及痛点: 数据孤岛:低效率和利用困难的根源 应用瓶颈:传统方案...当想到这问题的时候,发现航空公司的客户触点太了。   PSDP行程订单,投诉、行李系统,常旅客系统,手.
  • 点上方计算机视觉联盟获取更干货仅作学术分享,不代表本公众号立场,侵权联系删除转载于:量子位AI博士笔记系列推荐周志华《机器学习》手推笔记正式开源!可打印版本附pdf下载链接流程/思维导...
  • Java输入输出总结

    2021-02-26 12:51:29
    InputStream(字节输入流) OutputStream(字节输出) Reader(字符输入流) Writer(字符输出)都是抽象类,所以不可以直接new;它们是各大输入输出的父类。输入流:是要从数据源(键盘,文件,磁盘等)传到(这里我们...
  • 数据结构与算法之的进阶

    万次阅读 多人点赞 2021-12-01 16:29:24
    万字长文文教你学会什么是
  • 转 http://blog.csdn.net/zsw12013/article/details/6534619通过数据流、序列化和文件系统提供系统输入和输出。Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的,...
  • IO输入输出

    2021-01-07 23:16:02
    Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。&nbs.....
  • 其中,所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类;而所有输出都是抽象类OutputStream(字节输出)或者Writer(字符输出)的子类。【首先需要明白的是:是干什么的?...
  • Android Kotlin之Flow数据流

    千次阅读 2021-09-28 11:43:49
    E/TTT: collect:world 2021-09-27 19:51:54.453 7240-7240/ E/TTT: onCompletion flow{}为上游数据提供方,并通过emit()发送一个或多个数据,当发送多个数据时,数据流整体是有序的,即先发送先接收;另外发送的数据...
  • 1.1 字节InputStream类 InputStream类的子类定义了各种数据源产生的输入流,包括字节数据、字符串对象、文件、管道和一些其他组成的序列等,如下层次结构图: InputStream类有很的实现子类,下面列举了一些...
  • 架构之:数据流架构

    千次阅读 2021-06-18 09:35:40
    有时候我们的系统主要是对输入数据进行处理和转换,这些处理和转换是互相独立的,在这种情况下,输入数据经过转换之后被放到指定的输出中去。
  • 就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符类,以字符为单位读写数据,专门用于处理文本文件。 字符输入流Reader java.io.Reader抽象类是...
  • Java基础—输入输出

    2021-03-08 04:30:05
    节点:以特定源如磁盘文件、内存某区域或者线程之间的管道为端点的构造输入输出,是一种基本的。过滤:以其他已经存在的为端点构造输入输出。根据中的数据单位分为字节和字符。字节...
  • 2016年 亚马逊在ICML发表了一篇异常检测算法,Robust Random Cut Forest(RRCF),对周志华老师的孤立森林算法进行改进,适用于数据流的实时处理,实时训练与实时异常检测。该算法已被AWS落地服务化,集成为产品对外...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 277,168
精华内容 110,867
关键字:

多个输入的数据流图转换成结构图