【The Clean Code Blog】Functional Duplications

Original

http://blog.cleancoder.com/uncle-bob/2021/10/28/functional-duplication.html

story

马丁老爷子又在捣鼓他的《太空大战》(space war)游戏。玩着玩着游戏挂了,初步排查是游戏出现了两个在地理位置上完全一致的基地(base)。按理说不应该出现这种情况,因为基地不会移动,只要基地在创建的时候没有地址冲突,以后不管怎么玩都不应该有。那么问题出现在哪里呢?

functional programming

基地的位置虽然是不可变的,但是基地的属性其实是会变化的,比如这个基地的物资,当有怪物去偷盗,物资就会减少。可是物资属性的变化怎么就导致了位置属性的变化呢?
函数编程的锅。马丁老爷子用的是一个只支持函数式编程的语言。每当基地有任何属性变更的时候,就会重新创建新的基地,用于取代原来的基地,一不小心创建了一个新的基地但是原来的基地没有销毁。于是就出现了两个或者多个位置相同的基地。

lessons learnt

函数式编程的好处我就不用再复述了。但是不管怎么吹,函数式编程也不是万能的。函数式编程推荐使用不可变对象,这在大多数情况下是有效的,但是并不是所有的情况都合适,尤其是对象本身就应该是变化的。比如上个例子中的基地对象,基地对象本来模拟的就是一个变化的基地,每次创建新基地对象的目的就是替换掉原来的基地对象,那这样的不可变对象又有什么意义呢?除非原来的对象还有存在的意义,否则就不应该创建新的对象。也就是不可变对象也有自己的适用场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值