阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

降低系统复杂性,开发团队必知的一种简单方法

  • 2021-06-24
  • 本文字数:1628 字

    阅读完需:约 5 分钟

降低系统复杂性,开发团队必知的一种简单方法

在信息系统中,事情可以变得非常复杂,至少可以说是这样。像 Web 服务这样的典型信息系统,在其最基础的层次上,仅仅是一个巨大的、集成的数据管道中的一个过程。其主要工作是处理数据处理:获取数据,转换数据,并将数据传送给其他系统。但当其他系统都集中在上面时,复杂性就迅速增长。处理并减轻这种复杂性是开发团队面临的一大挑战。


通常,信息系统都是用软件编程的范式来实现的,例如,面向对象编程就是一种基于“对象”概念的方法,可以包括数据和代码。面向对象程序设计遵循无约束信息系统往往是复杂的,在这种情况下,很难对其进行理解和维护。


由于增加了系统复杂性,通常会导致开发团队的工作效率下降,因为这需要更多时间来增加系统的新功能。在生产中,难以诊断的问题经常发生。这些问题会使用户在系统表现不佳时感到沮丧,甚至更糟的是,导致系统停止工作。


面向对象编程的三个方面是复杂性的来源:


  • 对象中的数据封装

  • 类中非灵活的数据布局

  • 状态突变


在很多情况下,对象内部的数据封装是有用的。但是,在现代信息系统中,数据封装常常会产生复杂的类层次结构,而类层次结构涉及到许多与其他对象的关系。


经过多年的发展,先进设计模式和软件框架的出现减轻了这种复杂性。但基于面向对象编程的信息系统仍然趋于复杂。


如果每个数据块都用一个类来表示,就有助于工具的使用(如编辑器中的自动完成),并且在编译时会检测到诸如访问不存在的字段之类的错误。但是,类布局的僵化使得数据无法灵活访问。这对于信息系统来说是非常痛苦的。每个数据的更改都有一个不同的类表示出来。举例来说,在一个处理客户的系统中,有一个代表数据库的类的客户,以及一个代表数据处理逻辑的类的客户。类似的数据有不同的字段名,但类的泛滥无法避免。这是因为数据“锁定”到了类中。


允许对象的状态发生突变这一事实是多线程信息系统中另一复杂因素。为避免数据被并发修改,并确保对象的状态保持有效,需要引入各种锁机制,使代码难以编写和维护。有时候,在向第三方库传递数据之前,我们会使用防御性复制策略来确保我们的数据没有被修改。添加锁机制或防御副本策略使得我们的代码更复杂,并且性能更差。


面向数据的编程(Data-Oriented Programming,DOP)是开发者为了降低信息系统复杂性而遵循的一组最佳实践。


DOP 背后的理念是,通过将数据作为“一等公民”来简化信息系统的设计和实施。DOP 引导我们把代码从数据中分离出来,以不可变的通用数据结构来表示数据,而非围绕数据和代码相结合的对象来设计信息系统。所以,在 DOP 中,开发者可以像在任何程序中一样灵活、稳定地操作数据,而不需要操作数字或字符串。


DOP 通过遵循三个核心原则,降低了系统的复杂性:


  • 将代码与数据分离

  • 用通用数据结构表示数据

  • 保持数据不可变



在面向对象的编程语言中遵循 DOP 的一个可能的方法是,在静态类方法中编写接收其操作数据作为解释参数的代码。


把代码从数据中分离出来,从而实现关注点分离,常常会使类的层次结构变得不那么复杂:与其用一个由涉及许多关系的实体组成的类图来设计一个系统,不如由两个不相连的更简单的子系统组成:一个代码子系统和一个数据子系统。


在使用诸如哈希图和列表这样的通用数据结构来表示数据时,数据访问是灵活的,这样可以减少系统中类的数量。


如果开发者需要在多线程环境中编写代码,那么保持数据的不变将使他们更加顺利。不需要使用锁机制或防御性复制来保护代码,数据的有效性就有了保障。


DOP 原则既适用于面向对象的编程语言和函数式编程语言。但是,向 DOP 过渡对面向对象的开发者来说可能需要比函数式编程开发者更多的思维转变,因为 DOP 将让我们摆脱封装有状态类中数据的习惯。


作者介绍:


Yehonathan Sharvit,自 2000 年以来一直担任软件工程师,使用 C++、Java、Ruby、JavaScript、Clojure 和 ClojureScript 编程。他目前在 CyCognito 担任软件架构师,为大规模的数据管道建立软件基础设施。


原文链接:


https://dev.to/viebel/a-simple-way-to-reducing-complexity-of-information-systems-2d22

2021-06-24 16:252379
用户头像

发布了 525 篇内容, 共 240.2 次阅读, 收获喜欢 1543 次。

关注

评论

发布
暂无评论
发现更多内容

代码检查规则:Java语言案例详解

百度开发者中心

Java 最佳实践 案例分享 代码检查规则

手把手带你玩转 JS | 引航计划|大前端

三掌柜

大前端 引航计划 引航 技术专题合集

引航计划|大前端|优质合集手把手带你玩转移动开发

三掌柜

大前端 引航计划 引航

🚄【Redis基础指南】推荐给大家的「主从模式」+「缓存穿透」的学习小贴士(提炼优化)

洛神灬殇

redis Redis缓存穿透 10月月更

解读世界互联网大会新品——智能运维2.0,管运提效再升级

浪潮云

云计算

携程 x StarRocks:高效支持高并发查询,大幅降低人力和硬件成本

StarRocks

大数据 数据分析 高并发 StarRocks

软件架构思考

轻口味

android 架构设计原则 10月月更

分享一套golang实现的 IM 系统,一键部署服务端,客户端SDK全平台支持,可以替代IM云服务

OpenIM

从用户关系看产品发展

石云升

产品经理 产品思维 产品分析 10月月更

这本笔记!仅需16个小时,让你像阿里P7一样掌握Spring源码解析

Java 架构 面试 程序人生 编程语言

运用贝塞尔曲线绘制笔锋效果

ZEGO即构

音视频 笔锋实践 贝塞尔曲线

机器人自主学习新进展,百度飞桨发布四足机器人控制强化学习新算法

百度大脑

人工智能 飞桨

认识流媒体协议,从 RTSP 协议解析开始!

声网

协议 RTSP

记不住源码?掌握这套方法,Alibaba必有你一席之地!

Java 架构 面试 程序人生 编程语言

MyCAT、DRDS、TIDB、TDSQL、TBase 在实现分布式事务时的区别及其各自的优势?

腾讯云数据库

数据库 tdsql

出自阿里P8之手的这份微服务架构实践手册,为何能霸榜GitHub一周

进击的王小二

Java 架构 分布式 微服务

流计算 Oceanus 限量1元秒杀,立省2000元

腾讯云大数据

Python代码阅读(第34篇):列表元素出现频率字典

Felix

Python 编程 Code Programing 阅读代码

中国移动5G消息开发者社区 | 主题沙龙直播预约:5G消息在文旅场景的应用探讨

5G消息

5G 5G消息 中国移动5G rcs

必须得会的汽车ECU研发基础--ECU是什么1

SOA开发者

数字化加速时刻,天津港解锁了“天工开物”新篇

脑极体

盘盘 DevOps“衍生品”: DevSecOps、NoOps、AIOps

SoFlu软件机器人

手把手教你使用Studio Lite + Digtal car!助力智能汽车场景、轻应用开发更轻松!

SOA开发者

Hold the Door!区块链底层平台流控分析

趣链科技

区块链 流量控制 底层平台

一文读懂 OceanBase 数据库的SLog日志

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 社区版 OceanBase 数据库大赛

使用AI在原神里自动钓鱼,扫描Git仓库泄露的密码 【蛮三刀酱的Github周刊第三期】

Zhendong

GitHub

必须得会的汽车ECU研发基础—底层软件介绍4

SOA开发者

自动驾驶混战,剑气二宗谁能笑傲江湖?

脑极体

都2021年了,还在算法上折跟头?这本《字节跳动面试必问算法秘籍》送给你!

Java 架构 面试 程序人生 编程语言

华为宣布启动“开源雨林”计划,与社区伙伴共迎开源挑战

号角声响!联想图像发起“百家百试”项目第二期,诠释“真国货之光”

降低系统复杂性,开发团队必知的一种简单方法_架构_Yehonathan Sharvit_InfoQ精选文章