哪些代码是 Code Review 中的大忌?—— 以 Python 为例

请添加图片描述

Code Review 首要达成的结果是更好的可读性

在此基础上才是进一步发现项目的 Bug、处理性能优化上的问题。

因为,编码是给人看的,不是给计算机(Coding for human, NOT computer)。

一. 滥用缩写命名 Overusing abbreviation

大部分业务,尤其是不是直接暴露在前端的业务,不需要考虑混淆的设计,别因为少打两个字,让你的同伴都搞混了!

# Bad. 自成体系的缩写
lst = [1, 2, 3, 4, 5]
sqrd_lst = [num**2 for num in lst]
fltd_sqrd_lst = list(filter(lambda x: x % 2 == 0, sqrd_lst))
# Good. 一眼看出变量名的含义
riginal_numbers = [1, 2, 3, 4, 5]
squared_numbers = [num**2 for num in original_numbers]
filtered_squares = list(filter(lambda x: x % 2 == 0, squared_numbers))

二. 语法糖可能是毒药 Syntax Sugar can be Poison

语法糖是常见的程序员炫技手段,但即使对写下这段代码的人,经过一段时间后,也未必能在第一时间读出这段代码的含义。

例如在 Python 中:

  1. 使用布尔操作符作为条件判断
    第一段炫技代码,不熟悉的同学可能第一反应是 result=True
# 炫技,可读性差
is_valid = True
result = is_valid and "Valid" or "Invalid"# 等价,可读性更好
result = "Valid" if is_valid else "Invalid"
  1. 使用列表推导式处理嵌套列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
  1. 过度追求“简洁”的 lambda 表达式
    lambda 表达式用在 sorted 中做为排序参数是比较常用的,但过度追求单行表达,是不可取的,除了可读性差,还违背了程序设计的单一职责原则

单行、可读性差版本:

students = [{"name": "Alice", "age": 25, "grade": 90},{"name": "Bob", "age": 22, "grade": 85},{"name": "Charlie", "age": 28, "grade": 88}
]sorted_students = sorted(students, key=lambda x: (lambda y: (lambda z: z["grade"] - y["age"])(y))(x))

分离职责,可读性好版本:

def calculate_score(student):return student["grade"] - student["age"]sorted_students = sorted(students, key=calculate_score)

当然,语法糖也有少部分是增加可读性的,可以作为代码规范使用:

big_number = 1_000_000_000
# equivalent to big_number = 10000000001 < x < 10
# equivalent to 1 < x and x < 10

三. 不可预测的代码 Unpredictable Code

好代码是可预测的,坏代码是给人惊吓的。

一种是由于开发人员基础不扎实无意识造成的:
例如:
使用可变变量作为参数

# WRONG:
def add_numbers(a, b, result=[]):result.append(a + b)return result# Example usage
print(add_numbers(1, 2))   # Output: [3]
print(add_numbers(3, 4))   # Output: [3, 7]
print(add_numbers(5, 6))   # Output: [3, 7, 11]# CORRECT:
def add_numbers(a, b, result=None):if result is None:result = []result.append(a + b)return result# Example usage
print(add_numbers(1, 2))   # Output: [3]
print(add_numbers(3, 4))   # Output: [7]
print(add_numbers(5, 6))   # Output: [11]

另一种,是开发设计的偷懒、或者未进行事先沟通自作主张。

最常见的是更改接口参数类型,返回不符合预期的结构数据。比如不允许为空的字段返回了空,API 版本没有变化的情况下,增加了必传的参数等等

再如,状态码与实际的情况不符合。

虽然开发人员处理了几种已知的错误,但是状态码一直是 200,对于调用方,如果使用 status.OK 则永远返回 True,处理不到这些异常情况。

from flask import Flask, jsonify
app = Flask(__name__)@app.route('/delete-file/<file_id>', methods=['DELETE'])
def delete_file(file_id):try:# Delete the file# ...return jsonify({"status": "success"})except FileNotFoundError:return jsonify({"status": "error", "message": "File not found"})except PermissionError:return jsonify({"status": "error", "message": "Permission error"})if __name__ == '__main__':app.run()

正确的写法,应该使用对应的状态码,确保其他框架可以信任这个结果:

# Following the Principle of Least Astonishment in error handling
from flask import Flask, jsonify
from werkzeug.exceptions import NotFound, Forbiddenapp = Flask(__name__)@app.route('/delete-file/<file_id>', methods=['DELETE'])
def delete_file(file_id):try:# Delete the file# ...return jsonify({"status": "success"})except FileNotFoundError:raise NotFound(description="File not found")except PermissionError:raise Forbidden(description="Permission error")if __name__ == '__main__':app.run()

Bonus: 有没有可以抄的解决方法?

  1. 参考大厂的代码风格规范

Google 开放了不少常见语言的代码规范:
https://google.github.io/styleguide/

请添加图片描述

小米也有数据库设计,SQL 相关的规范:
https://github.com/XiaoMi/soar

如果接手一个新的语言或工具,还可以在搜索资料时加一个 best pratice 看看其他人的经验。

  1. 借助插件或 CI 工具

对于常见的规范单行代码长度、空格等,可以使用 ESLint、Pylint,、 Black (for Python) 等,直接格式化代码,或者借助工具查错

  1. 多 Review 多沟通
    工作中的大部分代码不是你一个人蛮干,自己的思维局限性,可以通过他人的视角打破。

Ref:

  1. Syntactic Sugar in Python
  2. 7 simple habits of the top 1% of engineers

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

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

相关文章

【LV12 DAY17-18 中断处理】

GPX1_1是外部中断9 EINT9 查询可知其中断ID是57 所以需要进行人为修正lr的地址 sub lr&#xff0c;lr&#xff0c;#4 //iqr异常处理程序 irq_handler: //IRQ异常后LR保存的地址是被IRQ打断指令的下一条再下一条指令的地址&#xff0c;所以我们需要人为进行修正一下sub LR,L…

泛微OA-Ecology8表单中填充用友U8数据

文章目录 1、需求及效果1.1 需求1.2 效果 2、思路及实现步骤2.1 思路2.2 实现步骤 3.结语 1、需求及效果 1.1 需求 在OA中填写表单中时候&#xff0c;比如物料号还需要从U8中查找后才能填写&#xff0c;非常的麻烦。想要在填写表单的时候可以搜索&#xff0c;并且带出其他的关…

如何查看串口号和波特率?

serialport引入后&#xff0c;设备也接上了&#xff0c;一直不知道串口号和波特率去哪里找&#xff0c;当时这个问题困扰了我很久 将设备的线插入到电脑上的插口(串口)桌面的【此电脑】上右击选择管理&#xff0c;打开【设备管理器】在【端口】中找到对应的端口&#xff0c;如果…

【linux】软链接创建(linux的快捷方式创建)

软连接的概念 类似于windows系统中的快捷方式。有的文件目录很长或者每次使用都要找很不方便&#xff0c;于是可以用类似windows的快捷方式的软链接在home&#xff08;初始目录类似于桌面&#xff09;上创建一些软链接方便使用。 软链接的语法 ln -s 参数1 参数2 参数1&#…

智慧园区数字孪生智能可视运营平台解决方案:PPT全文82页,附下载

关键词&#xff1a;智慧园区解决方案&#xff0c;数字孪生解决方案&#xff0c;数字孪生应用场景及典型案例&#xff0c;数字孪生可视化平台&#xff0c;数字孪生技术&#xff0c;数字孪生概念&#xff0c;智慧园区一体化管理平台 一、基于数字孪生的智慧园区建设目标 1、实现…

SpringMVC零基础入门 - 概述、入门搭建、PostMan的使用(常见数据类型的传输)、REST风格编程

SpringMVC零基础入门 - 概述、入门搭建、PostMan的使用(常见数据类型的传输)、REST风格编程 SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用就是用来接收前…

解决“win11无法识别U盘“问题

在15.6寸笔记本上插上U盘&#xff0c;有时候出现U盘无法识别的现象&#xff0c;出现这种问题的原因有许多&#xff0c;比如U盘的格式不被当前电脑支持、电脑的USB接口电压过低、没有安装U盘驱动等等。     若是U盘格式不支持&#xff0c;则把U盘改成电脑能够识别的格式&#…

字符串处理(将字符串中符合十六进制数据格式的数字和字符按照其对应的十进制数值进行累加) C语言xdoj704

题目描述&#xff1a; 输入由数字和字符构成的字符串&#xff08;不包含空格&#xff09;&#xff0c;将字符串中符合十六进制数据格式的数字和字符按照其对应的十进制数值进行累加&#xff0c;并输出累加结果&#xff0c;如果字符串中不含有任何满足十六进制格式的字符&#x…

CES 2024丨引领变革,美格智能为智能终端带来生成式AI能力

作为电子行业的“风向标”&#xff0c;CES 2024&#xff08;国际消费电子展&#xff09;于1月9日至12日在美国拉斯维加斯举办。本届展会可谓是AI的盛宴&#xff0c;芯片、AI PC、智能家居、汽车科技、消费电子等领域与AI相关的前沿成果接连发布&#xff0c;引领人工智能领域的科…

6.2 声音编辑工具GoldWave5简介(8)

2&#xff0e;降噪 如果声卡的质量不太好&#xff0c;在录音的过程中免不了会掺杂一些杂音&#xff0c;比如&#xff1a;电流声、爆破声等&#xff0c;此时就需要进行降噪处理。 (1) 选择【效果】|【波波器】|【噪声减小】命令&#xff0c;打开“降噪”对话框。如图6-2-14所示…

Shell编程自动化之Shell数学运算与条件测试

一、Shell数学运算 1.Shell常见的算术运算符号 序号算术运算符号意义1、-、*、/、%加、减、乘、除、取余2**幂运算3、–自增或自减4&&、||、&#xff01;与、或、非5、!相等、不相等&#xff0c;也可写成6、、-、*、/、%赋值运算符&#xff0c;a1相等于aa1 2.Shell常…

C语言之字符串和指针

目录 用数组实现的字符串和用指针实现的字符串 █用数组实现的字符串str █用指针实现的字符串ptr 注意 用数组和指针实现字符串的不同点 字符串数组 用数组实现的字符串的数组——二维数组 用指针实现的字符串数组——指针数组 注意 字符串和指针有着紧密的联系&#…

TikTok系列算法定位还原x-ss-stub

TikTok的x系列的算法比较有名,很多粉丝也问过,之前没有深入研究,本人工作量也比较大。 我们上次说到TikTok的x-ss-stub的算法就是ccmd5标准库算的,今天要讲细致点,表面这个结论本不是直接将数据md5那么来的,是经过一系列分析来的 上图是上次截图的,这次我们分析整个定位…

node(express.js创建项目)+连接mysql数据库

1.node npm的安装 2.express的安装 全局安装:npm install express -gnpm install -g express-generator// ps: 4.0版本把generator分离出来了&#xff0c;需要单独安装3.创建express项目 express 项目名称 cd 项目名称 npm install npm start4.项目中安装数据库 npm install…

C语言督学营(高级阶段)

文章目录 高级阶段19.C语言语法进阶1.条件运算符、逗号运算符(1)条件运算符 / 三目运算符   ? :(2)逗号运算符   , 2.自增自减运算符3.位运算符&#xff1a;按位或、按位异或、按位取反(1)逻辑与、按位与、左移、右移(2)有符号数右移 vs 无符号数右移(3)按位与、按位或、按位…

Docker学习与应用(五)-DockerFile

1、DockerFile 1&#xff09;DockerFile介绍 dockerfile是用来构建docker镜像的文件&#xff01;命令参数脚本&#xff01; 构建步骤&#xff1a; 1. 编写一个dockerfile文件 2. docker build 构建称为一个镜像 3. docker run运行镜像 4. docker push发布镜像&#xff08;D…

LC 83. 删除排序链表中的重复元素

83. 删除排序链表中的重复元素 难度 &#xff1a; 简单 题目&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 提示&#xff1a; 链表中节点数目在范围 [0, 300] 内-100 < Node.va…

蓝桥杯准备

书籍获取&#xff1a;Z-Library – 世界上最大的电子图书馆。自由访问知识和文化。 (zlibrary-east.se) 书评&#xff1a;(豆瓣) (douban.com) 一、观千曲而后晓声 别人常说蓝桥杯拿奖很简单&#xff0c;但是拿奖是一回事&#xff0c;拿什么奖又是一回事。况且&#xff0c;如果…

Docker教程

docker 安装 官方文档 wget -qO- https://get.docker.com/ | sh sudo usermod -aG docker your-user sudo usermod -aG docker ${USER} newgrp docker # 更新docker用户组 cat /etc/group | grep docker docker --version 使用非root用户管理 帮助启动类 命令 system…

寄快递有没有什么省钱的小妙招? 怎样寄快递才能省钱呢?

快递物流行业的快速崛起刺激了人们的消费欲望&#xff0c;其中典型的是每每到重大节日尤其是双十一或者双十二&#xff0c;消费市场异常火爆&#xff0c;这也使得快递行业加班加点的干也不追不上人们下单的速度。如今&#xff0c;互联网时代崛起&#xff0c;网购成为了大家最寻…