热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

抽象泄漏(LeakyAbstractions)

翻译&编写:JasmineXie在5月23日OnlineMeetupWithEvanYou的问答环节中,Evan在说到lowcode时提到一个概念——“

翻译 & 编写:Jasmine Xie

在 5 月 23 日 Online Meetup With Evan You 的问答环节中,Evan 在说到 low code 时提到一个概念 —— “abstraction leak”. 在前端开发过程中接触过很多内部平台和工具,包括 low code 建站平台、组件库、框架和二次封装的元框架。在这个过程中会发现一个比较普遍的现象:

  • 即便文档覆盖相对比较全面,开发者在实现或排查某一些特定的问题时仍然不可避免地需要阅读对方平台或库的源码,或了解更底层的原理。

  • 一些特定的场景下,平台或库索提供的接口、界面或规范不再适用;它们的抽象层次不再能满足业务场景要求。

但是往往这些痛点并不是系统本身的管理或设计缺陷;更多的是某些应用场景下的“抽象泄漏”导致。本文翻译多篇相关英文文章,并在此基础上整合、提炼,就系统设计中的抽象层级和抽象泄漏现象进行讨论。


这篇文章将会介绍:

  • 什么是抽象泄漏法则

  • 抽象机制如何“泄漏”

  • 开发者如何应对抽象泄漏

为了避免翻译歧义,部分概念在特定场景下还会保留英文表述:

英文翻译
abstraction抽象、抽象层级,名词(在某种意义上也包含“封装”的意思)
leak泄漏、漏洞、漏出
interface接口(为更高一个抽象层级开发者、调用者、消费者、使用者所展示的“界面”)
consistency一致性;连贯、前后一致


引言

现在环顾四周,我们会发现日常生活中常常会用到一些非常复杂的系统:智能手机、计算机、打印机、汽车、电视、烤面包机…… 虽然我们自己很难自行从零制造这样的一个机器,但是不论这些设备或系统多么复杂,我们都可以正常使用它们来完成日常所需的工作。

这个小小的奇迹归功于我们称为 “抽象”的概念(译者:其中也离不开 encapsulation, 即“封装”)。抽象是一种设计概念,它用简洁的用户界面 (interface) 屏蔽了复杂的细节,使得开发者不再需要关注这些细节就可以完成工作。抽象 (abstraction) 在每个软件程序中都起着核心的作用,这样的设计向站在更高抽象层级的调用者和使用者隐藏或屏蔽了 API 背后的实现细节。但这些抽象层级常常也会发生“泄漏”。

“抽象”是什么?

用一个实际例子解释抽象和封装——我们可以在浏览器的地址栏中输入网址来访问网站。在大部分前端开发场景中我们不需要了解浏览器如何执行 DNS 查找找到正确的网站,也不需要了解设备如何与网络服务器进行 TCP 握手,也常常不需要知道网站如何渲染一个 DOM. 这个过程非常详细、复杂,而很庆幸浏览器底层的逻辑帮我们完成了这些操作,我们不需要实现这些能力,在大部分场景中也不需要关心这些实现。

在计算机软件设计中,随着软件本身的迭代、软件系统体积和复杂度增加,我们会不断构建新的抽象层级,并将其添加到已有的抽象层级中、丰富已有的抽象和封装。做任何设计都是思考如何创建正确合理的抽象层级的过程。一个设计合理的抽象层次会向上层暴露所有重要的和必要的实现,但同时隐藏所有不必要的细节。一个合理的抽象层次会掌握好控制度复杂度之间的平衡。一个合理的抽象层次可以轻松把它调用者的行为或执行任务映射到自身方法或属性上。如果抽象层次设计得当,它会让人感觉使用它很直接、便利,合乎常规逻辑。

To design something — anything — is to think about creating the right abstraction.

在软件工程领域中,对抽象层级设计的关注会更加突出。在编写任何的代码时都需要考虑易用性和可维护性,一个开发者需要思考如何向其他代码隐藏这部分的内部原理,又需要思考如何让使用者顺利地消费这段代码的功能。抽象设计这个庞大的工程中至关重要的环节包括我们耳熟能详的设计模式、命名、单元测试等等,这些看似关联不密切的关注点都有一个共同的目标——在开发者设计抽象层时,帮助我们做出正确的决策,并保持其效果可控。

因为有“抽象” (abstraction) 设计的存在,我们可以在 HTML 文档中直接编写


推荐阅读
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
author-avatar
另df外一个自我_198
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有