- 原文地址: Abstraction & Composition
- 原文作者: Eric Elliott
- 译文出自: 掘金翻译计划
- 本文永久链接: github.com/xitu/gold-m…
- 译者: Xekin-FE
- 校对者: weibinzhu , Junkai Liu
备注:本篇本章是“组合式软件编程”中的一部分,从基础开始学习 JavaScript ES6+ 的函数式编程和组合软件技术。更多的内容请保持关注我们。 < 上一章节 | << 返回第一章节 | 下一章节 >
随着我在程序开发中愈加成熟,我愈加重视底层的原理 —— 这是在我还是个初学者时所被我所忽视的,但现在随着开发经验越来越丰富,这些基础的原理也具有了深厚的意义。
“在空手道中,黑带的骄傲象征是从黑带穿到褪色而变为白带,这象征着回到了最初的状态” ~ John Maeda, “简化的法则:设计,技术,商业,生活”
在 Google 词典中写着,抽象是“独立于事物的关联、属性或具体附属物来考虑事物的过程”。
抽象的词源来自中世纪拉丁语 abstractus ,意为“拽开、抽离”。我喜欢这样的解读。抽象意味着移除某些东西 —— 但到底我们移除掉了什么,又为了什么目的呢?
有时我喜欢将词汇翻译成其他语言然后再把它们翻译回英文,站在不同的角度去思考我们在英语中没有想到过的其他联想。当我把“抽象”一词翻译为意第绪语再翻译回英语时,结果意思是“心不在焉的”,我也喜欢这样的答案。一个心不在焉的人在使用自动驾驶仪的时候,不会去主动思考驾驶仪在做什么...只是这样做。
抽象让我们得以安全的使用自动驾驶仪。所有软件都是自动化的。如果你有足够的时间,你在电脑上做的任何事情也都可以用纸,墨水,再加上信鸽来做。软件就只是把这些手动做起来十分耗时的所有细节自动化处理了。
所有软件都是抽象的,在我们获利的同时,也将所有的辛勤工作以及那些无意识的细节埋藏。
软件的运行过程大多都是不停的重复着。如果在问题分解阶段,我们决定一遍又一遍地重复实现相同的功能,将会造成大量不必要的工作。至少这样做肯定是愚蠢的。在许多情况下,这都是不切实际的。
相反,我们可以通过编写一些对应的组件(像是函数、模块、类等等),再给个名称作为标识,然后我们就可以在需要使用它们的地方再去复用它们。
分解的过程就是抽象的过程。成功的抽象也就意味着结果是一组可以单独使用并且也可以重新组合的组件。由此我们了解了一个非常重要的软件架构原则:
软件解决方案应该可以被分解为其组件部分,并且可以重新组合成为新的解决方案,而无需更改内部的组件实现细节。
抽象是一种简化的行为
“简化就是将显而易见的东西减去并增添有意义的东西” ~ John Maeda, “简化的法则:设计,技术,商业,生活”
抽象过程主要有两个组成部分:
- 泛化 是在重复模式中找到相似的(并显而易见的)功能并通过抽象来将它们隐藏的一个过程。
- 特殊化 是在使用抽象时,为那些 只在某处不同 (且有其特殊意义的)提供用例。
抽象是一个提取概念本质的过程。通过发现不同领域中不同问题的共同点,我们可以认识到如果跨出自己的视界从不同的角度去看待问题。当我们看到问题的本质时,我们就可以找出一个好的解决方案同时它也可以适用于许多其他问题。如果我们将这样的思想应用在代码上,我们就可以从根本上降低应用程序的复杂性。