“猫” ,一个值得加星标的公众号
花下猫语:众所周知, 是一门动态类型语言,这也是造成它性能较慢的一大原因。如今 也引入了一些类型检查的辅助,那么,类型检查对于提升 代码健壮性,有没有帮助呢?(既然这么问了,那肯定是有的……)
作者:无与童比(//JS, 全干(栈)工程师)
原文:
图 | 《借东西的小人阿莉埃蒂》剧照
0x00 前言
本文是《提升你的 项目代码健壮性和性能》系列的第一篇文章。
本系列仅仅从笔者的项目经历来讲解一些提升代码健壮性的姿势和小技巧。
本文目录如下:
0x00 前言 : section
0x01 Gradual Typing : section
静态类型 VS 动态类型 : section
Gradual Typing = 静态类型 + 动态类型 : section
0x02 Python Typing 实战 - MyPY : section
MyPy : section
快速入门 : section
0x03 常见问题 : section
如何忽略 mypy 警告 : section
循环导入 : section
0x04 Typing Anotation 项目最佳实践 : section
0xEE 参考 : section
PEP : section
扩展文章 : section
当我刚知道 要添加类型的时候,我的内心是拒绝的。
但是,尝试了俩个疗程之后,腰也不疼了,腿也不疼了,走起路来都有劲了,嗯,真香。
为啥需要 Type ?
因为软件开发需要协作,动态类型给人极大的灵活性,写的时候很爽,但如果解放了双手,撸起袖子一通写,自己写起来爽了,自己重构的时候或者其他人来看代码的时候,头发就会加速掉落。
加了 能解决这个问题嘛?不能,但适当的使用可以极大的提升代码的健壮性。
在如下的场景中, 可以发挥作用
在程序运行前进行类型检查
提供 信息,当然,这带来的另一个巨大的优点就是让 IDE 可以分析出函数的参数类型以及返回值
这样大大减少了代码量上来之后的类型检查不足带来的返工问题。
0x01
在你刚入门一门编程语言的时候,我们常常说,Java 是强类型(静态类型)语言, 是弱类型(动态类型)语言
从这两位诞生开始,静态类型和动态类型就一直进行旷日持久的圣战。
然而,而现在的发展趋势是:
什么是 ?
允许开发者仅在程序的部分地区使用 /Type. 即,既不是黑猫(静态), 也不是白猫(动态),从而诞生了熊猫(动静结合)。
话说回来,要知道为什么这么搞,首先要知道动态类型和静态类型会给程序开发带来什么优势和劣势。
静态类型 VS 动态类型
静态类型的语言,比如在写 Java 的时候,如果你把一个 int 赋值给了 的变量,IDE 会通过类型检查器立即报错并告诉你,你这个值赋值错啦。这个就是 Java 程序的检查阶段。
动态类型的语言,比如在写 的时候,如果不用一些额外的手段,这种低级的错误,并不会在检查时爆出来,只会在运行时爆出来。如果线上还是出这个问题,就蛋疼了。
为了进行友好的讨论,本人将精分成 和 , 通过两人对话的方式,来讨论类型。
你在写 的时候,如果不用一些额外的手段,这种低级的错误,并不会在检查时爆出来,只会在运行时爆出来。
如果线上还是出这个问题,就蛋疼了。我这个类型检查可以在使用 IDE 的时候给我分析出方法参数的类型和返回值。所谓『上医治未病,中医治已病,下医治大病』, 防范于未然,善之善者也。
可以通过提升程序员的素质来解决这个问题,或者让他们长点脑子,别特么在这种低级错误上犯错误。
写测试来提升测试代码的代码覆盖率(这个我会在本系列的第二篇文章里深入讲解)来解决这个问题
看看写的代码检查时出现问题,我完全可以把代码拖到 里面跑一遍。这可不仅仅能解决类型不正确带来的问题,还能快速解决代码的逻辑问题
静态类型确实以较低的成本解决了这种类型的问题,不是么?
并且,如果我其中一小块功能进行了修改,我总不能每次都跑 吧?我也不能因为想检查一下类型这种小操作就写测试代码覆盖一下?
每次改代码的时候,又不是改一大推,你是小部分改的,能有多少项目是海量海量改?高内聚,低耦合,模块化开发。
好的代码是重构出来的,修改你的类型来让类型检查器通过。你的代码会被更好的组织起来。
我大 Java 就是面向重构的语言!我有 的 IDE, 重构代码我怕谁
每次改代码的时候,又不是改一大推,你是小部分改的。这话你说的没错,我也能用啊,因为代码总是一小部分一小部分改的,所以,改完了跑一下 就结了。
好的代码是重构出来的,修改你的类型来让类型检查器通过。你的代码会被更好的组织起来。这话你说的也没错,可我重构的时候没有写测试就重构,是不是有点莽撞?写了测试了,我还要花时间在类型检查器上,不啰嗦么?
我也有 的 IDE, 重构代码我又不是不能重构。
需求变更上来了,结果往往会出现,你本来是想专注于业务逻辑的更改的,但最后变成了大型为了让类型检查器通过类型检查而艰苦奋斗的现场, 我这个场景直接传 int/str/ 字典 / 传对象就很方便,你非要让我写四个函数来 方法。
虽然说,好代码确实可以通过重构出来,但动态语言表达能力强呀,你 Java 啰啰嗦嗦 put 写了半天,我 一个 Dict 一把梭,看起来,清晰,自然改起来方便。
再比如说,
上面有一道题目,叫做最长连续 1
Input 是 [1,1,0,1,1,1] 是 3
我们尝试用 来看下
def find_max_consecutive_ones(num):
return max(map(lambda x: len(x), ''.join([str(num) for num in nums]).split('0')))
我们尝试用 Java 来看下
public class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int result = 0;
int tmp = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0)
tmp = 0;
else {
tmp += 1;
result = Math.max(tmp, result);
}
}
return result;
}
}
Java 创始人的头发
创始人的头发
旁白君:有道是,梅须逊雪三分白,雪却输梅一段香。
= 静态类型 + 动态类型
就是在动态语言的基础上,增加了可选的类型声明 (Type )
这对于我这种人是福音,
对于我个人而言,我是希望 是有类型的
作为某段程序的开发者和维护者,我可以提升我重构的速度。
作为某段程序的调用方,可以快速的知道我调用后得到的东西究竟是什么。
加入IP合伙人(站长加盟) | 全面包装你的品牌,搭建一个全自动交付的网赚资源独立站 | 晴天实测8个月运营已稳定月入3W+
限时特惠:本站每日持续更新海量内部创业教程,一年会员只需98元,全站资源免费无限制下载点击查看会员权益
站长微信: qtw123cn
