写于 2017.07.28前端
终于完成了公司的一个大project,这期间的收获也很是多,对于“组件化开发”有了更深一层的心得体会。web
在现在的前端开发中,“组件化”已经成为了一种流行,随之而来的各类开发框架更是把这一律念发扬光大。可是概念归概念,真正的“组件化”实践仍是有许多值得探讨的地方,其中“黑箱”是我认为最具备表明性的实践方式。今天就让咱们抛开具体的框架,直接来谈一谈“组件化开发”与“黑箱”。编程
首先引用维基百科的一段介绍:bash
基于组件的软件工程(Component-based software engineering,简称CBSE)或基于组件的开发(Component-Based Development,简称CBD)是一种软件开发范型。它是现今软件复用理论实用化的研究热点,在组件对象模型的支持下,经过复用已有的构件,软件开发者能够“即插即用”地快速构造应用软件。这样不只能够节省时间和经费,提升工做效率,并且能够产生更加规范、更加可靠的应用软件。网络
在业务的开发中,咱们每每会把一些须要复用的部分抽取出来单独封装,在须要的时候再引入使用。这样就至关于把这可复用的部分进行了“组件化”。组件化的操做可以大大减小开发量,同时一个好的组件也能有效提高稳定性。在现代化的web开发中,“组件”一般包含了逻辑功能和样式,各类各样的UI库正是最好的例子。好比一个交互复杂的下拉菜单,若是每次使用前都要从新写一套代码,将会徒增巨大的时间与人力成本。而经过UI库,只须要简单地引入,按照约定的写法引用便可,大大解放了生产力。框架
除此以外,“组件化”可以有效下降甚至消除耦合。咱们知道“牵一发而动全身”,若是一个系统各模块之间耦合太紧,一旦有个地方出现问题,排查起来将会很是困难,其后果多是灾难性的。而“组件化”的思路可以很好地避免这个问题。由于组件之间是相互独立,仅仅经过接口相联系,一旦某个组件出现问题,只须要排查这个组件的故障便可,其余组件彻底能够正常工做,或者等待这个组件修复后再工做。函数式编程
维基百科定义:函数
在程序设计中,若一个函数符合如下要求,则它可能被认为是纯函数:组件化
- 此函数在相同的输入值时,需产生相同的输出。函数的输出和输入值之外的其余隐藏信息或状态无关,也和由I/O设备产生的外部输出无关。
- 该函数不能有语义上可观察的函数反作用,诸如“触发事件”,使输出设备输出,或更改输出值之外物件的内容等。
从数学来讲,若定义一个函数:spa
f(x) = x + x
复制代码
那么无论什么时候何地任何条件,只要我输入1,那么必定会输出2:
f(1) == 2
复制代码
正是由于这种“纯”的特性,因此容许对其进行“高阶”:
f(x) = x + x
g(x) = x * 2
h(x) = x * x
h(g(f(1))) = 16
复制代码
网络上对于纯函数和函数式编程的文章很是丰富,本文就再也不赘述了。从我我的角度出发,只要能理解什么是“纯”便可。
继续引用维基百科的一句话介绍:
黑箱,指一个只知道输入输出关系而不知道内部结构的系统或设备。
生活中的不少东西均可以理解为“黑箱”,好比咱们经常使用的手机,咱们可能不知道它究竟是怎么运行的,只知道个人手指划过,它就会做出相应的动做,这时,手指划过就是“输入”,相应的动做就是“输出”。由于输入输出如此直观简单,因此手机可以被全部人轻松地使用。
咱们的工做离不开电脑,如今电脑只要插上电源开机就能用,可是人类历史上的第一台电脑,倒是要专业人士花费一番功夫才能运行的庞然大物——由于使用者须要彻底弄懂这台机器的内部运行原理,才可以正确地使用它。
上述的两个例子,其实都是为了阐述一个观点:黑箱更有利于使用。
可是,凡事都具备两面性。黑箱是牺牲了使用者对于其内部构造和原理的认识,换来的易用性。若是黑箱内部出现故障,那么使用者没法得知具体缘由,这个对于系统故障的排查很是不利。因此黑箱对于系统的稳定性、可靠性的要求很是高。
通过前文的三个小节,应该不难理解我想表达的观点。一个黑箱就是一个纯函数,抽象出来的组件理应符合这种黑箱的设定:
组件之间仅经过接口联系 一个组件能够接收多个参数,组件的嵌套和使用也是经过接口进行。组件在处理完传入的参数后,应当把结果经过接口(或者事件)传递出去,而不能直接影响外部。好比下面这个例子,通过f(x)
的处理,外部的num
并不会被改变。
num = 1
f(x) = x + 1
// f(num) => 2
// num => 1
复制代码
组件内部的运行原理不对用户开放 很容易理解,组件应当是一个黑箱,用户无需关注内部的实现原理。固然,组件应该保证高度的稳定性和可靠性。
组件的输入输出彻底肯定 结合“纯函数”和“黑箱”的概念,一个组件应当是可预测的(predictable),只有彻底肯定的输入输出才能保证。所以在工程实践中,强制规定输入的数据类型、变量名之类的内容是很是必须的。
组件化的开发还有许多最佳实践,好比涵盖了必定逻辑功能的“业务组件”也是值得探讨的地方。本文仅为我的在开发时的一些感悟,权当抛砖引玉,欢迎各位读者和我共同交流~感谢阅读~~~