降低信息系统复杂性的简单方法

2025-06-07

降低信息系统复杂性的简单方法

说到信息系统,事情至少可以变得相当复杂。像 Web 服务这样的典型信息系统,从最基本的层面来说,只是庞大集成数据管道中的一个进程。它主要处理数据:获取数据、转换数据并将其传递给其他系统。但随着其他系统在其之上不断叠加,复杂性迅速增加。管理和降低这种复杂性就成了开发团队面临的重大挑战。

传统上,信息系统是使用面向对象编程等软件编程范式实现的,这种范式基于“对象”的概念,对象可以包含数据和代码。不受约束地遵循面向对象编程的信息系统往往很复杂,难以理解和维护。

系统复杂性的增加往往会降低开发团队的开发速度,因为向系统添加新功能需要更多时间。难以诊断的问题在生产环境中更加频繁地出现。这些问题要么会导致用户在系统运行不符合预期时感到沮丧,要么更糟的是,会导致系统宕机。

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

  1. 对象中的数据封装
  2. 类中的非灵活数据布局
  3. 状态突变

在许多情况下,将数据封装在对象内部是有益的。然而,在现代信息系统的背景下,数据封装往往会创建复杂的类层次结构,其中对象与其他对象之间存在多种关系。

多年来,先进的设计模式和软件框架的发明已经减轻了这种复杂性。但是,使用面向对象编程构建的信息系统仍然很复杂。

通过类来表示每条数据有助于工具的使用(例如,编辑器中的自动完成功能),并且访问不存在的字段等错误在编译时即可检测到。然而,类布局的僵化使得数据访问不够灵活。在信息系统环境中,这很麻烦:每一种数据变体都由不同的类表示。例如,在一个处理客户的系统中,有一个类表示数据库所见的客户,另一个类表示数据操作逻辑所见的客户。数据相似但字段名称不同,但类的激增是不可避免的。原因是数据被“锁定”在类中。

在多线程信息系统中,对象的状态可以被修改是另一个复杂性的来源。为了防止数据被并发修改并确保对象状态有效,引入各种锁定机制使得代码更难编写和维护。有时,在将数据传递给第三方库的方法之前,我们会使用防御性复制策略来确保数据不被修改。添加锁定机制或防御性复制策略会使我们的代码更加复杂,性能更低。面向数据
编程 (DOP) 是开发人员遵循的一套最佳实践,旨在降低信息系统的复杂性。

DOP 背后的理念是通过将数据视为“一等公民”来简化信息系统的设计和实现。DOP 并非围绕结合数据和代码的对象来设计信息系统,而是引导我们将代码与数据分离,并使用不可变的通用数据结构来表示数据。因此,在 DOP 中,开发人员可以像在任何程序中操作数字或字符串一样灵活而从容地操作数据。DOP
通过遵循三个核心原则来降低系统复杂性:

  1. 将代码与数据分离
  2. 使用通用数据结构表示数据
  3. 保持数据不变

替代文本

在面向对象编程语言中遵循 DOP 的一种可能方法是将代码编写成静态类方法,这些方法接收它们操作的数据作为显式参数。
通过将代码与数据分离来实现关注点分离,往往会降低类层次结构的复杂性:与其设计一个由涉及多种关系的实体组成的类图系统,不如将系统设计成由两个不相交的更简单的子系统组成:代码子系统和数据子系统。

当我们使用通用数据结构(例如哈希映射和列表)表示数据时,数据访问更加灵活,并且有助于减少系统中的类数量。
保持数据不可变性,可以让开发人员在多线程环境中编写代码时更加安心。无需使用锁机制或防御性复制来保护代码,即可确保数据有效性。DOP
原则适用于面向对象编程语言和函数式编程语言。然而,对于面向对象开发人员来说,向 DOP 的过渡可能比函数式编程开发人员需要更大的思维转变,因为 DOP 指导我们摆脱将数据封装在有状态类中的习惯。

Yehonathan Sharvit 自 2000 年以来一直从事软件工程师工作,使用 C++、Java、Ruby、JavaScript、Clojure 和 ClojureScript 进行编程。他目前在 CyCognito 担任软件架构师,负责构建大规模数据管道的软件基础架构。他在其技术博客上分享软件方面的见解。Yehonathan 最近出版了《面向数据编程》一书,可由 Manning 出版社购买。

文章来源:https://dev.to/viebel/a-simple-way-to-reducing-complexity-of-information-systems-2d22
PREV
如何打造你的 Solana 狙击机器人 (2)💰🚀
NEXT
使用 React Hooks 构建视频聊天应用程序