Original
http://blog.cleancoder.com/uncle-bob/2021/10/28/functional-duplication.html
story
马丁老爷子又在捣鼓他的《太空大战》(space war)游戏。玩着玩着游戏挂了,初步排查是游戏出现了两个在地理位置上完全一致的基地(base)。按理说不应该出现这种情况,因为基地不会移动,只要基地在创建的时候没有地址冲突,以后不管怎么玩都不应该有。那么问题出现在哪里呢?
functional programming
基地的位置虽然是不可变的,但是基地的属性其实是会变化的,比如这个基地的物资,当有怪物去偷盗,物资就会减少。可是物资属性的变化怎么就导致了位置属性的变化呢?
函数编程的锅。马丁老爷子用的是一个只支持函数式编程的语言。每当基地有任何属性变更的时候,就会重新创建新的基地,用于取代原来的基地,一不小心创建了一个新的基地但是原来的基地没有销毁。于是就出现了两个或者多个位置相同的基地。
lessons learnt
函数式编程的好处我就不用再复述了。但是不管怎么吹,函数式编程也不是万能的。函数式编程推荐使用不可变对象,这在大多数情况下是有效的,但是并不是所有的情况都合适,尤其是对象本身就应该是变化的。比如上个例子中的基地对象,基地对象本来模拟的就是一个变化的基地,每次创建新基地对象的目的就是替换掉原来的基地对象,那这样的不可变对象又有什么意义呢?除非原来的对象还有存在的意义,否则就不应该创建新的对象。也就是不可变对象也有自己的适用场景。