关于数据流图绘制和使用上的一些个人经验

假设我们需要开发一个项目进度管理系统,在这个项目进度管理系统之中,我们需要开发一个功能:项目成员的列表。我们具有这样的业务需求:

  • 在项目进度管理系统中,我们需要知道参与项目的人员到底有哪些,并且项目的创建者还需要对这些项目的参与人员在项目中的权限进行管理。在这个列表中,项目的成员可以查看其他成员的信息,也可以修改自己在项目中的名称。

这份业务需求实际上是非常简单的,但是我们具体该如何将业务需求转化为数据流图呢?

绘制数据流图的注意事项

在实际的绘制过程中,我们很容易混淆数据流图(又叫“数据流程图”)和流程图。区分二者的一个办法是:数据经过一个处理之后,数据是否发生明显的变化?如果是流程图,那么其大部分操作可能都在进行条件判断和对输入数据的细微处理,出现这样的情况你就需要考虑将这些处理抽象成一个数据流图中的处理,而屏蔽其具体的处理流程。

举个例子,假设我们具有这样一个处理:“查找项目中的所有成员的信息”,其数据输入是“项目ID”,而其数据的输出是“成员列表”。按照数据流图的思路,该处理是不需要具体再进行细分了的。但如果你按照流程图的思路,你可能会继续进行分解:

  1. 首先,判断该项目是否存在,如果不存在,则直接返回空;如果存在则执行下面的步骤。

  2. 查找该项目中的所有成员的信息。

  3. 打包成成员列表返回给前端。

你不应该将这个太过详细的步骤在数据流图中分解并展开来。你只需要在数据流图中描述数据的输入是什么、输出是什么以及这个处理的名称是什么。但如果分解之后,数据流图还是每个处理都导致数据发生明显变化,那么这个分解就是有价值的,可以进行分解的。

对于哪些无法在数据流图中继续分解的处理,我们需要额外描述,这个描述就是“微规格说明”。

这里讨论这个问题的目的在于提醒读者不要混淆数据流图和流程图。否则你绘制数据流图将很痛苦。

数据流图指导软件设计和开发

针对于前面讨论的“项目成员列表”这个功能,我们可以绘制出这样一个数据流图:

如果我们开发的是一个前后端耦合在一起的软件,那么上面这个数据流图实际上是没有问题的,它的确可以指导项目的开发,并且描述的数据的流动。

但如果我们开发的软件是前后端分离的架构,那么上面的这个流程图就不怎么正确了。对于“处理流程1”,它既有从数据存储中获取数据,又写入数据到数据存储中,那么我想问:“处理流程1”是发生在前端还是后端?你没办法分清楚,此时你需要将对于读取数据存储和向数据存储写入的过程独立成一个数据处理,以准确描述这个前后端分离的架构:

在这之中,1.1、1.3、2.1这些直接和数据存储相连接的都是后端应该负责的处理流程,而1.2、2.1这些不直接从数据存储中获取数据的就应该是前端负责的处理流程。

  • 后端的处理流程中,数据的流入和流出关系到前后端数据交互的接口的定义;

  • 前端的处理流程中,数据的流入代表了用户进行了某个业务操作,才会触发数据的流入,比如用户点击展示成员列表按钮,那么“项目成员->1.1->1.2”这个处理流程才会真正地触发,在点击完成之后,如果用户不进行任何操作,那么1.3和2.1->2.2的数据流动就不会触发。至于流动过程中的数据,前端该如何获取呢?对于一些数据,我们可以让用户自行输入(这就要求前端写好页面来定义这个输入的流程),或者是由程序在运行的过程中悄咪咪地存储起来,等到用户触发某个数据处理时使用。

按照上面的规则来指导软件的开发,我们可以这样子做:

  • 根据数据流图定义好前后端的接口。

  • 后端实现接口。

  • 前端实现前端的数据处理和数据的流动方式,举个例子,假设用户需要查看项目的成员列表,你可能会在页面上设置一个按钮,这个按钮的点击意味着“项目成员->1.1->1.2”这个数据流动过程开始的标志。从"项目成员->1.1"需要项目ID,这个项目ID从哪里来?你既可以让用户直接输入过来,或者你之前的业务功能已经告诉程序当前的项目ID是什么,此时你就不需要询问用户项目的ID是什么。获取完项目ID之后,请求后端的“查找成员列表”接口,最后,拿到后端返回的数据(由于拿到返回数据的过程可能是异步的,此时你可以要求页面进入等待状态),通过前端技术将这些数据以某种可操作的方式展示出来。

那么定义好数据流图,实际上就一定程度上定义好了前端的业务操作流程,这是完成业务需求所必要的内核。在这个基础之上,前端要做的就是尽可能地优化展示的效果和交互的体验,而非是思考如何完成某个业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492975.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手眼标定工具操作文档

1.手眼标定原理介绍 术语介绍 手眼标定:为了获取相机与机器人坐标系之间得位姿转换关系,需要对相机和机器人坐标系进行标定,该标定过程成为手眼标定,用于存储这一组转换关系的文件称为手眼标定文件。 ETH:即Eye To …

AlipayHK支付宝HK接入-商户收款(PHP)

一打开支付宝国际版 二、点开商户服务 三、下载源码

基于Arduino的平衡车机械臂

两轮驱动机器人车与机械臂的DIY指南 视频: 基于Arduino的平衡车机械臂 资料下载链接 引言 在这篇文章中,我们将一起探索如何构建一个两轮驱动的机器人车,并配备有一个机器人臂,这个项目适合初学者,并且可以在动态环…

【练习Day20】字符串变形

链接:字符串变形_牛客题霸_牛客网 方法一:双逆转(推荐使用) 思路: 将单词位置的反转,那肯定前后都是逆序,不如我们先将整个字符串反转,这样是不是单词的位置也就随之反转了。但是单…

ip地址和网络号关系是什么

在浩瀚的网络世界中,每一个连接互联网的设备都需要一个独特的标识来确保数据的准确传输。这个标识就是IP地址。然而,在深入探索IP地址的同时,我们不得不提及一个与之紧密相关的概念——网络号。网络号与IP地址之间存在着怎样的联系与区别&…

android 登录界面编写

1、登录页面实现内容 1.实现使用两个EditText输入框输入用户名和密码。 2.使用CheckBox控件记住密码功能。 3.登录时候,验证用户名和密码是否为空。 4.当前CheckBox控件记住密码勾上时,使用SharedPreferences存储用户名和密码。 5.登录时候使用Prog…

run postinstall error, please remove node_modules before retry!

下载 node_modules 报错:run postinstall error, please remove node_modules before retry! 原因:node 版本出现错误,我的项目之前是在 12 下运行的。解决方法: 先卸载node_modules清除缓存将node版本切换到12重新下载即可

Docker 安装 禅道-21.2版本-外部数据库模式

Docker 安装系列 1、拉取最新版本(zentao 21.2) [rootTseng ~]# docker pull hub.zentao.net/app/zentao Using default tag: latest latest: Pulling from app/zentao 55ab1b300d4b: Pull complete 6b5749e5ef1d: Pull complete bdccb03403c1: Pul…

visual studio 2022 c++使用教程

介绍 c开发windows一般都是visual studio,linux一般是vscode,但vscode调试c不方便,所以很多情况都是2套代码,在windows上用vs开发方便,在转到linux。 安装 1、官网下载vs2022企业版–选择桌面开发–安装位置–安装–…

python学opencv|读取图像(十七)认识alpha通道

【1】引言 前序学习进程中,我们已经掌握了RGB和HSV图像的通道拆分和合并,获得了很多意想不到的效果,相关链接包括且不限于: python学opencv|读取图像(十二)BGR图像转HSV图像-CSDN博客 python学opencv|读…

设计模式--单例模式【创建型模式】

设计模式的分类 我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类: 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式(7 种)&#xff1…

neo4j 图表数据导入到 TuGraph

neo4j 图表数据导入到 TuGraph 代码文件说明后文 前言:近期在引入阿里的 TuGraph 图数据库,需要将 原 neo4j 数据导入到新的 tugraph 数据库中。预期走csv文件导入导出,但因为格式和数据库设计问题,操作起来比较麻烦(可能是个人没…

模具生产过程中的标签使用流程图

①NFC芯片嵌入周转筐,通过读卡器读取CK_Label_v3的数据,并将这些信息上传至服务器进行存储; ②服务器随后与客户的WMS(仓库管理系统)进行交互,记录和同步注塑机的原始数据; ③当周转筐内的模具…

Linux线程同步

1 线程同步概念 假设有有三个线程A,B,C,当前一个线程A对内存中的共享资源进行访问时,其它线程B,C都不可以对这块内存进行操作,直到线程A对这块内存访问完毕为止,B,C中的一个才能访问这块内存,剩…

Vue与React:前端框架的巅峰对决

文章目录 一、引言(一)前端框架发展现状简述 二、Vue 与 React 框架概述(一)Vue.js 简介(二)React.js 简介 三、开发效率对比(一)Vue 开发效率分析(二)React …

项目管理工具Maven(一)

Maven的概念 什么是Maven 翻译为“专家”,“内行”Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。什么是理想的项目构建? 高度自动化,跨平台,可重用的组件,标准…

【Prometheus 】【实战篇(五)】深入解析 Prometheus 监控指标类型:Counter、Gauge、Histogram 和 Summary

Prometheus 提供了四种核心的指标类型,分别是 Counter(计数器)、Gauge(仪表)、Histogram(直方图)和 Summary(摘要)。这些指标类型在客户端库中有具体的使用说明&#xff…

outlook smtp 发送邮件

前提条件 开通 app password 开通 smtp 服务 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMETextdef send_html_email_smtp(sender_email, sender_password, recipient_email, subject, html_content):# Create the messag…

如何利用Python爬虫获得Lazada商品评论列表

在电商领域,用户评论是了解商品口碑和市场反馈的重要渠道。对于Lazada这样的东南亚电商平台,获取商品评论列表对于市场分析、产品改进和销售策略的制定至关重要。本文将详细介绍如何使用Python编写爬虫程序,以获取Lazada商品的评论列表。 一、…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>找出所有子集的异或总和再求和

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; private int ret;//返回周结果private int path;//枚举一个元素就异或进去public int subsetXORSum(int[] nums) {dfs(nums, 0);return ret;} private void dfs(int[] nums, int pos){ret path;for(int i pos; i <…