知识卡片

新增操作和新增类型,对函数式风格和面向对象风格来说,扩展难度是不对称的

专业/工作

内容

函数式编程用”组合子”搭积木的方式构建系统(用原子成分递归组合出复杂结构),最大的优势是新增一种组合方式几乎不需要动老代码;但反过来,一旦要给已有的每一种成分类型都新增一个操作(比如给所有”布丁”类型都加一个”计算卡路里”的函数),就必须逐一为每种类型补齐这个新操作,容易产生重复。面向对象用继承把公共特性收拢到最合适的层级,新增一个操作往往只需要在基类加一个方法、子类按需重写,但反过来新增一种类型时,要考虑好它该插入继承树的哪个位置。这提示一个选架构范式时更精确的判断维度:与其笼统地问”哪种风格更好扩展”,不如先问清楚”这个系统未来更可能是新增数据类型,还是新增跨类型的操作”,这个问题的答案往往比范式偏好更能决定选择。

参考来源

《架构之美》第13章《软件架构:面向对象与面向函数》