代码的坏味道——长函数
前言:一个函数应该尽量做一件事情,如果非要做多个事情,要做函数提取,每次迭代应该考虑到是否有重复代码或者可以优化的代码。
长函数:长函数的产生:
- 逻辑是平铺直叙的
- 需求迭代没有考虑优化,一次加一点
一、避免逻辑是平铺直叙
不要把多个逻辑的事情写到一个函数中,每个函数只做一件事情。
badCase:
methods: {fetchDataAndRender() {// 数据请求axios.get('https://api.example.com/data').then(response => {// 数据处理this.data = response.data;// DOM操作document.getElementById('result').innerText = this.data;// 事件处理document.getElementById('button').addEventListener('click', () => {alert('Data loaded successfully!');});}).catch(error => {console.error('Error fetching data: ', error);});}
}
goodCase:
// Good Case
methods: {fetchData() {axios.get('https://api.example.com/data').then(response => {this.data = response.data;}).catch(error => {console.error('Error fetching data: ', error);});},renderData() {document.getElementById('result').innerText = this.data;},handleButtonClick() {document.getElementById('button').addEventListener('click', () => {alert('Data loaded successfully!');});}
}
二、函数最大行数
每个语言的设计不太一样,每个人对长函数的理解也不同,所以说没有一个规范的限制,可以给自己设定一个限制,前端应尽量保持一个函数不要超过30行。
badCase:
methods: { registerUser() { const { username, email, password } = this.form; if (!username || !email || !password) { alert('所有字段都是必填项!'); return; } if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)) { alert('无效的电子邮件地址!'); return; } if (password.length < 6) { alert('密码长度至少为6个字符!'); return; } // 假设有一个axios实例 this.axios.post('/api/register', { username, email, password }) .then(response => { if (response.data.success) { alert('注册成功!'); this.$router.push('/login'); } else { alert('注册失败:' + response.data.message); } }) .catch(error => { console.error('注册出错:', error); alert('注册时发生错误,请稍后再试!'); }); } }
goodCase:
methods: { registerUser() { if (!this.validateForm()) { return; } this.sendRegistrationRequest(); }, validateForm() { const { username, email, password } = this.form; if (!username || !email || !password) { alert('所有字段都是必填项!'); return false; } if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)) { alert('无效的电子邮件地址!'); return false; } if (password.length < 6) { alert('密码长度至少为6个字符!'); return false; } return true; }, sendRegistrationRequest() { this.axios.post('/api/register', this.form) .then(response => { if (response.data.success) { alert('注册成功!'); this.$router.push('/login'); } else { alert('注册失败:' + response.data.message); } }) .catch(error => { console.error('注册出错:', error); alert('注册时发生错误,请稍后再试!'); }); } }
三、避免重复的语句出现(if|else居多)
遇到简单的if的语句时应当换成三元表达式,遇到if|else逻辑相似时应该抽离
badCase:
data() { return { userRole: 'admin' }; }, computed: { welcomeMessage() { return this.getWelcomeMessage(); } }, methods: { getWelcomeMessage() { let message = ''; if (this.userRole === 'admin') { message = '欢迎管理员!'; } else if (this.userRole === 'editor') { message = '欢迎编辑者!'; } else if (this.userRole === 'viewer') { message = '欢迎查看者!'; } else { message = '欢迎访客!'; // 假设这里还有其他逻辑,导致函数过长 // ...(省略其他逻辑) } // 假设这里还有更多的条件判断和逻辑处理 // ...(省略) return message; } }
goodCase:
data() { return { userRole: 'admin', roleMessages: { admin: '欢迎管理员!', editor: '欢迎编辑者!', viewer: '欢迎查看者!', } }; }, computed: { welcomeMessage() { // 使用对象查找,如果不存在则返回默认消息 return this.roleMessages[this.userRole] || '欢迎访客!'; } }
}
四、需求迭代,是否考虑到了优化?
当遇到新的需求迭代,避免不了影响之前的函数内的逻辑处理。
- 前瞻性设计:开发一开始是否考虑到如果需求有了迭代?是否提前留好了后续的余地?
- 童子军军规:需求迭代后,是否比迭代前的代码更加干净整洁?
- 粒度越小越好:是否真的做到了每个函数是独立的只做了一件事情?
相关文章:
代码的坏味道——长函数
前言:一个函数应该尽量做一件事情,如果非要做多个事情,要做函数提取,每次迭代应该考虑到是否有重复代码或者可以优化的代码。 长函数:长函数的产生: 逻辑是平铺直叙的需求迭代没有考虑优化,一次…...
【机器学习】基于密度的聚类算法:DBSCAN详解
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 基于密度的聚类算法:DBSCAN详解引言DBSCAN的基本概念点的分类聚类过…...
Qt 网络编程 网络信息获取操作
学习目标:网络信息获取操作 前置环境 运行环境:qt creator 4.12 学习内容 一、Qt 网络编程基础 Qt 直接提供了网络编程模块,包括基于 TCP/IP 的客户端和服务器相关类,如 QTcpSocket/QTcpServer 和 QUdpSocket,以及实现 HTTP、FTP 等协议的高级类,如 QNetworkRe…...
linux中的进程以及进程管理
程序和进程的区别和联系 程序(Program): 程序是一组指令的集合,通常存储在磁盘或其他存储设备上,是一种静态的概念。程序本身并没有运行,它只是一个可执行的文件或脚本,包含了一系列的指令和数…...
pyecharts可视化案例大全(11~20)
pyecharts可视化案例大全(11~20) 十一、设置动画效果十二、直方图带视觉组件十三、设置渐变色(线性渐变)十四、设置渐变色(径向渐变)十五、设置分割线十六、设置分隔区域十七、面积图十八、堆叠面积图十九、自定义线样式二十、折线图平滑处理十一、设置动画效果 在图表加载前…...
Docker在人工智能领域的应用与实战
摘要 人工智能(AI)技术的快速发展带来了对高效开发和部署工具的需求。Docker作为一个创新的容器化平台,为AI领域提供了强大的支持。本文详细介绍了Docker在AI模型开发、训练、部署以及服务器集群管理等方面的应用,并探讨了其在数…...
python基础篇(8):异常处理
在Python编程中,异常是程序运行时发生的错误,它会中断程序的正常执行流程。异常处理机制使得程序能够捕获这些错误,并进行适当的处理,从而避免程序崩溃。 1 错误类型 代码的错误一般会有语法错误和异常错误两种,语法错…...
FortiClient 用IPsec VPN 远程拨号到FortiGate说明文档
说明:本文档针对IPsec VPN 中的Remote VPN 进行说明,即远程用户使用PC中的FortiClient软件,通过VPN拨号的方式连接到公司总部FortiGate设备,访问公司内部服务器。在配置之前需要统一VPN策略和参数,如模式… 说明&#…...
Git-Unity项目版本管理
目录 准备GitHub新建项目并添加ssh密钥Unity文件夹 本文记录如何用git对unity 项目进行版本管理,并可传至GitHub远端。 准备 名称版本windows11Unity2202.3.9.f1gitN.A.githubN.A. GitHub新建项目并添加ssh密钥 GitHub新建一个repositorywindows11 生成ssh-key&…...
每日一题~ leetcode 402 (贪心+单调栈)
click me! 这个贪心的推导在leetcode上已经很明确了。 click me! 删除k个数,可以先考虑删除一个数。这也是一种常见的思路。(如果进行同样的操作多次,可以先只 考虑一次操作如何实现,或者他的影响。完成这一次操作后,…...
设计模式之模版方法
模版方法介绍 模版方法(Template Method)模式是一种行为型设计模式,它定义了一个操作(模板方法)的基本组合与控制流程,将一些步骤(抽象方法)推迟到子类中,使得子类可以在…...
docker部署redis/mongodb/
一、redis 创建/root/redis/conf/redis.conf 全部执行命令如下 docker run -it -d --name redis -p 6379:6379 --net mynet --ip 172.18.0.9 -m 400m -v /root/redis/conf:/usr/local/etc/redis -e TXAsia/Shangehai redis redis-server /usr/local/etc/redis/redis.conf 部署…...
LeetCode 581. 最短无序连续子数组
更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。 组队打卡,更多解法等你一起来参与哦! LeetCode 581. 最短无序连续子数组,难度中等。 排序 解题思路:首先对数组排序,然后找出两侧顺序的数组&#x…...
数据库可视化管理工具dbeaver试用及问题处理。
本文记录了在内网离线安装数据库可视化管理工具dbeaver的过程和相关问题处理方法。 一、下载dbeaver https://dbeaver.io/download/ 笔者测试时Windows平台最新版本为:dbeaver-ce-24.1.1-x86_64-setup.exe 二、安装方法 一路“下一步”即可 三、问题处理 1、问…...
29、php实现和为S的两个数字(含源码)
题目:php 实现 和为S的两个数字 描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数, 是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测…...
Spring Boot中的全局异常处理
Spring Boot中的全局异常处理 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Spring Boot应用中实现全局异常处理,这是保证应用…...
中英双语介绍美国苹果公司(Apple Inc.)
中文版 苹果公司简介 苹果公司(Apple Inc.)是一家美国跨国科技公司,总部位于加利福尼亚州库比蒂诺。作为全球最有影响力的科技公司之一,苹果以其创新的产品和设计引领了多个科技领域的变革。以下是对苹果公司发展历史、主要产品…...
C语言牢大坠机
目录 开头程序程序的流程图《牢大坠机》结尾 开头 大家好,我叫这是我58,今天,我们要来看关于牢大坠机的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #define HIGH 66 #include <stdio.h> #include <Windows.h> int ma…...
zdppy+vue3+antd 实现表格单元格编辑功能
初步实现 <template><a-button class"editable-add-btn" style"margin-bottom: 8px" click"handleAdd">Add</a-button><a-table bordered :data-source"dataSource" :columns"columns"><templa…...
elasticsearch索引怎么设计
Primary Shard(主分片) Primary Shard(主分片)是索引数据存储的基本单位,承担着数据写入和查询的职责。以下是关于Primary Shard的一些关键点: 1. 数据分布:每个索引在创建时会被分成多个主分…...
电路分析不求人:手把手教你用戴维南定理搞定复杂电路(附Multisim仿真验证)
电路分析实战:用戴维南定理拆解复杂电路的全流程指南 当你面对一个布满电阻、电源和交叉连线的复杂电路图时,是否感到无从下手?戴维南定理就像一把瑞士军刀,能将这些看似棘手的电路简化为一个电压源和一个电阻的串联组合。但理论归…...
3分钟上手:免费跨平台资源下载神器,轻松获取全网视频资源
3分钟上手:免费跨平台资源下载神器,轻松获取全网视频资源 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …...
重构手游操控体验:Escrcpy如何颠覆手机游戏交互范式
重构手游操控体验:Escrcpy如何颠覆手机游戏交互范式 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 在移动游戏日益复杂的今天&…...
OpenClaw成本警报:gemma-3-12b-it的Token消耗监控与限额设置
OpenClaw成本警报:gemma-3-12b-it的Token消耗监控与限额设置 1. 为什么需要关注Token消耗? 上周我的OpenClaw自动化流程突然中断,检查日志发现是gemma-3-12b-it模型的API调用达到了限额。更让我后怕的是,如果这个限额不存在&…...
从零到一:深入解析蓝牙AVRCP协议在Android开发中的实战应用
1. 蓝牙AVRCP协议入门:从概念到应用场景 第一次接触AVRCP协议时,我也被各种专业术语搞得晕头转向。简单来说,AVRCP就像是蓝牙设备之间的"遥控器协议"。想象你坐在沙发上用电视遥控器换台——AVRCP就是让手机能远程控制蓝牙音箱的那…...
游戏开发实战:Unity中合并带材质的.obj模型文件全攻略
Unity游戏开发实战:高效合并带材质的.obj模型文件全流程解析 在游戏开发中,资源优化始终是提升性能的关键环节。当项目涉及大量.obj格式的3D模型时,合并这些文件不仅能减少Draw Call,还能显著简化资源管理流程。本文将深入探讨如何…...
EcomGPT-7B赋能跨境电商:多语言商品描述与AIGC内容创作
EcomGPT-7B赋能跨境电商:多语言商品描述与AIGC内容创作 1. 引言 做跨境电商的朋友,可能都遇到过这样的头疼事:好不容易把一款产品打磨好,准备上架到亚马逊或者独立站,结果卡在了商品描述和营销文案上。自己写的英文总…...
Python实战:用PyWavelets实现小波降噪(附软硬阈值函数对比代码)
Python实战:用PyWavelets实现小波降噪(附软硬阈值函数对比代码) 在信号处理领域,噪声就像不请自来的客人,总是干扰着我们想要获取的真实信息。想象一下医生试图从嘈杂的心电图中诊断病情,或是摄影师处理夜间…...
手把手教你用华为昇腾A2-910b显卡,一键部署中文Embedding和Rerank模型
华为昇腾A2-910b实战:中文Embedding与Rerank模型高效部署指南 当你在深夜的办公室里盯着昇腾显卡的报错日志时,可能正经历着每个AI工程师都熟悉的"部署地狱"。别担心,这份指南将带你绕过所有坑点,用最直接的方式在华为A…...
Pixel Language Portal效果展示:实时翻译+st.balloons()庆祝动画+HP状态变化的沉浸式交互录屏
Pixel Language Portal效果展示:实时翻译st.balloons()庆祝动画HP状态变化的沉浸式交互录屏 1. 像素冒险工坊的诞生 在传统翻译工具千篇一律的界面中,Pixel Language Portal(像素语言跨维传送门)带来了全新的视觉冲击。这款基于…...
