如果写劣质代码是犯罪,那我该判无期
👉导读
程序员痛恨遇到质量低劣的代码,但在高压环境下,我们常为了最快解决当下需求而忽略代码规范,在无意识中堆积大量债务。我们还观察到许多开发者被迫加班的罪魁祸首便是写低效代码、不重视代码优化。编程路上,欲速则不达。接下来,我将为各位列举9种我个人工作中高频遇到的不整洁代码行为,并提出针对性优化建议。继续阅读~👉目录
1 代码风格和可读性2 注释3 错误处理和异常处理4 代码复用和模块化5 硬编码6 测试和调试7 性能优化8 代码安全性9 版本控制和协作10 总结
01
错误习惯
1.1 变量命名不规范
float f; // 不清楚变量表示的含义
float price; // 清晰明了的变量名
1.2 长函数和复杂逻辑
if score >= 90:
grade = 'A'
elif score >= 80:
grade = 'B'
elif score >= 70:
grade = 'C'
elif score >= 60:
grade = 'D'
else:
grade = 'F'
if grade == 'A' or grade == 'B':
result = 'Pass'
else:
result = 'Fail'
return result
grade = get_grade(score)
result = pass_or_fail(grade)
return result
def get_grade(score):
if score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
elif score >= 60:
return 'D'
else:
return 'F'
def pass_or_fail(grade):
if grade == 'A' or grade == 'B':
return 'Pass'
else:
return 'Fail'
1.3 过长的行
if x>0:return 'positive' elif x<0:return 'negative'else:return 'zero'
if x > 0:
return 'positive'
elif x < 0:
return 'negative'
else:
return 'zero'
02
错误习惯
错误的注释
03
错误的习惯
3.1 忽略错误
return x / y
try:
return x / y
except ZeroDivisionError:
return 'Cannot divide by zero!'
3.2 过度使用异常处理
try:
result = a / b
except ZeroDivisionError:
result = float('inf')
return result
if b == 0:
result = float('inf')
else:
result = a / b
return result
3.3 捕获过于宽泛的异常
// 执行一些可能抛出异常的代码
} catch (Exception e) {
// 捕获所有异常,并忽略错误
}
// 执行一些可能抛出异常的代码
} catch (FileNotFoundException e) {
// 处理文件未找到异常
logger.error("File not found", e);
} catch (IOException e) {
// 处理IO异常
logger.error("IO error", e);
} catch (Exception e) {
// 处理其他异常
logger.error("Unexpected error", e);
}
04
错误的习惯
4.1 缺乏复用性
return length * width
def calculate_volume_of_cuboid(length, width, height):
return length * width * height
def calculate_area_of_triangle(base, height):
return 0.5 * base * height
def calculate_volume_of_cone(radius, height):
return (1/3) * 3.14 * radius * radius * height
return length * width
def calculate_volume(length, width, height):
return calculate_area_of_rectangle(length, width) * height
def calculate_area_of_triangle(base, height):
return 0.5 * base * height
def calculate_volume_of_cone(radius, height):
return (1/3) * 3.14 * radius * radius * height
4.2 缺乏模块化
def __init__(self, name):
self.name = name
def save(self):
# 保存用户到数据库的逻辑
def send_email(self, content):
# 发送邮件的逻辑
class Order:
def __init__(self, user, product):
self.user = user
self.product = product
def save(self):
# 保存订单到数据库的逻辑
def send_email(self, content):
# 发送邮件的逻辑
```
def __init__(self, name):
self.name = name
def save(self):
# 保存用户到数据库的逻辑
class Order:
def __init__(self, user, product):
self.user = user
self.product = product
def save(self):
# 保存订单到数据库的逻辑
class EmailSender:
def send_email(self, content):
# 发送邮件的逻辑
05
错误的习惯
5.1 常量
if (score > 60) {
// do something
}
def calculate_score(score):
if (score > PASS_SCORE) {
// do something
}
5.2 全局变量
def increment():
global counter
counter += 1
return counter + 1
06
错误的习惯
6.1 单元测试
return a + b
def add_number(a, b):
return a + b
class TestAdd(unittest.TestCase):
def add_number(self):
self.assertEqual(add(2, 3), 5)
if __name__ == '__main__':
unittest.main()
6.2 边界测试
return n % 2 == 0
def is_even(n):
return n % 2 == 0
class TestIsEven(unittest.TestCase):
def test_even(self):
self.assertTrue(is_even(2))
self.assertFalse(is_even(3))
if __name__ == '__main__':
unittest.main()
6.3 可测试性
return datetime.datetime.now()
return now
07
错误的习惯
7.1 过度优化
def sum(numbers):
return functools.reduce(operator.add, numbers)
这段代码的问题在于,它使用了 functools.reduce 和 operator.add 来计算列表的和,虽然这样做可以提高一点点性能,但是这使得代码难以理解。我们应该在保持代码清晰和易读的前提下,进行适度的优化。例如:
def sum(numbers):
return sum(numbers)
这段代码使用了内置的 sum 函数来计算列表的和,虽然它可能比上面的代码慢一点,但是它更清晰、易读。
7.2 没有使用合适的数据结构
选择合适的数据结构可以提高代码的性能。使用不合适的数据结构可能导致代码执行缓慢或占用过多的内存。例如:
def find_duplicate(numbers):
duplicates = []
for i in range(len(numbers)):
if numbers[i] in numbers[i+1:]:
duplicates.append(numbers[i])
return duplicates
在这个示例中,我们使用了列表来查找重复元素,但这种方法的时间复杂度较高。我们可以使用集合来查找元素。例如:
def find_duplicate(numbers):
duplicates = set()
seen = set()
for num in numbers:
if num in seen:
duplicates.add(num)
else:
seen.add(num)
return list(duplicates)
我们使用了集合来查找重复元素,这种方法的时间复杂度较低。
08
错误的习惯
8.1 输入验证
没有对用户输入进行充分验证和过滤可能导致恶意用户执行恶意代码或获取敏感信息。例如:
import sqlite3
def get_user(username):
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
query = f"SELECT * FROM users WHERE username = '{username}'"
cursor.execute(query)
user = cursor.fetchone()
conn.close()
return user
在这个示例中,我们没有对用户输入的 `username` 参数进行验证和过滤,可能导致 SQL 注入攻击。正确示例:
import sqlite3
def get_user(username):
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
query = "SELECT * FROM users WHERE username = ?"
cursor.execute(query, (username,))
user = cursor.fetchone()
conn.close()
return user
在这个示例中,我们使用参数化查询来过滤用户输入,避免了 SQL 注入攻击。
8.2 不正确的密码存储
将明文密码存储在数据库或文件中,或使用不安全的哈希算法存储密码都是不安全的做法。错误示例:
import hashlib
def store_password(password):
hashed_password = hashlib.md5(password.encode()).hexdigest()
# 存储 hashed_password 到数据库或文件中
在这个示例中,我们使用了不安全的哈希算法 MD5 来存储密码。正确示例:
import hashlib
import bcrypt
def store_password(password):
hashed_password = bcrypt.hashpw(password.encode(), bcrypt.gensalt())
# 存储 hashed_password 到数据库或文件中
在这个示例中,我们使用了更安全的哈希算法 bcrypt 来存储密码。
8.3 不正确的权限控制
没有正确验证用户的身份和权限可能导致安全漏洞。错误示例:
def delete_user(user_id):
if current_user.is_admin:
# 执行删除用户的操作
else:
raise PermissionError("You don't have permission to delete users.")
在这个示例中,我们只检查了当前用户是否为管理员,但没有进行足够的身份验证和权限验证。正确示例:
def delete_user(user_id):
if current_user.is_authenticated and current_user.is_admin:
# 执行删除用户的操作
else:
raise PermissionError("You don't have permission to delete users.")
在这个示例中,我们不仅检查了当前用户是否为管理员,还检查了当前用户是否已经通过身份验证。
09
错误的习惯
9.1 版本提交信息
git commit -m "Fixed a bug"
$ git commit -m "Fixed a bug in calculate function, which caused grade calculation for scores below 60"
9.2 忽略版本控制和备份
$ mv important_code.py important_code_backup.py
$ rm important_code.py
$ git clone project.git
$ cp important_code.py important_code_backup.py
$ git add .
$ git commit -m "Created backup of important code"
$ git push origin master
$ rm important_code.py
10
“
细节之中自有天地,整洁成就卓越代码。
写代码时犯过什么搞笑的低级错误?你又有什么避免错误的好办法?欢迎在评论区分享讨论。我们将选取1则最有意义的分享,送出腾讯云开发者-手腕垫1个(见下图)。7月24日中午12点开奖。