ABAP设计模式之---“童子军法则(The Boy Scout Rule)”

法则介绍

The Boy Scout Rule,中文一般翻译为“童子军法则”,是一个简单却非常有意义的软件开发原则,它最早由软件开发大师 Robert C. Martin (Uncle Bob) 在他的《Clean Code》一书中提出。

这条法则的核心思想非常简单: “确保你离开代码的时候比你发现它时更干净。”

在这里插入图片描述

这条规则借鉴了童子军的一种行为习惯:在露营时,童子军团员会遵循一种纪律: 收拾营地时必须比他们到达时更干净整洁,再离开。我们在编写和改动代码时,也可以应用类似的理念。

这并不要求你每次改动代码时都去对整个代码库进行改造或重构,而是尽力让你涉及的那部分代码变得更好,比如更易读、更清晰、更少问题、更优雅。

简单概括就是:通过日积月累的小改进,逐步提升代码质量。


举个例子

场景

假设你是一位开发人员,正在修复一个在上市产品中的bug。你定位问题时,发现这个bug所在的代码片段是一个结构非常混乱的函数,看起来充满了臃肿的逻辑、重复代码和混乱的命名,比如:

CLASS lcl_calculator DEFINITION.PUBLIC SECTION.METHODS calcIMPORTINGp TYPE fy TYPE it TYPE iRETURNINGVALUE(result) TYPE f.
ENDCLASS.CLASS lcl_calculator IMPLEMENTATION.METHOD calc.CASE t.WHEN 0.result = p + p * 0.03 * y.WHEN 1.result = p + p * 0.05 * y.WHEN OTHERS.result = 0.ENDCASE.ENDMETHOD.
ENDCLASS.

从代码上你能看出来,这个函数的目标是根据用户选择的投资类型 (t) 来计算利息。但阅读这段代码时,你可能感到困惑,因为变量命名模糊,且写法欠优雅。


应用

按照这个法则,你在修复 bug 的同时可以顺手将你看到的代码稍作优化改进!比如,你可以:

  1. 改进命名:把模糊的变量命名替换为易理解的名称,提高代码可读性。
  2. 去掉魔法数字:把01这些数字抽取为具有含义的枚举值或常量。
  3. 提取重复逻辑:简化代码分支。

经过一个简单的重构,不额外引入新的逻辑,你的代码可能会变成下面这样:

TYPES: BEGIN OF ENUM investment_type.
TYPES low_risk VALUE '#LOW_RISK',high_risk VALUE '#HIGH_RISK'.
TYPES END OF ENUM investment_type.CLASS lcl_interest_calculator DEFINITION.PUBLIC SECTION.METHODS calculate_interestIMPORTINGprincipal TYPE fyears TYPE iinvestment_type TYPE investment_typeRETURNINGVALUE(result) TYPE f.
ENDCLASS.CLASS lcl_interest_calculator IMPLEMENTATION.METHOD calculate_interest.DATA: interest_rate TYPE f.CASE investment_type.WHEN investment_type-low_risk.interest_rate = 0.03.WHEN investment_type-high_risk.interest_rate = 0.05.WHEN OTHERS.RAISE EXCEPTION TYPE cx_sy_illegal_argumentEXPORTINGtextid = 'Unknown investment type'.ENDCASE.result = principal + (principal * interest_rate * years).ENDMETHOD.
ENDCLASS.

优化后的好处:
  • 更好的可读性和维护性:变量名和常量的引入让代码一目了然,其他开发者将来再看这段代码时理解起来更轻松。
  • 捕获潜在问题:通过改进代码,你可能发现原代码中的隐含错误(例如未处理未知投资类型的情况)。
  • 逐步改善代码库质量:这种点滴的改进积累起来,整个系统的代码质量就会越来越好。

为什么它重要?

  1. 技术债务的治理 : 代码往往随着时间的推移越来越混乱,甚至积累大量“技术债务”。The Boy Scout Rule 就像是日常的清洁和整理,能让技术债务得到缓慢但持续的处理,避免问题堆积成“无法维护的大山”。

  2. 提升团队效率 : 每个人在修改代码时稍微做点力所能及的改进,整个团队的代码质量就会发生质变。未来在调试或扩展功能时,大家能够更高效地完成工作。

  3. 防止“破窗效应” : 如果代码长时间得不到维护,每次有新开发人员碰到一段糟糕的代码时都会想“反正没人改正,我也懒得管”,久而久之问题会更严重。The Boy Scout Rule 提倡每次改进一点点,从而避免这种情况。


总结

The Boy Scout Rule 是一种轻量级、长期有效的代码管理策略,它强调 “每日清理” 的意识。在日常开发中,我们不能总是追求完美,但至少可以在我们触碰的地方,尽可能地让它变得更好一点点。

Remember: “Leave the code better than you found it.” 👌

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

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

相关文章

BaikalDB 架构演进实录:打造融合向量化与 MPP 的 HTAP 查询引擎

导读 BaikalDB作为服务百度商业产品的分布式存储系统,支撑了整个广告库海量物料的存储和OLTP事务处理。随着数据不断增长,离线计算时效性和资源需求压力突显,基于同一份数据进行OLAP处理也更为经济便捷,BaikalDB如何在OLTP系统内…

【抖音小程序】通用交易系统-下单问题整理

在通用交易系统中,支付流程如下 1、服务端-预下单:生成参数与签名信息(此过程不需要与抖音平台对接) 参考 生成下单参数与签名_抖音开放平台 2、小程序用户端:根据返回的参数与签名,拉起抖音支付&#x…

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…

EurekaServer 工作原理

一、核心工作流程 二、核心组件解析 1. 自动配置引擎 入口:EnableEurekaServer 引入 EurekaServerMarkerConfiguration,创建标记Bean Marker触发条件:EurekaServerAutoConfiguration 检测到 Marker 存在时激活关键Bean初始化: …

Playwright 与 Selenium:自动化测试的两大主流工具对比

《Playwright 与 Selenium:自动化测试的两大主流工具对比》 *Playwright 和 Selenium 是自动化测试领域的两大主流工具,二者在架构设计、功能特性和适用场景上存在显著差异,以下是核心对比: 一、架构与设计理念 维度Playwright…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

R语言速释制剂QBD解决方案之二

影响含量均一性的显著因子&#xff08;%RSD&#xff09; 数据分析表明含量均一性的弯曲性不显著。如半正态图&#xff08;图12&#xff09;所示&#xff0c;影响含量均一性的显著因子为A&#xff08;原料药粒径&#xff09;和C&#xff08;MCC/Lactose&#xff09;。 mod2 <…

大模型原理、架构与落地

近年来&#xff0c;大模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;在人工智能领域迅猛发展&#xff0c;从GPT-3到GPT-4、Claude、Gemini、文心一言、GLM等模型相继发布&#xff0c;大模型已逐渐走出实验室&#xff0c;迈向产业落地。本文将从技术原理、…

WWDC 2025 macOS 26有哪些更新点

在2025年6月10日凌晨结束的WWDC 2025发布会中&#xff0c;苹果正式发布了全新的macOS 26&#xff0c;并给其命名为Tahoe。 以下为macOS相关的主要内容&#xff1a; 命名方式改变 苹果正式将各大系统的版本号改为对应年份&#xff0c;让命名方式更直观好记&#xff0c;macOS 2…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月10日第104弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。 (1)定…

.NET 8集成阿里云短信服务完全指南【短信接口】

文章目录 前言一、准备工作1.1 阿里云账号准备1.2 .NET 8项目创建 二、集成阿里云短信SDK2.1 安装NuGet包2.2 配置阿里云短信参数2.3 创建配置类 三、实现短信发送服务3.1 创建短信服务接口3.2 实现短信服务3.3 注册服务 四、创建控制器五、测试与优化5.1 单元测试5.2 性能优化…

解决HuggingFace不能git clone的问题

今天在从HuggingFace上clone项目的时候&#xff0c;一直出现超时问题&#xff0c;查了很多资料没有解决&#xff0c;后来向mentor请教了一下&#xff0c;可以通过镜像的方法解决这个问题&#xff0c;所以把方法放上来&#xff0c;希望对大家有帮助。 HuggingFace的服务器在国外…

Zookeeper 集群部署与故障转移

Zookeeper 介绍 Zookeeper 是一个开源的分布式协调服务&#xff0c;由Apache基金会维护&#xff0c;专为分布式应用提供高可用、强一致性的核心基础能力。它通过简单的树形命名空间&#xff08;称为ZNode树&#xff09;存储数据节点&#xff08;ZNode&#xff09;&#xff0c;…

简单聊下阿里云DNS劫持事件

阿里云域名被DNS劫持事件 事件总结 根据ICANN规则&#xff0c;域名注册商&#xff08;Verisign&#xff09;认定aliyuncs.com域名下的部分网站被用于非法活动&#xff08;如传播恶意软件&#xff09;&#xff1b;顶级域名DNS服务器将aliyuncs.com域名的DNS记录统一解析到shado…

服务器出现故障怎么办?快速排查与解决方法

服务器故障的常见原因分析 硬件故障&#xff1a;内存、硬盘、网络设备故障。 软件故障&#xff1a;操作系统、应用程序、数据库异常。 网络攻击&#xff08;如DDoS攻击&#xff09;造成资源耗尽。 快速排查故障的步骤 检查监控系统报警日志。 查看系统资源使用情况&#x…

Claude vs ChatGPT vs Gemini:功能对比、使用体验、适合人群

随着AI应用全面进入生产力场景&#xff0c;市面上的主流AI对话工具也进入“三国杀”时代&#xff1a; Claude&#xff08;Anthropic&#xff09;&#xff1a;新锐崛起&#xff0c;语言逻辑惊艳&#xff0c;Opus 模型被称为 GPT-4 杀手ChatGPT&#xff08;OpenAI&#xff09;&a…

Git 使用大全:从入门到精通

Git 是目前最流行的分布式版本控制系统&#xff0c;被广泛应用于软件开发中。本文将全面介绍 Git 的各种功能和使用方法&#xff0c;包含大量代码示例和实践建议。 文章目录 Git 基础概念版本控制系统Git 的特点Git 的三个区域Git 文件状态 Git 安装与配置安装 GitLinuxmacOSWi…

SpringBoot 框架第 1 次接口调用慢

文章目录 背景分析思路 1:DeepSeek 分析思路 2:日志分析思路 3:Arthas 分析下载 Arthas启动 Arthastrace 调用耗时分析Controller 调用耗时Service 调用分析ServiceImpl 耗时分析IService 耗时分析BaseMapper 耗时分析debug 执行链路MyBatisMapperProxy 解读解决思路 1:预热…

数据分析Agent构建

数据分析agent构建 代码资料来源于 Streamline-Analyst&#xff0c;旨在通过该仓库上的代码了解如何使用大语言模型构建数据分析工具&#xff1b; 个人仓库&#xff1a;Data-Analysis-Agent-Tutorial 不同的在于 Data-Analysis-Agent-Tutorial 是在 Streamline-Analyst 基础…

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…