编码规范经验谈

     

接手Chat 3.0的项目接近两个Q,在阅读了这些代码的基础上开了一些新功能。对我们项目组的核心工程的代码有些批判的想法,现在拿来跟大家分享一下。它山之石可以攻玉,相信对大家有一定的借鉴意义。
计算机巨匠 Donald Kunth(《计算机程序设计的艺术》系列作者)有一句名言: 程序是写给人看的,只是偶尔让机器执行一下。言辞颇为偏激,但是至少强调了一点,代码的可读性是十分重要的。一个大型的项目,一般会有10-20次的产品迭代,就我们IM这个可以做到死的项目而言,恐怕远远不止这么点次数。迭代也就意味着,要阅读其他同事的代码(包括离职同事)。我们在现有的系统上开发一个新的功能时,通常会花40%—60%的精力去阅读相关的代码。经常听到同事抱怨,“这代码怎么写的这样?",”被以前的代码坑了“。现有代码的质量,严重的影响了开发新功能的时间成本和质量。
下面是我总结的我们项目组编码实践上的一些常见的问题。
 
1.变量名不规范,不知所云。变量命名的首要规则就是” 见名识义“,最好的注释就是代码本身。命名恰当,还需要注释吗?
TCP协议里有这么个协议:send_web_msg_autoreply ,初看是发给web端的自动回复,实际上是给所有的客户端的自动回复。SDK里有这个一个缓存的key名:EVALUATE_KEY,初看是跟评价相关的key,其实保存的是会话的sid。这样的命名是极具误导性,令人费解,更容易导致bug。
 
2.字面值问题。字面值,也称之为”魔数“(magic number)。记得上《数据结构》课程时,老师检查了我们的代码后,跟我们说,所有字面值统统拿出来放到代码的最前面定义成常量。当时不明白老师的意思,但随着经验的积累,终于明白了老师的意思。字面值定义成常量,至少有两个好处。(1),增加可读性,(2),避免”霰弹“式修改。第一个不必多说。假设一个字面值在代码里出现10次,有一天随着需求的变更,需要修改,那么也就要修改10个地方。你能保证这10个地方都改到吗?如果没有改完,那么bug也就产生了。
分流逻辑里有这么三行代码:
map.put("shunt_result",Boolean.TRUE.toString());
map.put("shunt_type",Integer.toString(destParam));
map.put("shunt_param", venderId.toString());

 

shunt_result等三个字面值光在shunt函数里,就出现了5次之多,所在类里竟然有7次!一旦需要改字面值,改的完吗?
 
3.过度膨胀的类。设计模式六大原则里有个 单一职责原则,强调一个类只负责一件事,属于猫的类就不要去添加属于耗子的功能代码。但是前台的类,ChatCore**ServiceImpl 已经超过了4K行,ChatCoreSellerServiceImpl 超过了5K行,超过1000行的类不胜枚举。这些类的职责早已不在单一。当一个类完全靠搜索去查代码的功能时,我们已经无法去掌控它了。
 
4.重复的代码。《重构》一书提到过代码的bad smell(坏味道),其中之一就是duplicated code。重复的代码意味着,如果需求变化,那么需要多处修改。而更坏的消息便是,在一个有5千行代码的类里多处修改。
sdk里有这样一段过滤功能的代码:
// 内容过滤(敏感词、协议保留字符、不安全的字符)
String afterFilt = null;
RichText text = protocolService.parseRichText(msg.getMsgtext());
afterFilt = filterService.filtXss(text.getD());
afterFilt = filterService.filtSensitiveWord(afterFilt, SensitiveWord.WAITER);
msg.setRichText(text);

 

出现了多次。如果把这段代码抽成一个公共调用的方法,不仅可以避免多处修改,同时,我们的类会更加的简短。
 
5.过长的形参列表。方法的形参列表过长,不仅难以阅读,调用起来也觉得麻烦。更恰当的practice是,把这些形参放到一个class中去,然后把这个类作为形参。如果需要再增加一个参数,就不用改形参列表,直接改类即可。
前台有很多代码都有七八个参数。不列举了。
 
6.过长的的方法。同类一样,方法也要职责单一,不宜过长。相信大家都有这样的认识:方法越长,越难以理解。看过我们组架构师的代码就会发现一个显著的特点,方法短小精悍(譬如cell工程)。一个短小的方法,搭配一个好的方法名,带来的可读性和共享性是十分强大的。
一个askFromMobile方法,是100行。
 
7.日志被吃掉。这个虽然无关代码风格,但是对线上排查问题极为重要。多次排查线上问题时,发现日志没有输出完整,甚至根本没有输出。看下面一个例子,碰到这样的代码,查问题时真要吐血。
public OrderListResultInfo getOrderList(OrderQueryInfo orderQueryInfo) {
	OrderListResultInfo resultInfo = null;
	try {
		resultInfo = orderCenterExportSaf.getOrderList(orderQueryInfo);
	} catch (Exception e) {
		
	} 
	return resultInfo;
}

 

 
这7个问题是我目前总结的比较常见的问题。
 
在一个大型项目里开发功能添加代码,没有一行代码可以作为一个人的“私有代码”、“私有财产”,你的代码即使不被别人用到,也会被别人阅读。代码的可读性在大型工程里的重要意义不言而喻,没有一个人可以再大型项目里为所欲为的写代码。“私有代码”是对其他协同的同事的不尊重!
有一个心理学理论叫破窗理论(详见《程序员的修炼》),一个房子如果窗户破了,没有人去修补,隔不久,其它的窗户也会莫名其妙地被人打破 。同样,如果一个大型工程,你写了一段烂代码,那么不久,就会有更多的烂代码出现。因为大家都学会了破罐子破摔。
最后,以《代码大全》一书的某个章节的标题作为本文的结尾: Write programs for persons first, for computers second.
PS,阿里巴巴推出了Java开发编码规范,十分实用,传送门  https://github.com/alibaba/p3c
 
 
<think>好的,我现在需要回答用户关于RPA编码标准及最佳实践的问题。首先,我需要明确用户的需求:他们想了解在RPA开发中应遵循的编码标准和最佳实践,可能涉及到代码结构、可维护性、错误处理等方面。 接下来,我应该回顾已有的引用资料,看看有没有相关内容。引用[1]提到开发规范与编码标准的重要性,以及设计模式与最佳实践,这可能与用户的问题相关。引用[2]提到影刀RPA作为工具的选择,但用户的问题是关于编码标准,所以可能需要结合工具的特性来谈实践。引用[3]、[4]、[5]涉及自编码器、位置编码、数据集划分,可能与RPA编码标准关系不大,但需要注意是否有其他相关内容。 首先,我需要整理RPA编码标准的一般性原则,比如模块化设计、命名规范、注释要求、错误处理机制等。然后结合引用[1]中的设计模式与最佳实践,可能包括代码的可维护性和可扩展性。引用[2]提到影刀RPA的功能和界面,可能需要提到如何利用该工具的特性来遵循标准,比如使用其内置的日志功能或模块化组件。 另外,错误处理和日志记录在RPA中非常重要,因为自动化流程容易受到外部系统变化的影响。需要确保代码具备足够的容错能力和详细的日志,方便排查问题。这部分可以结合引用[5]中关于数据集划分的思路,强调不同阶段(开发、测试、生产)中的验证策略,可能类比到RPA流程的测试和部署阶段。 还要考虑版本控制,虽然引用中没有直接提到,但这是编码标准的一部分,需要提及。此外,代码的可读性和文档编写也是关键,确保团队协作顺畅。 现在需要组织这些点,结构清晰。可能分为几个部分:代码结构规范、错误处理与日志、版本控制与文档、工具特性利用、测试与验证等。每个部分下给出具体建议,并尽量结合引用中的内容。 例如,在代码结构规范中,可以引用[1]的设计模式,强调模块化;在错误处理中,可以提到引用[5]的验证策略,确保流程稳定性;在工具使用方面,引用[2]的影刀RPA功能,说明如何利用其特性。 最后,生成相关问题,可能需要包括如何选择RPA工具、如何处理异常、如何测试RPA流程等,确保问题与回答内容相关。 需要检查是否符合用户指令中的格式要求:行内公式用$...$,独立公式用$$...$$,但RPA相关内容可能较少涉及数学公式,但如果有变量或技术术语可能需要用。例如,提到效率时可以用$O(n)$之类的表示法,但要看是否有必要。不过根据用户的问题,可能数学公式较少,但需注意其他格式要求,如代码块、引用标注等。 总结回答结构: 1. 代码结构规范(模块化、命名、注释) 2. 错误处理与日志记录 3. 版本控制与文档 4. 利用工具特性(影刀RPA) 5. 测试与验证策略 每个部分结合引用内容,并自然添加引用标记。 最后,生成相关问题,例如关于工具选择、异常处理、测试方法等。</think>### RPA 编码标准及最佳实践 在RPA(机器人流程自动化)开发中,遵循编码标准和最佳实践可显著提升流程的稳定性、可维护性和扩展性。以下结合理论框架与实战经验,分步骤说明核心要点: --- #### 1. **代码结构规范** - **模块化设计** 将流程拆分为独立的功能模块(如登录系统、数据提取、异常处理),每个模块专注于单一职责,便于复用和调试[^1]。 ```python # 示例:登录模块封装为函数 def login_system(username, password): try: # 执行登录操作 return True except Exception as e: log_error(f"登录失败: {str(e)}") return False ``` - **命名规范** 变量、函数名需清晰表达意图,如`validate_invoice_format()`优于`check_data()`,遵循驼峰命名法或下划线分隔。 - **注释与文档** 关键逻辑需添加注释,说明输入、输出及业务规则,并维护更新文档以反映代码变更。 --- #### 2. **错误处理与日志记录** - **异常捕获机制** 对所有可能失败的操作(如API调用、文件读写)添加`try-except`块,并分类处理异常(网络错误、数据格式错误等)。 ```python try: extract_data_from_pdf(file_path) except FileNotFoundError: retry_download(file_url) except DataFormatError as e: notify_admin(f"数据格式异常: {e}") ``` - **日志分级** 记录`INFO`(流程步骤)、`WARNING`(可恢复错误)、`ERROR`(严重故障),便于事后分析[^5]。影刀RPA等工具通常内置日志功能,可直接调用[^2]。 --- #### 3. **版本控制与协作** - **Git集成** 使用Git管理代码版本,分支策略(如`dev`、`test`、`main`)确保多人协作时的代码一致性。定期提交并附注明确信息,如“修复发票解析逻辑”。 --- #### 4. **工具特性优化** - **利用影刀RPA组件** 影刀RPA提供可视化组件(如循环遍历表格、OCR识别),减少硬编码依赖。通过其内置的“重试机制”模块,可自动处理临时性故障[^2]。 --- #### 5. **测试与验证策略** - **多环境验证** 流程需在开发、测试、生产环境中分别验证。测试集应覆盖典型场景和边缘案例(如空文件、超时响应)。 - **性能监控** 记录关键指标(如单任务耗时$T=\frac{1}{n}\sum_{i=1}^{n} t_i$),优化高耗时模块。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bruce128

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值