|
|
51CTO旗下网站
|
|
移步端
  • 五大代码异味:你需要提高警惕了!

    代码异味是弱点或设计缺陷的标记,可能会在可读性、可保护性和可进行性上导致问题,普通是由不当做法和未采取科学的工具导致的。

    笔者:读芯术 来源:读芯术| 2020-08-01 16:40

    本文转载自公众号“读芯术”(ID:AI_Discovery)。

    表现广泛使用的警示标志,与字面意思不同,代码异味并不是指代码中要求立即注意的尾巴。相反,他反映出代码中更深层次的题材,更适合地说是代码中的裂缝,如果不加以纠正,该署题材可能会在未来导致更严重的结果。

    代码异味是弱点或设计缺陷的标记,可能会在可读性、可保护性和可进行性上导致问题,普通是由不当做法和未采取科学的工具导致的。

    Python是最盛行的语言之一,这在很大程度上与其相当容易的学习曲线和高度伪英语句法有关,而这却不难令人陷入单一的工作方法。本文中,咱们将了解一些典型的Python代码异味案例以及如何避免它们。

    可变默认参数

    在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也是如此。虽然有时我们确实需要采取它们,但将他误用作传递或访问数据的高速方式可能很危险,因为他可变。

    钉住它的状态会很难,因为你永远不知晓谁可能会改变它。如果开始到处使用全局变量,命名冲突则会导致命名空间受到不好的影响。

    五大代码异味:你需要提高警惕了

    希冀源:unsplash

    咱们都见过代码异味,地下的诠释、剩下的字符串文字和神奇之数字也算代码异味。在编辑注释时,主要的是中心说明“为什么”局部,因为“什么”局部应该从代码本身得到解释。

    你得学会快速稳定到代码异味并将他去除。

    【编纂推荐】

    1. 5分钟内搭建你的程序一个Python聊天机器人
    2. 一种简易而智能的主意:Python也能展开面部识别
    3. 你知道Python有内置必发娱乐登录吗?Python内置库SQlite3采用指南
    4. 迎战“不可能”的编码:你不知晓的Python效益
    5. 决不能只会敲代码:付出人员必备之7种基本非技术技能
    【义务编辑: 赵宁宁 TEL:(010)68476606】

    点赞 0
  • 代码  语言  Python
  • 分享:
    大家都在看
    猜你喜欢
  • 订阅专栏+更多

    大数据安全运维实战

    大数据安全运维实战

    CDH+Ambari
    共20章 | 数据陈浩

    91人口订阅学习

    实操老:Jenkins接轨交付和后续部署

    实操老:Jenkins接轨交付和后续部署

    微服务架构下的无部署
    共18章 | freshman411

    185人口订阅学习

    思科交换网络安全指南

    思科交换网络安全指南

    安全才能无忧
    共5章 | 思科小牛

    110人口订阅学习

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO官微

  • 
       
        
       
       
  •