文章目录1. 把代码分割成更小的单元块2. 避免函数参数过多3. 勿用函数参数来控制逻辑(ing)4. 函数设计要职责单一5. 移除过深的嵌套层次6. 学会使用解释性变量1. 把代码分割成更小的单元块大部分人阅读代码的习惯都是先看整体再看细节。所以我们要有模块化和抽象思维善于将大块的复杂逻辑提炼成类或者函数屏蔽掉细节。这里我举一个例子来进一步解释一下。代码具体如下所示。// 重构前的代码:getpublicvoidinvest(longuserId,longfinancialProductId){CalendarcalendarCalendar.getInstance();calendar.setTime(date);calendar.set(Calendar.DATE,(calendar.get(Calendar.DATE)1));if(calendar.get(Calendar.DAY_OF_MONTH)1){return;}//...}// 重构后的代码提炼函数之后逻辑更加清晰publicvoidinvest(longuserId,longfinancialProductId){if(isLastDayOfMonth(newDate())){return;}//...}publicbooleanisLastDayOfMonth(Datedate){CalendarcalendarCalendar.getInstance();calendar.setTime(date);calendar.set(Calendar.DATE,(calendar.get(Calendar.DATE)1));if(calendar.get(Calendar.DAY_OF_MONTH)1){returntrue;}returnfalse;}2. 避免函数参数过多函数包含 3、4 个参数的时候还是能接受的大于等于 5 个的时候我们就觉得参数有点过多了会影响到代码的可读性使用起来也不方便。针对参数过多的情况一般有 2 种处理方法。考虑函数是否职责单一(get)是否能通过拆分成多个函数的方式来减少参数。示例代码如下所示publicUsergetUser(Stringusername,Stringtelephone,Stringemail);// 拆分成多个函数publicUsergetUserByUsername(Stringusername);publicUsergetUserByTelephone(Stringtelephone);publicUsergetUserByEmail(Stringemail);将函数的参数封装成对象。示例代码如下所示publicvoidpostBlog(Stringtitle,Stringsummary,Stringkeywords,Stringcontent,Stringcategory,longauthorId);// 将参数封装成对象publicclassBlog{privateStringtitle;privateStringsummary;privateStringkeywords;privateStrintcontent;privateStringcategory;privatelongauthorId;}publicvoidpostBlog(Blogblog);除此之外如果函数是对外暴露的远程接口将参数封装成对象还可以提高接口的兼容性。在往接口中添加新的参数的时候老的远程接口调用者有可能就不需要修改代码来兼容新的接口了。3. 勿用函数参数来控制逻辑(ing)不要在函数中使用布尔类型的标识参数来控制内部逻辑true 的时候走这块逻辑false 的时候走另一块逻辑。这明显违背了单一职责原则和接口隔离原则。建议将其拆成两个函数可读性上也要更好。publicvoidbuyCourse(longuserId,longcourseId,booleanisVip);// 将其拆分成两个函数publicvoidbuyCourse(longuserId,longcourseId);publicvoidbuyCourseForVip(longuserId,longcourseId);不过如果函数是 private 私有函数影响范围有限或者拆分之后的两个函数经常同时被调用我们可以酌情考虑保留标识参数。示例代码如下所示// 拆分成两个函数的调用方式booleanisVipfalse;//...省略其他逻辑...if(isVip){buyCourseForVip(userId,courseId);}else{buyCourse(userId,courseId);}// 保留标识参数的调用方式更加简洁booleanisVipfalse;//...省略其他逻辑...buyCourse(userId,courseId,isVip);除了布尔类型作为标识参数来控制逻辑的情况外还有一种“根据参数是否为 null”来控制逻辑的情况。针对这种情况我们也应该将其拆分成多个函数。拆分之后的函数职责更明确不容易用错。具体代码示例如下所示publicListTransactionselectTransactions(LonguserId,DatestartDate,DateendDate){if(startDate!nullendDate!null){// 查询两个时间区间的transactions}if(startDate!nullendDatenull){// 查询startDate之后的所有transactions}if(startDatenullendDate!null){// 查询endDate之前的所有transactions}if(startDatenullendDatenull){// 查询所有的transactions}}// 拆分成多个public函数更加清晰、易用publicListTransactionselectTransactionsBetween(LonguserId,DatestartDate,DateendDate){returnselectTransactions(userId,startDate,endDate);}publicListTransactionselectTransactionsStartWith(LonguserId,DatestartDate){returnselectTransactions(userId,startDate,null);}publicListTransactionselectTransactionsEndWith(LonguserId,DateendDate){returnselectTransactions(userId,null,endDate);}publicListTransactionselectAllTransactions(LonguserId){returnselectTransactions(userId,null,null);}privateListTransactionselectTransactions(LonguserId,DatestartDate,DateendDate){// ...}4. 函数设计要职责单一实际上对于函数的设计来说更要满足单一职责原则。相对于类和模块函数的粒度比较小代码行数少所以在应用单一职责原则的时候没有像应用到类或者模块那样模棱两可能多单一就多单一。publicbooleancheckUserIfExisting(Stringtelephone,Stringusername,Stringemail){if(!StringUtils.isBlank(telephone)){UseruseruserRepo.selectUserByTelephone(telephone);returnuser!null;}if(!StringUtils.isBlank(username)){UseruseruserRepo.selectUserByUsername(username);returnuser!null;}if(!StringUtils.isBlank(email)){UseruseruserRepo.selectUserByEmail(email);returnuser!null;}returnfalse;}// 拆分成三个函数publicbooleancheckUserIfExistingByTelephone(Stringtelephone);publicbooleancheckUserIfExistingByUsername(Stringusername);publicbooleancheckUserIfExistingByEmail(Stringemail);思考点但总体来说不要将代码逻辑拆分封装的太细这个度仁者见仁智者见智。5. 移除过深的嵌套层次代码嵌套层次过深往往是因为 if-else、switch-case、for 循环过度嵌套导致的。我个人建议嵌套最好不超过两层超过两层之后就要思考一下是否可以减少嵌套。过深的嵌套本身理解起来就比较费劲除此之外嵌套过深很容易因为代码多次缩进导致嵌套内部的语句超过一行的长度而折成两行影响代码的整洁。解决嵌套过深的方法也比较成熟有下面 4 种常见的思路。去掉多余的 if 或 else 语句。代码示例如下所示// 示例一:getpublicdoublecaculateTotalAmount(ListOrderorders){if(ordersnull||orders.isEmpty()){return0.0;}else{// 此处的else可以去掉doubleamount0.0;for(Orderorder:orders){if(order!null){amount(order.getCount()*order.getPrice());}}returnamount;}}// 示例二:getpublicListStringmatchStrings(ListStringstrList,Stringsubstr){ListStringmatchedStringsnewArrayList();if(strList!nullsubstr!null){for(Stringstr:strList){if(str!null){// 跟下面的if语句可以合并在一起if(str.contains(substr)){matchedStrings.add(str);}}}}returnmatchedStrings;}使用编程语言提供的 continue、break、return 关键字提前退出嵌套。代码示例如下所示// 重构前的代码publicListStringmatchStrings(ListStringstrList,Stringsubstr){ListStringmatchedStringsnewArrayList();if(strList!nullsubstr!null){for(Stringstr:strList){if(str!nullstr.contains(substr)){matchedStrings.add(str);// 此处还有10行代码...}}}returnmatchedStrings;}// 重构后的代码使用continue提前退出publicListStringmatchStrings(ListStringstrList,Stringsubstr){ListStringmatchedStringsnewArrayList();if(strList!nullsubstr!null){for(Stringstr:strList){if(strnull||!str.contains(substr)){continue;}matchedStrings.add(str);// 此处还有10行代码...}}returnmatchedStrings;}调整执行顺序来减少嵌套。具体的代码示例如下所示// 重构前的代码publicListStringmatchStrings(ListStringstrList,Stringsubstr){ListStringmatchedStringsnewArrayList();if(strList!nullsubstr!null){for(Stringstr:strList){if(str!null){if(str.contains(substr)){matchedStrings.add(str);}}}}returnmatchedStrings;}// 重构后的代码先执行判空逻辑再执行正常逻辑publicListStringmatchStrings(ListStringstrList,Stringsubstr){if(strListnull||substrnull){//先判空returnCollections.emptyList();}ListStringmatchedStringsnewArrayList();for(Stringstr:strList){if(str!null){if(str.contains(substr)){matchedStrings.add(str);}}}returnmatchedStrings;}将部分嵌套逻辑封装成函数调用以此来减少嵌套。具体的代码示例如下所示// 重构前的代码publicListStringappendSalts(ListStringpasswords){if(passwordsnull||passwords.isEmpty()){returnCollections.emptyList();}ListStringpasswordsWithSaltnewArrayList();for(Stringpassword:passwords){if(passwordnull){continue;}if(password.length()8){// ...}else{// ...}}returnpasswordsWithSalt;}// 重构后的代码将部分逻辑抽成函数publicListStringappendSalts(ListStringpasswords){if(passwordsnull||passwords.isEmpty()){returnCollections.emptyList();}ListStringpasswordsWithSaltnewArrayList();for(Stringpassword:passwords){if(passwordnull){continue;}passwordsWithSalt.add(appendSalt(password));}returnpasswordsWithSalt;}privateStringappendSalt(Stringpassword){StringpasswordWithSaltpassword;if(password.length()8){// ...}else{// ...}returnpasswordWithSalt;}除此之外常用的还有通过使用多态来替代 if-else、switch-case 条件判断的方法。6. 学会使用解释性变量常用的用解释性变量来提高代码的可读性的情况有下面 2 种。常量取代魔法数字。示例代码如下所示publicdoubleCalculateCircularArea(doubleradius){return(3.1415)*radius*radius;}// 常量替代魔法数字publicstaticfinalDoublePI3.1415;publicdoubleCalculateCircularArea(doubleradius){returnPI*radius*radius;}使用解释性变量来解释复杂表达式。示例代码如下所示if(date.after(SUMMER_START)date.before(SUMMER_END)){// ...}else{// ...}// 引入解释性变量后逻辑更加清晰booleanisSummerdate.after(SUMMER_START)date.before(SUMMER_END);if(isSummer){// ...}else{// ...}参考《设计模式之美》-- 王争
企业数字化 ERP 产品动态
相关推荐
【设计模式之美】策略模式方法论:解耦策略的定义、创建和使用 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:16:10
【python基础】基本数据类型 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:16:10
ComfyUI WanVideo模型仓库:一站式AI视频生成模型集合与部署指南 ComfyUI WanVideo模型仓库:一站式AI视频生成模型集合与部署指南
在AI视频生成技术快速发展的今天,WanVideo作为业界领先的视频生成框架,为创作者提供了强大的文本到视频(T2V)、图像到视频(I2V)… · 2026/11/3 1:15:10
netboot.xyz 网络启动故障排除指南:从通电到装机的完整排障路线 netboot.xyz 网络启动故障排除指南:从通电到装机的完整排障路线 【免费下载链接】netboot.xyz Your favorite operating systems in one place. A network-based bootable operating system installer based on iPXE. 项目地址: https://gitcode.com/gh_mirrors/n… · 2026/11/3 1:39:16
无需人工标注!AndroidGen-GLM-4-9B重构安卓智能交互新范式 无需人工标注!AndroidGen-GLM-4-9B重构安卓智能交互新范式
导语
你还在为AI助手无法跨应用完成复杂任务而烦恼?智谱AI最新开源的AndroidGen-GLM-4-9B模型,首次实现大语言模型在安卓系统全场景的自主任务执行,无需人工标注交互数… · 2026/11/3 1:39:16
SenseNova-Vision-7B-MoT核心功能解析:图像理解与多模态对话的终极指南 SenseNova-Vision-7B-MoT核心功能解析:图像理解与多模态对话的终极指南
SenseNova-Vision-7B-MoT是一款强大的多模态AI模型,融合了先进的视觉理解与自然语言处理能力,为用户提供精准的图像分析和流畅的对话交互体验。该模型基于70亿参数规模… · 2026/11/3 1:39:16
vLLM加速BU-30B-A3B-Preview:提升10倍推理速度的配置与优化技巧 vLLM加速BU-30B-A3B-Preview:提升10倍推理速度的配置与优化技巧
BU-30B-A3B-Preview是一款具备SoTA Browser Use能力的轻量级模型,可在单GPU上部署运行。它基于Qwen/Qwen3-VL-30B-A3B-Instruct构建,拥有300亿总参数(其中30亿为活… · 2026/11/3 1:38:16
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18