EM:无论何种代码复用技术(类继承,或是原型组合,或是其它),目标任务都是生成新的对象实例,实现软件功能的开发。
在 JavaScript中,原型继承有以下几种应用表现:
-
原型链(concatenative inheritance),
-
原型委托(prototype delegation),
-
功能继承/闭包(functional inheritance),
-
对象构成(object composition);
第四,函数式编程(FP)和面向对象编程(OO)各自优点和不足是什么?
FP和OOP作为完成编程这个「任务」的「工具」,有各自的适用和优点与不足。
OOP的优点
直观,对象由数据和方法组成的概念很容易理解,也容易解释方法调用的意义。OOP倾向于使用命令式风格,而不是声明式风格,命令式风格读起来像是一组供计算机遵循的直接指令,很形象。
OOP的缺点
OOP通常依赖于共享状态。对象和行为通常被绑定在同一个实体上,可以被任意数量的顺序不确定的函数随机访问,这可能会导致不希望的行为,比如竞态事件(race conditions)。
FP的优点
使用 纯函数作为功能单元,程序员可以避免任何共享状态或副作用 [em] ,从而消除多个功能竞争相同资源所导致的bug。与OOP相比,FP的大功能的复合方式,例如所谓的无参数风格(point-free ),大大简化复杂功能的组合方式,和改善代码可重用方式。
EM:使用和不使用共享状态都是技术,重点是那个「功能的实现」的任务;就是为什么一定要使用中间状态?「纯函数」和「类对象」是两种编程范式最大「工具」区别。
另外,FP 倾向于 声明式和符号指代(denotational)的功能命名风格 [em] ,FP不倾向通过详细说明功能操作的步骤,而是关注「功能要做什么」。这为重构和性能优化留下了巨大的空间,它甚至允许你用更高效的算法替换整个旧算法,而代码更改很少(例如,memoize,或者用惰性求值来代替eager 求值)。
EM:就是更倾向使用名词, 而不是动词表达「功能」
EM:两种工具思想区别在于,FP是关注功能的形式和逻辑关系,OOP关于功能实现的数据的处理
使用纯函数实现的计算功能也很容易移植到多处理器,或分布式计算集群环境上,而不用担心线程资源冲突、竞态事件(race conditions)等。
FP的缺点
过度使用FP风格的代码(例如大量使用无参数式风格分割和组合 大功能 )可能会降低代码可读性,因为生成的代码通常很抽象,它简洁且不够具体。
与函数式编程相比,习惯OOP和命令式编程的人会更多,更深厚,因此,即使是函数式编程中的常见习惯用法也会让新团队成员感到困惑。
另外,FP的学习曲线要比OOP陡峭得多,因为OOP的广泛流行使得OOP的语言和学习材料变得更加对话化,而FP的语言则更加学术化和形式化。
总的来说,OOP使用共享状态「 实现复合功 」能是有害的,虽然它很直观;高度使用OOP的codebase比较“顽固”和脆弱,难改又错误百出;FP除了没有OOP的这些不足外,程序比较易读易维护,只是适应FP风格需要一些时间。
第五,在什么场景下最适合使用 类继承?
几乎没有适用的场景, 类继承能免则免,除非只有一层的继承;
第六,在什么场景下最适合使用 原型继承?
在JS中,当需要复用代码时都几乎可以使用原型继承,当然包括不适用函数式复用(FP也提供了复用机制)的时候。JS中有三类的原型继承:
-
第一,委托(Delegation),例如使用原型链;
-
第二,接合(Concatenative),例如mixins, `Object.assign()`;
-
第三,创建新(Functional),例如闭包;
每一类 原型继承都有各自适用场景,不过,它们都归结为 构成(composition)复用,是一种 has-a or uses-a or can-do 的关系,与类继承的 is-a关系相反。

(编辑:鹰潭站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|