回到PL了,准备一口气完成最后一部分。
Dan对比了OOP和functional programming。可以看到这两种范式处理问题是截然相反的思路:对于同一个“用函数去处理类”的问题,函数式编程选择去抽象函数,这样在用同一个函数处理一个输入的时候,需要把输入以不同的类型做区分;而OOP选择去抽象类,结果就是一个类下面有一大堆的方法,而不同的类下面的方法很可能都是做着类似的事情。
Double Dispatch是OOP这种思路的一个具体体现,感觉Dan讲这个就是为了黑OOP的。Double Dispatch解决的是当对象类型可能不统一时如何调用方法的问题,实际上这个问题用pattern matching或者 if else从句 + 类型判断 都可以很轻松的解决。但问题是大家可能觉得pattern matching太函数式,if else从句 + 类型判断太过程式,所以就弄出一个特别OOP的Double Dispatch。Double Dispatch确实很OOP,它不但像一般的OOP写法那样把同样的方法放到每个类里面,而且这个方法自己还要针对不同的类做分支。那这样一分支呢,其实出现了乘法的情况,就造成了次方级的分支复杂度,所以为了保持OOP的统一范式,其实是牺牲了代码的简洁性的。
后面又讲了C++中的多重继承,ruby的mixin,和java中的interface,功能依次变弱,副作用也依次减少。纯从概念上来感觉,觉得后两个都还蛮不错的。
明天写PL最后一份作业,不知道要写多久。。。