stty sane_打破Sane编程规则

stty sane

打破Sane编程规则

不久前,我和我的一位同事就元编程( 如果滥用)的使用和可怕的危险进行了半智力的讨论。 他谈到了曾经在他曾经工作过的流行社交网站上在生产中使用的Python类,该类的编写方式是根据初始化的次数它将返回两个非常不同的值。 这意味着任何小的重构都有机会破坏关键软件,而几乎没有调试迹象。

这个故事启发了我探索在一篇文章中可以打破多少个约定和规则,而这正是我们在JavaScript的帮助下要做的,JavaScript 是当今所有元和非逻辑善良编程之王,但当然元编程和元类本身并不是“ bug”,并且可以在许多语言中方便地使用,但是我们的目标是做相反的事情,因此不要指望这篇文章对元编程有很好的介绍。 。

打破确定性

让我们通过串接字符串来开始一条错误的道路。 如果我们假设以下伪语句为真:

x == "hello"

您期望以下内容会导致hellohello

concat(x + x) == "hellohello"

但是这篇文章是关于违反规则的,因此让我们通过使用Object#toString并将其分配给一个函数,在每次调用时都使用机会js返回一个随机单词来降低这种确定性:

const x = { toString: () => chance.word() };

现在,以下语句在某个时间点可能成立:

(x + ' is ' + x) === "suwni is onu"

尝试运行以下几次:

突破基本算法

从自身中减去单个常量时,合理的期望是将结果设为零:

x - x = 0

但是,如果发生以下情况,我们可以违反此规则:

x - x = 0.2353256

并且在它等于另一个值之后吗? 在JavaScript中,我们可以滥用Object#valueOf来按需返回原语/数字,它本身最近在此StackOverflow问题中得到了普及。 利用此方法和Math#random ,我们不仅可以破坏一致性,而且可以期望:

录音作业

xy = 2xy = 14 ,让我们在设置员的帮助下跟踪xy 。 每当修改属性时,都会调用setter:

全方位对象

我们可以拥有一个拥有所有属性的对象吗? 并非如此,但是我们可以基于一个函数延迟加载值。 ES6通过代理让我们祝福,这使我们能够进入超级元! 除了获取器和设置器之外,代理还可以拦截与给定目标/对象的大多数可能的交互。 在这种情况下,我们要拦截对象上的所有获取,请注意,如果要使用getter,则需要了解在创建时使用Proxies进行定义的属性,而不是那么多:

上面的示例显然不是元编程的实际用例,而是在滥用其某些属性。 有很多很棒的用例,我绝对会鼓励读者尝试一下我们有趣的尝试,并亲自探索上面提出的想法。

令x-x为零

使用您喜欢的编程语言(假设受支持)来进行元数据转换有很多很好的用例, expressjs使用getter进行延迟解析查询,并且您可以使用诸如Proxies之类的功能来延迟创建后的属性,但是用我经验丰富的同事,最喜欢的语言是Haskell,请不要使用元类,除非您开发的代码像疯了似的那样,否则您最好避免上面给出的示例。

翻译自: https://hackernoon.com/breaking-the-rules-with-metaprogramming-5e3384141a8d

stty sane

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值