日常代码优化实现过程

实现方案一

判断逻辑支持跳过。

handleCheckStatus ({ status = true, paymentApplyStatus = true, writeOffStatus = true }) {// 单据状态if (status && this.selectedRows.filter(item => item.status !== 'AUDITED').length) {this.$antdMessage.warning('请选择 [已审核] 状态的数据进行操作')return}// 付款申请状态if (paymentApplyStatus && this.selectedRows.filter(item => !['WAIT_APPLY'].includes(item.paymentApplyStatus)).length) {this.$antdMessage.warning('请选择 [待申请] 付款申请状态的数据进行操作')return}// 核销状态if (writeOffStatus && this.selectedRows.filter(item => !['WAIT'].includes(item.writeOffStatus)).length) {this.$antdMessage.warning('请选择 [未核销] 核销状态的数据进行操作')return}return true
},

handleCheckStatus 接收三个属性的对象作为参数,属性默认值都为 true。函数内部使用了条件语句和数组的过滤操作,用于检查选中的行数据的状态,并根据不同的状态显示警告信息。函数的功能似乎是用于检查选中的行数据是否符合特定的状态条件。

实现方案二

const validationConfig = {status: {allowedValues: ['AUDITED'],message: '请选择 [已审核] 状态的数据进行操作',},paymentApplyStatus: {allowedValues: ['WAIT_APPLY', 'PART_APPLY'],message: '请选择 [待申请] 和 [部分申请] 付款申请状态的数据进行操作',},writeOffStatus: {allowedValues: ['WAIT', 'PART'],message: '请选择 [未核销] 和 [部分核销] 核销状态的数据进行操作',},
};
handleCheckStatus (data, config) {for (const key in config) {const { allowedValues, message } = config[key]if (data.filter(item => !allowedValues.includes(item[key])).length) {this.$antdMessage.warning(message)return}}return true
},

handleCheckStatus 函数接受两个参数:data 是一个待检查的数据数组,而 object 是一个配置对象,其中包含了要检查的属性以及对应的允许值和警告消息。使用 for…in 循环来遍历 object 对象的属性,并使用 filter 函数来检查 data 数组中的元素,看它们的 key 属性的值是否包含在 list 数组中。如果有任何一个元素的属性值不在允许的列表中,就会显示相应的警告消息,并且函数会提前返回,不再继续检查其他属性。如果所有属性的值都在允许的列表中,函数将返回 true。

上述代码的优缺点

  • 第一段代码的优点和缺点:

优点:

  1. 模块化和可维护性: 函数handleCheckStatus被设计成一个可复用的模块,可以轻松地被其他部分调用,提高了代码的可维护性和可复用性。
  2. 灵活性: 代码允许在函数调用时通过传入不同的参数来动态地控制状态检查的逻辑,增加了代码的灵活性。
  3. 可读性: 代码使用了清晰的命名和注释,提高了代码的可读性,使得其他开发者更容易理解代码的功能和意图。

缺点:

  1. 硬编码的状态值: 函数中的状态值(例如’已审核’、'待申请’等)被硬编码在函数内部,如果状态值需要修改,需要修改代码逻辑,可能会导致代码的维护成本增加。
  2. 不够灵活: 虽然函数允许动态控制状态检查的逻辑,但是逻辑仍然比较固定,不够灵活。如果需要添加更多的状态检查逻辑,可能需要修改函数内部的实现。
  • 第二段代码的优点和缺点:

优点:

  1. 配置化: 使用了一个配置对象payValidateStatus来存储状态值和相应的提示信息,使得状态检查逻辑可以通过修改配置对象来实现,提高了可配置性。
  2. 可扩展性: 如果需要添加更多的状态检查逻辑,只需要修改配置对象,不需要修改函数内部的实现,增加了代码的可扩展性。

缺点:

  1. 配置对象的维护: 配置对象需要额外的维护工作,特别是在配置项较多或者配置逻辑较为复杂的情况下,可能会增加代码的复杂度。
  2. 可读性: 配置对象的结构和函数的调用关系可能不够直观,可能会降低代码的可读性,特别是对于阅读代码的新人来说。

第一段代码优化

主要问题在于硬编码的状态值,这使得代码缺乏灵活性和可维护性。将状态值和对应的警告消息配置化,使得状态值和消息可以轻松修改,代码实现如下:

const statusConfig = {AUDITED: '已审核',
};const paymentApplyStatusConfig = {WAIT_APPLY: '待申请',
};const writeOffStatusConfig = {WAIT: '未核销',
};function handleCheckStatus(selectedRows, statusConfig, paymentApplyStatusConfig, writeOffStatusConfig) {const invalidStatusItems = selectedRows.filter(item => ![statusConfig.AUDITED].includes(item.status));const invalidPaymentApplyStatusItems = selectedRows.filter(item => ![paymentApplyStatusConfig.WAIT_APPLY, paymentApplyStatusConfig.PART_APPLY].includes(item.paymentApplyStatus));const invalidWriteOffStatusItems = selectedRows.filter(item => ![writeOffStatusConfig.WAIT, writeOffStatusConfig.PART].includes(item.writeOffStatus));if (invalidStatusItems.length) {showWarningMessage(`请选择 [${statusConfig.AUDITED}] 状态的数据进行操作`);return false;}if (invalidPaymentApplyStatusItems.length) {showWarningMessage(`请选择 [${paymentApplyStatusConfig.WAIT_APPLY}] 或 [${paymentApplyStatusConfig.PART_APPLY}] 付款申请状态的数据进行操作`);return false;}if (invalidWriteOffStatusItems.length) {showWarningMessage(`请选择 [${writeOffStatusConfig.WAIT}] 或 [${writeOffStatusConfig.PART}] 核销状态的数据进行操作`);return false;}return true;
}// 错误消息的显示
function showWarningMessage(message) {this.$antdMessage.warning(message);
}// 调用示例
const isValid = handleCheckStatus(this.selectedRows, statusConfig, paymentApplyStatusConfig, writeOffStatusConfig);
if (isValid) {// 执行相应操作
}

将状态值和对应的消息被提取到了单独的配置对象,函数 handleCheckStatus 接受这些配置对象作为参数,使得验证逻辑与具体的状态值解耦,提高了代码的灵活性和可维护性,并且错误消息的显示逻辑被抽象为了一个独立的函数showWarningMessage,这样可以方便地进行统一的消息显示管理,也增加了代码的可维护性。

再次优化
如果 statusConfig, paymentApplyStatusConfig, 和 writeOffStatusConfig 是枚举值,你可以考虑将它们转换成更易于使用的对象形式,以提高代码的可读性和可维护性。你可以使用一个辅助函数来将枚举数组转换成对象,其中字典编码(dictCode)作为键,字典值(dictValue)作为值。这样,你可以使用键来代表状态值,而无需硬编码实际的状态字符串。代码实现如下:

// 将枚举数组转换为对象形式的辅助函数
function convertEnumToMap(enumArray) {return enumArray.reduce((acc, item) => {acc[item.dictCode] = item.dictValue;return acc;}, {});
}// 枚举数组
const statusEnum = [{ dictCode: 'WAIT_AUDIT', dictValue: '待审核' },{ dictCode: 'AUDITED', dictValue: '已审核' },{ dictCode: 'REJECT', dictValue: '审核拒绝' },{ dictCode: 'CANCEL', dictValue: '已取消' }
];const paymentApplyStatusEnum = [// Define your paymentApplyStatusEnum values here
];const writeOffStatusEnum = [// Define your writeOffStatusEnum values here
];// 将枚举数组转换为对象形式
const statusConfig = convertEnumToMap(statusEnum);
const paymentApplyStatusConfig = convertEnumToMap(paymentApplyStatusEnum);
const writeOffStatusConfig = convertEnumToMap(writeOffStatusEnum);function handleCheckStatus(selectedRows, statusConfig, paymentApplyStatusConfig, writeOffStatusConfig) {// 状态验证逻辑// ...
}// 调用示例
const isValid = handleCheckStatus(this.selectedRows, statusConfig, paymentApplyStatusConfig, writeOffStatusConfig);
if (isValid) {// 执行相应操作
}

convertEnumToMap 函数将枚举数组转换为对象形式,使得代码中的配置更加清晰,易于理解。通过使用枚举的键来代表状态值,代码的可读性和可维护性得到了提高。当你需要修改或者扩展枚举值时,只需要在相应的枚举数组中进行修改,而不需要修改验证逻辑,降低了代码的耦合性,使得系统更容易维护和扩展。

第二段代码优化

function validateData(data, config) {for (const key in config) {const { allowedValues, message } = config[key];if (data.some(item => !allowedValues.includes(item[key]))) {return message;}}return null;
}const errorMessage = validateData(this.selectedRows, validationConfig);
if (errorMessage) {this.$antdMessage.warning(errorMessage);
} else {// 数据通过验证,执行相应操作
}

validateData 接受数据和配置对象作为参数,使用some 函数代替filter,当数据中存在不符合条件的项时,立即返回相应的错误消息。如果所有属性的值都在允许的列表中,函数将返回 null,表示验证通过。

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

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

相关文章

项目十一文件的应用

认识文件 概述 文件对大家来说很熟悉,常见的有txt文本文档,办公用的word文档等,主要作用就是保存数据 在C语言中,文件时计算机领域的一个重要概念,通常指存储在外部介质上数据的集合。操作系统以文件为单位对数据进行管理,以文件名访问文件。 分类 按文件内容划分源…

华为认证 | 2023年全国华为HCIE认证通过率是多少?

华为HCIE认证是很受业界认可的,毕竟HCIE的主体是华为,目前华为在业界的认可度比较高,设备的覆盖率也很高,所以参加华为认证的人比较多。 尤其是华为认证中的专家级认证—HCIE。 很多人都想知道全国有多少人通过了华为HCIE认证&a…

C语言每日一题(17)老人的数目

力扣 2678 老人的数目 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息,信息用长度为 15 的字符串表示,表示方式如下: 前十个字符是乘客的手机号码。接下来的一个字符是乘客的性别。接下来两个字符是乘客的…

JMeter添加插件

一、前言 ​ 在我们的工作中,我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件? 二、插件管理器 ​ 首先我们需要下载插件管理器jar包 下载地址:Install :: JMeter-Plugins.org 然后我们将下载下来…

golang中的string与其他格式数据的转换方法

package mainimport ("fmt""strconv" )func main() {var str string "1721"b,_ : strconv.Atoi(str)fmt.Println(b)a,_ :strconv.ParseInt(str,10,32) fmt.Println(a)c,_:strconv.ParseBool(str)fmt.Println(c)//strconv.Parse 比较灵活&…

MYSQL(事务+锁+MVCC+SQL执行流程)理解

一)事务的特性: 一致性:主要是在数据层面来说,不能说执行扣减库存的操作的时候用户订单数据却没有生成 原子性:主要是在操作层面来说,要么操作完成,要么操作全部回滚; 隔离性:是自己的事务操作自己的数据,不会受到到其…

Centos 7 Zabbix配置安装

前言 Zabbix是一款开源的网络监控和管理软件,具有高度的可扩展性和灵活性。它可以监控各种网络设备、服务器、虚拟机以及应用程序等,收集并分析性能指标,并发送警报和报告。Zabbix具有以下特点: 1. 支持多种监控方式:可…

向量检索库Milvus架构及数据处理流程

文章目录 背景milvus想做的事milvus之前——向量检索的一些基础近似算法欧式距离余弦距离 常见向量索引1) FLAT2) Hash based3) Tree based4) 基于聚类的倒排5) NSW(Navigable Small World)图 向…

css3过渡

CSS3 过渡(CSS3 Transitions)是一种在元素从一种状态到另一种状态时,平滑地改变样式属性值的方法。它允许你在样式属性值变化时添加动画效果,而无需使用JavaScript或Flash。过渡是制作交互性和动画效果的有力工具,以下…

mysql—面试50题—1

注:面试50题将分为5个部分,每部分10题 一、查询数据 学生表 Student create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)); insert into Student values(01 , 赵雷 , 1990-01-01 , 男); insert into Student …

微信小程序之会议OA首页数据交互,会议状态,会议人数转换,会议室交互,WXS的使用

前言: 本篇博客使用结合了SpringMVC,mybatis,maven,小程序,如果不熟悉使用可以翻看我之前的博客,以便大家可以更好的学习!!! 一,会议OA首页数据的后台交互 这…

【jenkins】

1、库文件导出 pip freeze > requirements.txt

【SwiftUI模块】0060、SwiftUI基于Firebase搭建一个类似InstagramApp 2/7部分-搭建TabBar

SwiftUI模块系列 - 已更新60篇 SwiftUI项目 - 已更新5个项目 往期Demo源码下载 技术:SwiftUI、SwiftUI4.0、Instagram、Firebase 运行环境: SwiftUI4.0 Xcode14 MacOS12.6 iPhone Simulator iPhone 14 Pro Max SwiftUI基于Firebase搭建一个类似InstagramApp 2/7部分-搭建Tab…

机器学习笔记 - 特斯拉的占用网络简述

一、简述 ​ 2022 年,特斯拉宣布即将在其车辆中发布全新算法。该算法被称为occupancy networks,它应该是对Tesla 的HydraNet 的改进。 自动驾驶汽车行业在技术上分为两类:基于视觉的系统和基于激光雷达的系统。后者使用激光传感器来确定物体的存在和距离,而视觉系统…

算法通关村第十一关青铜挑战——移位运算详解

大家好,我是怒码少年小码。 计算机到底是怎么处理数字的? 数字在计算机中的表示 机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数。 机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0&am…

2310x86版本skia的第一个示例

我也懒得去编译了(我也编译不来),要下载的东西太多,而skia-build项目中没有x86版本. 所以从这里下载了别人的,编译方法. 下载后,要改两个地方: 1,SkRect文件中使用了max/min,删除相应的std:: 2,SkTFitsIn.h文件中的std::numeric_limits<typename sk_strip_enum<D>::ty…

【Java集合类面试八】、 介绍一下HashMap底层的实现原理

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; 介绍一下HashMap底层的…

Linux防火墙Centos6的常用命令iptables

文章目录 一、iptables基础知识二、作者玩玩的配置文件三、iptables中常用的参数以及作用-j参数的动作类型 四、安装iptables五、iptables启动命令六、iptables命令结构命令例子默认执行方式执行iptables命令和写入配置文件两种方式的对比 相对常用的命令参考文档 一、iptables…

leetcode做题笔记200. 岛屿数量

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边…

数据安全与PostgreSQL:最佳保护策略

在当今数字化时代&#xff0c;数据安全成为了企业不可或缺的一环。特别是对于使用数据库管理系统&#xff08;DBMS&#xff09;的组织来说&#xff0c;确保数据的完整性、保密性和可用性至关重要。在众多DBMS中&#xff0c;PostgreSQL作为一个强大而灵活的开源数据库系统&#…