50个成为优秀程序员的法则[1-10]
原文链接: 50 Coding Laws That Would Make You A Decent Programmer.
1. 不惜一切代价避免注释
开幕暴击,一直以来各种书籍文章或者资料大多建议要写注释,当然我也看到另一种说法不写注释写Wiki,仔细看完作者的观点之后觉得还是挺有道理,作者列举的理由如下:
浏览注释会转移或者分散阅读者的思维
注释可能虚假或者没有及时更新
好的代码无需注释也能看懂
2. 不要使用类型属性作为变量的名称
这个比较好理解,以 Python
为例,作者的建议是通过类型标注来指示变量类型而不是名称。
# ❌
name_of_variable_str = value
# ✅
name_of_variable: str = value
3. 类的名称应该是名词
主要是因为类对象用于标识或表示一堆特征和动作,使用名词作为类名会避免冗余,使代码更易读。
# ❌
GetGoat.get_horn_length()
# ✅
Goat.get_horn_length()
4. 函数名应该是动词
以便于更好的理解它所进行的操作
5. 函数应该指定参数和返回类型
# ❌
def conver_to_string(num):
return "My new string is " + str(num)
# ✅
def conver_to_string(num: int) -> str:
return "My new string is " + str(num)
6. 一个函数必须只能执行一个功能
让一个函数执行一个功能至关重要,因为它有助于暴露错误的位置,实现可重用性,并完全按照函数名称所说的去做。
# ❌
def check_if_address_is_valid(address):
if address.is_valid:
latitude = address.getLatitude()
longtitude = address.getLongitude()
return (latitude, longitude)
# ✅
def check_if_address_is_valid(address):
return address.is_vallid
def get_latitude():
latitude = address.getLatitude()
return latitude
def get_longitude():
longtitude = address.getLongitude()
return longitude
7. 函数应该处于相同的抽象级别
指的是一个函数应该执行一个定义明确的任务。该任务应该在整个函数中处于一致的抽象级别。
# ❌
def get_numbers():
numbers = [2,3,4,1,4,1,416,6]
return numbers
def calculate_average():
numbers = get_numbers()
numbers_plus_30 = [num + 30 for num in numbers]
total = sum(numbers_plus_30)
count = len(numbers)
average = total / count
return average
calculate_average()
# ✅
def calculate_average(numbers):
total = sum(numbers)
count = len(numbers)
average = total / count
return average
calculate_average([2,3,4,1,4,1,416,6])
不好的做法的函数有一堆抽象级别。 get_numbers()
是高级抽象,列表理解是中级抽象,sum是低级抽象。
8. 函数名应该与其参数密切相关
# ❌
write(True)
# ✅
write(name)
好的做法更能描述函数到底在做什么。
9. 函数应该很小
一个函数应该是可重用的。函数越大,它被重用的可能性就越小。这也与为什么一个函数应该只做一件事相关。如果它只做一件事,它很有可能会很小。
10. 避免冗余的词语
命名应该简洁明了,避免多于的描述,那样反而会导致混淆。
# ❌
getProfileInfo()
getProfileInfos()
getProfileAccount()
# ✅
getProfile()
11. 不要成为一个肮脏的程序员
这意味着你要写干净的代码,但什么才是干净的代码呢?干净的代码结构良好,排列良好。干净的代码不会隐藏错误。它向程序员公开了bug可以隐藏的任何地方,并可以无需完全重构就可以修复其中的bug。
12. 开放封闭原则
开放-封闭原则(OCP)指出,类、方法或函数必须对扩展开放,但不能进行修改。这意味着定义的任何类、方法或函数都可以很容易地为多个实例重用或扩展,而无需更改其代码。
13. Liskov替换原则
Liskov替换原则(LSP)是一种子类型关系的特定定义,称为强行为子类型,最初由Barbara Liskov在1987年的一次会议主题演讲中引入,题为数据抽象和层次结构。它基于“可替换性”的概念——面向对象编程中的一项原则,规定对象(如类)可以被子对象(如扩展第一类的类)替换,而不会破坏程序。它是一种语义关系,而不仅仅是句法关系,因为它旨在保证层次结构中类型的语义互操作性,尤其是对象类型。
14. 知道何时使用注释
文章中说,每当您需要使用注释时,都要为自己无法用代码表达自己而感到羞耻。但是在某些情况下,使用注释实际上有助于表达代码的底层工作原理,而不是代码本身。原文列举了几个好注释的最佳示例:
- 信息注释:例如,突出函数返回值的注释
- TODO注释
- 后果警告
15. 什么时候不适合添加注释
-
噪声注释 ,如下:
# add to animal list animal.append(dog)
- 非本地信息 :编写注释时,确保它只与它引用的函数或语句相关。除此之外的任何内容都应该删除。
- 不明显的注释 :你的评论和引用的函数之间的联系必须清晰。
- 短函数 :短函数往往不需要注释,而是用一个好的名字来描述它。
16. 保持源文件简短
出于可重用性和易读性的需要,源文件应该在100-200行之间,最多500行。除非你有很好的理由选择其他方式。
17. 正确的使用空行
空行是告诉读者我们正在进入一个新的独立概念的一种方式。每一个代码块表示一个完整的想法。
18. 保持相关联的代码/函数/类靠近
Go where you are valued
函数/变量应该尽可能靠近最需要或最重要的地方。它应该离它最不重要的地方最远。
19. 知道何时使用空白
我们使用空格来表示两件事不是强相关的,没有空格来关联强相关的事物。
20. 遵守团队规则
降低这些个人偏好并采用团队的偏好。