作者 | Alex Omeyer
譯者 | 翟珂
審校丨Noe
Python的風(fēng)格優(yōu)雅干凈,但語法干凈并不等同于編寫的代碼也是干凈的。開發(fā)人員仍然需要學(xué)習(xí)Python最佳實(shí)踐和設(shè)計(jì)模式。
什么是干凈的代碼?
C++的發(fā)明者Bjarne Stroustrup說過一句話清楚地解釋了干凈代碼的含義:“我喜歡我的代碼是優(yōu)雅和高效的。邏輯應(yīng)該是直截了當(dāng)?shù)模@樣就很難隱藏錯(cuò)誤;依賴關(guān)系應(yīng)該是最小的,這樣便于維護(hù);錯(cuò)誤處理應(yīng)該是完整的,符合明確的策略;性能應(yīng)該是接近最佳的,這樣就不會(huì)誘使人們用無原則的優(yōu)化使代碼變得混亂。干凈的代碼能做好這件事。”
從這句話中,我們可以挑選出干凈代碼的一些品質(zhì):
- 干凈的代碼是有重點(diǎn)的。每個(gè)函數(shù)、類或模塊都應(yīng)該做一件事,而且要做得好。
- 干凈的代碼容易閱讀和推理。根據(jù)《面向?qū)ο蟮姆治龊驮O(shè)計(jì)與應(yīng)用》一書的作者Grady Booch的說法:干凈的代碼讀起來就像寫好的散文。
- 干凈的代碼很容易調(diào)試。
- 干凈的代碼易于維護(hù)。也就是說,其他開發(fā)人員可以輕松閱讀和優(yōu)化它。
- 干凈的代碼具有高性能。
開發(fā)人員可以隨心所欲地編寫他們的代碼,因?yàn)闆]有固定的或約束性的規(guī)則來要求他/她編寫干凈的代碼。而糟糕的代碼會(huì)產(chǎn)生技術(shù)債務(wù),從而對(duì)公司造成嚴(yán)重后果。
在本文中,我們將看看一些幫助我們?cè)赑ython中編寫干凈代碼的設(shè)計(jì)模式。讓我們?cè)谙挛闹辛私馑鼈儭?/p>
編寫干凈Python代碼的手段
命名規(guī)則:
命名規(guī)則是編寫干凈代碼的最有用和最重要的方面之一。在給變量、函數(shù)、類等命名時(shí),要使用有意義的、能揭示意圖的名字。而這意味著我們會(huì)傾向于使用長的描述性名稱,而不是短的模糊不清的名稱。
下面是一些例子:
1、使用易于閱讀的長描述性名稱。這將省去寫不必要的注釋,如下所示:
# 不推薦
# au變量是活躍用戶數(shù)
au = 105
# 推薦
total_active_users = 105
2、使用描述內(nèi)容名稱。其他開發(fā)人員應(yīng)該能夠從名稱中找出你的變量存儲(chǔ)的內(nèi)容。簡而言之,你的代碼應(yīng)該易于閱讀和推理。
# 不推薦
c = [“UK”, “USA”, “UAE”]
for x in c:
print(x)
# 推薦
cities = [“UK”, “USA”, “UAE”]
for city in cities:
print(city)
3、避免使用模棱兩可的簡稱。變量應(yīng)該有一個(gè)長的描述性名稱,而不是一個(gè)容易混淆的簡稱。
# 不推薦
fn = 'John'
Ln = ‘Doe’
cre_tmstp = 1621535852
# 推薦
first_name = ‘John’
Las_name = ‘Doe’
creation_timestamp = 1621535852
4、始終使用相同的詞匯。與你的命名規(guī)則保持一致。當(dāng)其他開發(fā)人員處理你的代碼時(shí),保持一致的命名規(guī)則對(duì)于消除混淆非常重要。這適用于命名變量、文件、方法甚至目錄結(jié)構(gòu)。
# 不推薦
client_first_name = ‘John’
customer_last_name = ‘Doe;
# 推薦
client_first_name = ‘John’
client_last_name = ‘Doe’
Also, consider this example:
#不推薦
def fetch_clients(response, variable):
# 處理
pass
def fetch_posts(res, var):
# 處理
pass
# 推薦
def fetch_clients(response, variable):
# 處理
pass
def fetch_posts(response, variable):
# 處理
pass
5、在你的編輯器中開始跟蹤代碼庫的問題。
讓工程師可以輕松地跟蹤和查看代碼本身的問題是保持Python代碼庫清潔的一個(gè)主要手段。允許工程師在編輯器中跟蹤代碼庫問題可以讓工程師們:
- 全面了解技術(shù)債務(wù)
- 查看每個(gè)代碼庫問題的上下文
- 減少上下文切換
- 不斷解決技術(shù)債務(wù)問題
你可以使用各種工具來跟蹤你的技術(shù)債務(wù),但最快速和最簡單的方法是使用VSCode或JetBrains的免費(fèi)Stepsize擴(kuò)展,它可以與Jira、Linear、Asana和其他項(xiàng)目管理工具集成。
6、不要使用魔法值。魔法值是具有特殊的、硬編碼語義的數(shù)字,它出現(xiàn)在代碼中但沒有任何解釋。所以我們將這些數(shù)字以文字形式出現(xiàn)在我們代碼中的多個(gè)位置。
import random
# 不推薦
def roll_dice():
return random.randint(0, 4) # 4應(yīng)該代表什么?
# 推薦
DICE_SIDES = 4
def roll_dice():
return random.randint(0, DICE_SIDES)
函數(shù):
7、保持一致的函數(shù)命名規(guī)則。
正如上面的變量所見,在命名函數(shù)時(shí)要堅(jiān)持一個(gè)命名習(xí)慣。使用不同的命名習(xí)慣會(huì)使其他開發(fā)者感到困惑。
# 不推薦
def get_users():
# 處理
Pass
def fetch_user(id):
# 處理
Pass
def get_posts():
# 處理
Pass
def fetch_post(id):
# 處理
pass
# 推薦
def fetch_users():
# 處理
Pass
def fetch_user(id):
# 處理
Pass
def fetch_posts():
# 處理
Pass
def fetch_post(id):
# 處理
pass
8、函數(shù)應(yīng)該只做一件事,而且要做得好。寫短而簡單的函數(shù),執(zhí)行單一的任務(wù)。需要注意的是,如果你的函數(shù)名稱包含“and”,你可能需要把它拆分成兩個(gè)函數(shù)。
# 不推薦
def fetch_and_display_users():
users = [] # 一些 api 調(diào)用的結(jié)果
for user in users:
print(user)
# 推薦
def fetch_usersl():
users = [] # 一些 api 調(diào)用的結(jié)果
return users
def display_users(users):
for user in users:
print(user)
9、不要使用布爾值。布爾值(真或假)。每種結(jié)果應(yīng)該作為一個(gè)單獨(dú)的函數(shù)去調(diào)用,而不是當(dāng)作函數(shù)的入?yún)ⅰ?/p>
類:
10. 不要添加多余的描述。在使用類時(shí),變量名不要添加不必要的前綴。
# 不推薦
class Person:
def __init__(self, person_username, person_email, person_phone, person_address):
self.person_username = person_username
self.person_email = person_email
self.person_phone = person_phone
self.person_address = person_address
# 推薦
class Person:
def __init__(self, username, email, phone, address):
self.username = username
self.email = email
self.phone = phone
self.address = address
在上面的例子中,由于我們已經(jīng)在Person類里面了,所以沒有必要在每個(gè)類的變量上添加person_前綴。
獎(jiǎng)勵(lì):模塊化你的代碼
為了保持你的代碼的條理性和可維護(hù)性,把你的邏輯分成不同的文件或類,我們稱之為模塊。Python中的模塊是一個(gè)以.py為擴(kuò)展名的文件。每個(gè)模塊都應(yīng)該專注于做一件事,并且把它做好。
你可以遵循面向?qū)ο蟮腛OP原則,例如遵循基本的OOP原則,如封裝、抽象、繼承和多態(tài)。
結(jié)論
編寫干凈的代碼有很多優(yōu)點(diǎn),如:提高軟件質(zhì)量、增強(qiáng)代碼可維護(hù)性和消除技術(shù)債務(wù)等。而這些提高編寫干凈代碼的手段同時(shí)也適用于其他語言,我希望通過閱讀這篇文章,你已經(jīng)對(duì)干凈代碼和編寫干凈代碼的一些手段有了足夠的了解。
原文鏈接:https://dzone.com/articles/10-must-know-patterns-for-writing-clean-code-with-1
譯者介紹
翟珂,51CTO社區(qū)編輯,目前在杭州從事軟件研發(fā)工作,做過電商、征信等方面的系統(tǒng),享受分享知識(shí)的過程,充實(shí)自己的生活。