成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

五大代碼異味:你需要提高警惕了!

開發 前端
代碼異味是弱點或設計缺陷的標志,可能會在可讀性、可維護性和可拓展性上導致問題,通常是由不當做法和未使用正確的工具導致的。

 本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。

作為廣泛應用的警告標志,與字面意思不同,代碼異味并不是指代碼中需要立即注意的漏洞。相反,它反映出代碼中更深層次的問題,更確切地說是代碼中的裂縫,如果不加以糾正,這些問題可能會在未來導致更嚴重的后果。

代碼異味是弱點或設計缺陷的標志,可能會在可讀性、可維護性和可拓展性上導致問題,通常是由不當做法和未使用正確的工具導致的。

Python是最流行的語言之一,這在很大程度上與其相當容易的學習曲線和高度偽英語句法有關,而這卻容易令人陷入單一的做事方法。本文中,我們將了解一些典型的Python代碼異味案例以及如何避免它們。

[[335928]]

可變默認參數

在Python中,使用默認參數是一個很常見的操作,你可以設置一個預定值,并在調用時選擇更改。這在設置文字、數字或布爾值時很有用,因為有助于避免出現較長的有冗余值的參數列表。

但是將可變的值設置為默認參數可能是危險的,并且會導致bug。來看以下示例:

  1. def addElements(a=[]): 
  2.     a.append(5) 
  3.     return aaddElements() 
  4. # [5] 
  5. addElements() 
  6. # [5, 5] 

相同的函數在每次調用時給出不同的結果。Python中可變默認值的問題是它們只在定義函數時計算一次。每次調用函數時,使用變異值,可能會導致意外的問題,因為跟蹤函數調用真的很麻煩。

因此,使用None作為默認值,并在函數中分配可變變量是更安全的,因為你不會以可維護性問題結束,只有在確定需要時才使用可變的默認參數。

選擇 `range` 而不是`enumerate`

Python的for循環不是最常用的代碼編寫方式,但有時也會需要到。現在,Python中的for 循環的運行與其他語言不同,你可能會本能地以非慣用的方式編寫傳統風格的range(len()),如下所示:

  1. names =["a", "b", "c"]for i in range(len(names)): 
  2.     print(i, names[i]) 

重復基于C-style索引的循環是相當常見的,但這是一種不當做法。其迫使你通過顯式索引變量訪問元素,所以它不僅Python特性不明顯,而且還存在可讀性問題。

使用enumerator能提供一個元組的優勢,該元組負責同時跟蹤索引值和元素。除了更簡便,優化程度還更高,它還提供了可選的第二個參數來設置數值。

  1. for i, name in enumerate(names): 
  2.    print(i, name) 

忽略內置函數和過度循環

循環不是不能用,但在其中應用轉換操作時,它可能會導致冗長的條件代碼。在這種情況下,不要忽略已經可以使用的內置函數,如map()filter()和reduce(),這是非常重要的。更重要的是,Python提供了列表解析,這顯然是最具Python特性的替換循環方法。

嵌套for循環是代碼異味的另一個典型例子。Python程序員在進行模式匹配或一起運行多個迭代時很容易中槍。下列代碼一旦再加幾行就會看起來不美觀:

  1. for x in listA: 
  2.     for y in listB: 
  3.         r.append((x, y)) 

使用itertools不僅可以提高性能,還更簡潔明了。看看上面的代碼在itertools.product()中有多整潔:

  1. for x, y in itertools.product(listA,listB):     
  2.     r.append((x, y)) 

通過使用上面的product,也可以很容易地將其傳遞到其他高階函數中。同時在多個列表上同時迭代時,使用zip()函數也不錯(如需索引,還可以使用enumerator)。

濫用列表解析

列表解析能靈活創建列表,功能強大,但很容易被誤用或濫用,來看一些案例。

(1) 在不需要時過度進行列表解析

通常,我們開始沉迷于使用列表解析是為了嘗試花哨的東西,而不是真需要它。比如在簡單的情況下可以使用列表構造函數:

  1. names =["A","B","C"][x.lower() for x in names]#use this 
  2. list(map(str.lower, names)) 

(2) 在實際不存儲時使用列表解析

列表解析有助于輕松定義和創建列表,但它們始終存儲于內存中。如果不使用系統進程,將有可能損害大數量的數據。因此,使用生成器表達式是更好的選擇,因為它按需一次加載一個值。

嵌套分析也需要關注,因為這可能導致可讀性問題,知道什么時候使用它,什么時候回退到for循環上是很重要的。

喜歡布爾標志參數和全局變量

布爾是最容易學習的數據類型。在Python中,提供命名參數使工作輕松得多。但是,它們很容易產生嵌套if else塊的復雜代碼并導致可讀性問題。多個布爾存在隱藏的依賴關系,會產生一些問題。因而最好使用枚舉,而不是多布爾邏輯。Enum數據類型是可擴展的,可以確保更好的代碼結構。

全局變量在所有語言中都是麻煩的,Python也是如此。雖然有時我們確實需要使用它們,但將其誤用作傳遞或訪問數據的快捷方式可能很危險,因為它可變。

跟蹤它的狀態會很棘手,因為你永遠不知道誰可能會改變它。如果開始到處使用全局變量,命名沖突則會導致命名空間受到不好的影響。

[[335929]]

圖源:unsplash

我們都見過代碼異味,神秘的注釋、多余的字符串文字和神奇的數字也算代碼異味。在編寫注釋時,重要的是要說明“為什么”部分,因為“什么”部分應該從代碼本身得到解釋。

你得學會快速定位到代碼異味并將其去除。

 

責任編輯:趙寧寧 來源: 讀芯術
相關推薦

2011-07-27 10:37:28

IT安全安全錯誤

2015-07-07 10:03:55

2009-09-03 20:24:43

2014-02-14 13:32:29

2024-02-06 12:05:43

2011-03-21 11:02:40

2022-04-22 08:00:00

TEE安卓手機

2016-11-02 16:13:19

代碼開發技能

2023-02-19 15:20:19

2021-09-09 14:59:56

智能家居設備智能家居物聯網

2010-05-06 08:55:23

ADO.NET

2019-06-04 10:40:07

2010-09-09 14:22:58

2015-01-21 15:01:32

手游開發中小開發者

2017-11-02 06:18:26

2018-02-01 07:05:34

2020-11-03 10:09:46

機器學習論文代碼

2018-10-15 11:24:49

2016-10-28 15:52:04

數據中心數據中心效率

2025-01-10 08:00:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲3p| 日韩黄色小视频 | 国产午夜精品福利 | 亚洲精品福利视频 | 九九免费观看视频 | 欧美激情黄色 | 五月免费视频 | 国产激情视频在线 | 四虎av电影 | 亚洲精品综合一区二区 | 日韩成人免费视频 | 精品国偷自产在线 | 一区二区三区在线播放 | 日韩中文字幕在线视频观看 | 日韩精品视频在线 | 日本一区二区高清不卡 | 99久久久国产精品免费消防器 | 精品久久国产 | 高清久久 | 精品国产一区二区三区久久 | av高清| 精品九九九 | 久久精品在线播放 | 日韩精品在线播放 | 国产精品不卡一区二区三区 | 日韩在线免费观看视频 | 色网站视频 | 中文字幕久久精品 | 亚洲一区二区精品视频 | 最近最新中文字幕 | 午夜激情视频 | www.99热.com| 亚洲一区二区三区观看 | 天天艹日日干 | 一级a性色生活片久久毛片 一级特黄a大片 | 日韩中文字幕免费在线 | 天天操天天干天天爽 | 久久精品91久久久久久再现 | 久久国产精品精品国产色婷婷 | 九九精品在线 | 综合色站导航 |