知识卡片
把"操作本身"变成可以传递的对象,是两种编程范式相互借鉴、而非互相取代的例子
内容
面向对象语言里的”代理”(Eiffel的agent、C#的delegate,本质和闭包/Lambda是同一类机制)把一个具体操作(某个类的某个方法)包装成一个可以像普通对象一样被传递、存储、延后调用的东西——这原本是函数式编程”把函数当一等公民”这个理念在面向对象世界里的翻版。它的实际价值在事件驱动场景里很直观:给一个按钮绑定”点击后执行某段逻辑”,不需要事先定义一个专门的接口和实现类,直接把这段逻辑打包成一个代理对象传过去就行。这提示一个看待编程范式演进的角度:范式之间与其说是竞争关系,不如说是互相”偷师”——面向对象语言吸收了函数式的”操作即数据”,反过来让原本擅长按类型组织复杂系统的面向对象,也具备了函数式那种灵活组合零散行为的能力。
参考来源
《架构之美》第13章《软件架构:面向对象与面向函数》