Python如何写⼲净的代码Clean-Code
1. 什么是Clean-Code
Clean-Code 是⼀组规则和原则,有助于保持我们的代码可读、可维护和可扩展。我们花在阅读代码上的时间⽐实际编写代码的时间多得多,这就是为什么编写易于维护的代码很重要。
1.1 Clean-Code的特点
容易理解
更有效率
易于维护, 拓展, 调试
需要更少的⽂档
2. 代码标准
代码标准是编码规则、指南和最佳实践的集合。从以下⼏个⽅⾯介绍⼀下代码标准
编程实践和原则
⽂件组织
代码格式(缩进、声明、语句)
命名约定
注释
2.1 代码原则
Don't Repeat Yourself)
系统中的每⼀部分,都必须有⼀个单⼀的、明确的、权威的代表
这是最简单的编码原则之⼀。它唯⼀的规则是代码不应重复。简单来说就是写代码的时候,如果出现雷同⽚段,就要想办法把他们提取出来。
2.1.2 KISS (Keep It Simple, Stupid)
⼤多数系统在保持简单⽽不是变得复杂时效果最好。
KISS 原则指出,⼤多数系统如果保持简单⽽不是变得复杂,则效果最佳。简单应该是设计的⼀个关键⽬标,应该避免不必要的复杂性。
Separation of Concerns)
SoC 是⼀种设计原则,⽤于将计算机程序分成不同的部分,以便每个部分解决⼀个单独的问题。关注点是影响计算机程序代码的⼀组信息。
SoC 的⼀个很好的例⼦是MVC(模型 - 视图 - 控制器)。
如果您决定采⽤这种⽅法,请注意不要将您的应⽤程序分成太多模块。您应该只在有意义的时候创建⼀个新模块。
2.1.4 SOLID
SOLID 是五个设计原则的助记⾸字母缩写词,旨在使软件设计更易于理解、灵活和可维护。
SOLID 在编写 OOP 代码时⾮常有⽤。它谈到将您的类拆分为多个⼦类、继承、抽象、接⼝等。
它由以下五个概念组成:
1. The Single-responsibility principle: 有且仅有⼀个原因使类变更(⼀个对象应该只包含单⼀的职责,并且该职责被完整地封装在⼀个
类中)。
2. The Open–closed principle: 实体应该对扩展是开放的,对修改是封闭的。即可扩展(extension),不可修改(modification)。
3. The Liskov substitution principle: ⼀个对象在其出现的任何地⽅,都可以⽤⼦类实例做替换,并且不会导致程序的错误。
4. The Interface segregation principle: 接⼝隔离原则表明客户端不应该被强迫实现⼀些他们不会使⽤的接⼝(应该把臃肿的接⼝中的
⽅法分组,然后⽤多个接⼝替代它,每个接⼝服务于⼀个⼦模块)
5. The Dependency inversion principle: 依赖抽象⽽不应该依赖实现。换⾔之,要针对抽象(接⼝)编程,⽽不是针对实现细节编
程。
2.2 ⽂件组织-
为了使代码尽可能有条理,您应该将其拆分为多个⽂件,然后将这些⽂件拆分为不同的⽬录。
的默认项⽬结构是您的代码结构的⼀个很好的例⼦:
2.3 代码格式
Python 代码应该遵循 PEP8 编码标准的风格指南, ⼀下是最重要的⼀些约定.
① PEP 8 命名约定② PEP 8 ⾏格式
类名应该是 CamelCase ( MyClass)使⽤ 4 个空格缩进(空格优先于制表
符)
变量名应该是snake_case并且全部⼩写
(first_name)
⾏不应超过 79 个字符
函数名应该是snake_case并且全部⼩写
(quick_sort())
避免在同⼀⾏上出现多个语句
常量应该是snake_case并且全部⼤写( PI = 3.14)顶级函数和类定义被两个空⾏包围
模块应该有简短的、snake_case 名称和全部⼩写(pandas)类中的⽅法定义被⼀个空⾏包围
1awesomeproject/
2├── main/
3│├── __init__.py
4│├── asgi.py
5│├── settings.py
6│├── urls.py
7│└── wsgi.py
8├── blog/
9│├── migrations/ 10││└── __init__.py 11│├── __init__.py 12│├── admin.py
13│├── apps.py
14│├── models.py
15│├── tests.py
16│├── urls.py
17│└── views.py
18└── templates
单引号和双引号的处理⽅式相同(只需选择⼀个并保
持⼀致)
进⼝应该在单独的⾏上③ PEP 8 空格④ PEP 8 评论
避免括号或⼤括号内的额外空格
注释不应与代码相⽭盾避免在任何地⽅尾随空格
评论应该是完整的句⼦总是在⼆元运算符两边⽤空格
评论应该在# 号后⾯有⼀个空格,第⼀个单词⼤写包含不同优先级的运算符,在优先级最低的
运算符周围添加空格
函数(⽂档字符串)中使⽤的多⾏注释应该有⼀个简短的单⾏描述,后跟更多的⽂本
当⽤于指⽰关键字参数时,不要在 = 符号周
围使⽤空格2.4 命名约定
命名约定是编写 Clean-Code 的最重要⽅⾯之⼀。
2.4.1 变量变量命名除了应该遵循PEP8, snake_case⼩写, 还应该遵循以下原则:
①. 使⽤名词作为变量名
②. 避免歧义缩写
③. 避免双重否定要避免出现 "是否不能够不为空" 这种难以理解的双重否定变量
④. 使⽤描述性的单词变量名应该完整描述出变量数据的含义
⑤. 与历史规则保持⼀致1play = 4 # Bad 2play_times = 4 # Good ✔
1mec = 15 # Bad 2message_expose_count = 15 # Good ✔
1is_not_invalid = False # Bad 2is_valid = False # Good ✔
1expire = '2021-08-17 11:25:37.223283' # Bad 2expiration_time = '2021-08-17 11:25:37.223283' # Good ✔
1# 已经存在的代码
2def function_1(req, resp, var):
3 pass
4
怎样写代码 自己做编程5def function_2(req, resp, data):
6 pass
7
8# Bad
9def function_new(request, response, data):
10 pass
11
12# Good ✔
13def function_new(req, resp, data):
14 pass
⑥. 不要使⽤“幻数”
幻数是出现在代码中的没有明确的含义的, "奇怪"的数字.
1import random
2
3# Bad
4def roll():
5 return random.randint(0, 36) # 为什么是36
6
7# Good ✔
8POCKET_COUNT = 36
9def roll():
10 return random.randint(0, POCKET_COUNT)
⑦. 有必要标识出数据类型
1players = ["Jordan", "Bryant", "James"] # Bad
2player_list = ["Jordan", "Bryant", "James"] # Good ✔ ⑧. 去除冗余的信息
不要在变量名中添加不必要的数据
1# Bad
2class Player:
3 def __init__(self, player_name, player_number):
4 self.player_name = player_name
5 self.player_number = player_number
6
7 def player_shoot(self):
8 pass
9
10# Good ✔
11class Player:
12 def __init__(self, name, number):
13 self.name = name
14 self.number = number
15
16 def shoot(self):
17 pass
2.4.2 函数
①. 使⽤动词作为函数名
1def user_score(): # Bad
2 pass
3
4def compute_user_score(): # Good ✔
5 pass
②. 同⼀个概念使⽤相同的词
1# Bad
2def get_name():
3 pass
4def fetch_age():
5 pass
6
7# Good ✔
8def get_name():
9 pass
10def get_age():
11 pass
③. 尽量减少你的参数
如果需要为函数提供多个参数,可以创建⼀个数据对象将其传递给函数, 或函数其拆分为多个函数.
1# Bad
2def set_first_team(name, number, position, jersey, offensive_score, defensive_score):
3 pass
4
5# Good ✔
6@dataclass
7class Player:
8 name: str
9 number: int
10 position: str
11 jersey: str
12 offensive_score: float
13 defensive_score: float
14
15def set_first_team(player):
16 pass
④. ⼀个函数只做⼀件事
如果函数名包含关键字“and”,可以考虑将其拆分为两个函数。
1# Bad
2def training_freethrow_and_dribble():
3 pass
4
5# Good ✔
6def training_freethrow():
7 pass
8
9def training_dribble():
10 pass
⑤. 不要在函数中使⽤flag
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论