哪些代碼是 Code Review 中的大忌败富?—— 以 Python 為例

Code Review 首要達成的結(jié)果是更好的可讀性兽叮。
在此基礎(chǔ)上才是進一步發(fā)現(xiàn)項目的 Bug充择、處理性能優(yōu)化上的問題匪蟀。
因為,編碼是給人看的观挎,不是給計算機(Coding for human, NOT computer)嘁捷。

一. 濫用縮寫命名 Overusing abbreviation

大部分業(yè)務(wù),尤其是不是直接暴露在前端的業(yè)務(wù)显熏,不需要考慮混淆的設(shè)計雄嚣,別因為少打兩個字,讓你的同伴都搞混了喘蟆!

# 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

語法糖是常見的程序員炫技手段缓升,但即使對寫下這段代碼的人,經(jīng)過一段時間后蕴轨,也未必能在第一時間讀出這段代碼的含義港谊。

例如在 Python 中:

  1. 使用布爾操作符作為條件判斷
    第一段炫技代碼,不熟悉的同學(xué)可能第一反應(yīng)是 result=True
# 炫技橙弱,可讀性差
is_valid = True
result = is_valid and "Valid" or "Invalid"

# 等價歧寺,可讀性更好
result = "Valid" if is_valid else "Invalid"
  1. 使用列表推導(dǎo)式處理嵌套列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
  1. 過度追求“簡潔”的 lambda 表達式
    lambda 表達式用在 sorted 中做為排序參數(shù)是比較常用的,但過度追求單行表達棘脐,是不可取的蛀缝,除了可讀性差蕴潦,還違背了程序設(shè)計的單一職責(zé)原則忽冻。

單行僧诚、可讀性差版本:

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))

分離職責(zé)蹦骑,可讀性好版本:

def calculate_score(student):
    return student["grade"] - student["age"]

sorted_students = sorted(students, key=calculate_score)

當(dāng)然边败,語法糖也有少部分是增加可讀性的,可以作為代碼規(guī)范使用:

big_number = 1_000_000_000
# equivalent to big_number = 1000000000

1 < x < 10
# equivalent to 1 < x and x < 10

三. 不可預(yù)測的代碼 Unpredictable Code

好代碼是可預(yù)測的,壞代碼是給人驚嚇的断傲。

一種是由于開發(fā)人員基礎(chǔ)不扎實無意識造成的:
例如:
使用可變變量作為參數(shù)

# 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]

另一種女仰,是開發(fā)設(shè)計的偷懶、或者未進行事先溝通自作主張一罩。

最常見的是更改接口參數(shù)類型差购,返回不符合預(yù)期的結(jié)構(gòu)數(shù)據(jù)。比如不允許為空的字段返回了空稳析,API 版本沒有變化的情況下,增加了必傳的參數(shù)等等

再如陈惰,狀態(tài)碼與實際的情況不符合。

雖然開發(fā)人員處理了幾種已知的錯誤画髓,但是狀態(tài)碼一直是 200,對于調(diào)用方肉微,如果使用 status.OK 則永遠(yuǎn)返回 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()

正確的寫法,應(yīng)該使用對應(yīng)的狀態(tài)碼,確保其他框架可以信任這個結(jié)果:

# Following the Principle of Least Astonishment in error handling
from flask import Flask, jsonify
from werkzeug.exceptions import NotFound, Forbidden

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:
        raise NotFound(description="File not found")
    except PermissionError:
        raise Forbidden(description="Permission error")

if __name__ == '__main__':
    app.run()

Bonus: 有沒有可以抄的解決方法?

  1. 參考大廠的代碼風(fēng)格規(guī)范

Google 開放了不少常見語言的代碼規(guī)范:
https://google.github.io/styleguide/

Google Style Guide

小米也有數(shù)據(jù)庫設(shè)計互躬,SQL 相關(guān)的規(guī)范:
https://github.com/XiaoMi/soar

如果接手一個新的語言或工具容为,還可以在搜索資料時加一個 best pratice 看看其他人的經(jīng)驗。

  1. 借助插件或 CI 工具

對于常見的規(guī)范單行代碼長度、空格等,可以使用 ESLint沮协、Pylint,、 Black (for Python) 等行瑞,直接格式化代碼,或者借助工具查錯

  1. 多 Review 多溝通
    工作中的大部分代碼不是你一個人蠻干,自己的思維局限性副砍,可以通過他人的視角打破。

Ref:

  1. Syntactic Sugar in Python: https://medium.com/analytics-vidhya/syntactic-sugar-in-python-3e61d1ef2bbf
  2. 7 simple habits of the top 1% of engineers: https://read.engineerscodex.com/p/7-simple-habits-of-the-top-1-of-engineers
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末背桐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖喂柒,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡栏渺,警方通過查閱死者的電腦和手機霎终,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門阅茶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胁赢,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵羡微,是天一觀的道長。 經(jīng)常有香客問我毅哗,道長松忍,這世上最難降的妖魔是什么酥艳? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮喊暖,結(jié)果婚禮上巩掺,老公的妹妹穿的比我還像新娘寇漫。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著信柿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天唧取,我揣著相機與錄音淡诗,去河邊找鬼群凶。 笑死赠尾,一個胖子當(dāng)著我的面吹牛寸宵,可吹牛的內(nèi)容都是我干的蛾坯。 我是一名探鬼主播倘零,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奶卓,失蹤者是張志新(化名)和其女友劉穎盏浙,沒想到半個月后丐黄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桂对,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡诽凌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年躬络,在試婚紗的時候發(fā)現(xiàn)自己被綠了馁菜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卖丸。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤歧斟,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站捐康,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刻盐。R本人自食惡果不足惜伶丐,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崔列。 院中可真熱鬧梢褐,春花似錦、人聲如沸赵讯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边翼。三九已至鱼响,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間组底,已是汗流浹背丈积。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斤寇,地道東北人桶癣。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像娘锁,于是被迫代替她去往敵國和親牙寞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容