当前位置: 首页 > Web前端 > HTML5

反驳《我不是很懂 Node.js 社区的 DRY 文化》

时间:2023-04-05 01:40:49 HTML5

今天群里有人讨论方老师的文章《我不是很懂 Node.js 社区的 DRY 文化》。我也看了一遍。槽点太多,不知道怎么写。方老师分析了几个最依赖的npm包,每个都不到百行代码。比如is-odd,每周300万次下载,却只有5行核心代码。而且它依赖于is-number库,每周下载量达1000万次。我得出一个结论:有那么多JS程序员不知道怎么判断奇数。只要markdown写得漂亮,就能让JS程序员着迷。1+'1'的问题一直困扰着JS程序员。是不是应该写一个add()库来解决这个问题。首先第一项:原来有那么多JS程序员不会判断奇数。其实不光是JS程序员,大部分程序员都不会准确判断奇数。你写constisOdd=x=>x%2===1;这是小学的知识,除以2,如果不能整除(有余数),那就是奇数。只是因为知识点很简单,给人一种任何程序员都会判断的错觉。现在我们假设用户传入的参数一定是数字。尽管如此,这个函数还是不能正确判断奇数。因为-3%2是-1。有人说应该这样写:constisOdd=x=>x%2!==0;任何小数都将被判断为奇数。更不用说浮点数中的怪物NaN和Infinity了。那么直接给NaN和Infinity返回false是不是就对了,然后加上-1判断:constisOdd=x=>x%2===1||x%2===-1;也模式9007199254740991%2===19007199254740992%2===09007199254740993%2===09007199254740994%2===09007199254740995%2===0//为什么从17409990全部开始7因为这个值是Number.MAX_SAFE_INTEGER,也就是2**53-1。那回头看看is-odd库是怎么实现的?!!(~~i&1)~~i用于将字符串转为整数,与1进行按位与运算,判断最后一位是1还是0。可惜也有问题。?因为当字符串转换为整数时精度会丢失。如果有人想做轮子,可以写一个better-is-odd,可以判断字符串'9007199254740995'为奇数,但是对9007199254740995这个数字却无能为力。等待proposal-bigint提案.不仅仅是判断奇数,单纯判断一个字符串是不是数字,难倒一大批JS程序员(其他语言程序员也一样)。is-number库的核心代码不到10行。方老师只关注了这个库的源码,但是看了他的测试用例,我们决定使用这个库。作者为这10行代码写了108行测试用例,以保证这个函数的功能正确。我在上一篇文章百行代码,千行测试中写道:不要重新发明轮子。很多大牛都推荐我们“造轮子”,但是造轮子的目的是为了学习,而不是为了使用,尤其不是为了在生产环境中使用。造一个轮子很简单,但是如果硬要自己装轮子在车上行驶,那肯定是有安全隐患的。很多人会说,既然自己能写出来,为什么还要用别人的呢?有人认为一些很小的功能不需要用别人的。很多人会以此来吐槽leftpad模块,但平心而论,你能自己使用这个无bug且高性能的leftpad功能吗?我们项目组前几天碰到过一次。其实功能很简单。分享一个页面,使用url携带参数。比如:aaa.html?id=123456看似很简单的需求,但是自己写一个却并不容易。找到“=”字符,然后截取下面的?split("="),然后转到第二个...不到10行代码。第一次分享到微信是正常的。如果转发分享的页面再次分享,则页面错误。因为微信会在url后面加一些额外的参数,同样的,不同的平台加参数的形式也会不同,有的加&,有的加#,不管加什么都会解析失败。归根结底是我们写的分析函数有bug,重新造了一个有bug的轮子。解决方法是:npmiqssparrow虽小,五脏俱全。看github源码,“一百行代码,一千行测试”。绝对比自己写代码靠谱。我写这篇文章不是为了推荐这个qs库,而是告诉大家不要重复造轮子,在生产环境中使用。通常,每个人都为学习制造更多的轮子。回头看看is-number库,不仅有100多行的测试用例,还有目录benchmark。我这里没有统计代码,光看文件数量就有10多个。也就是说,作者不仅保证这个函数的运行结果没有问题,还保证这个函数的性能。我们为什么要用这个库,因为作者为了保证质量,他10行代码写了几百行其他代码。作者9天前也发布了新版本,20天前优化了字符串转数字的性能。再看方老师说的第二条:只要markdown写的漂亮,JS程序员都能着迷。这些包的markdown代码远远多于JS代码,也许他们的markdown更值得我们学习。Redux号称一百行代码,一千行文档,一共导出了5个函数。而且markdown一定要写的漂亮,不然不知道下面代码输出的是什么isOdd('12')isOdd('one')isOdd('①')isOdd('Odd')第三项:1+'1'的问题一直困扰着JS程序员,是否应该写一个add()库来解决这个问题?我是认真的!因为npm已经有add库了,这个名字是别人拿的,所以只能换个名字来调用了。虽然是小众图书馆,但每周有近万次下载。这个库在JavaScript中实现了用于浮点加法的Rump-Ogita-Oishi算法。例如,有以下浮点数:constnums=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7]添加这些数字到nums。减少((a,b)=>a+b);结果是:15.29999999999999并使用Rump-Ogita-Oishi算法:add(nums)===15.3查看基准测试(OSX10.9.4、2GHzCorei7、8GBDDR31600MhzRAM):add-precisex1,400,712ops/sec±3.31%(89次运行采样)add-dumbx24,268,034ops/sec±3.96%(80次运行采样)nativex94,957,251ops/sec(±85.94%运行采样)native比add-precise快约67.8倍最后,我重申一般:不要重复自己。