前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >降低系统复杂性,开发团队必知的一种简单方法

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

作者头像
深度学习与Python
发布于 2023-04-01 09:30:50
发布于 2023-04-01 09:30:50
5400
举报

作者 | Yehonathan Sharvit

译者 | Sambodhi

策划 | 万佳

在信息系统中,事情可以变得非常复杂,至少可以说是这样。像 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

今日好文推荐

两人小团队开发了一款与谷歌竞争的产品

传字节跳动实习生删库酿严重事故;快手7月取消大小周;华为Linux内核贡献者被质疑刷KPI,实为使用自动提交脚本?| Q资讯

使用两年之后,我为什么卸载了Istio?


InfoQ 读者交流群上线啦!各位小伙伴可以扫描下方二维码,添加 InfoQ 小助手,回复关键字“进群”申请入群。回复“资料”,获取资料包传送门,注册 InfoQ 网站后,可以任意领取一门极客时间课程,免费滴!大家可以和 InfoQ 读者一起畅所欲言,和编辑们零距离接触,超值的技术礼包等你领取,还有超值活动等你参加,快来加入我们吧!

点个在看少个 bug 👇

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 InfoQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Manning新书】面向数据编程降低软件复杂度
来源:专知本文为书籍介绍,建议阅读5分钟这本书讲述了一个故事,说明了面向数据编程(DOP)的价值,以及如何在现实生产系统中应用它的原则。 面向数据编程是介绍面向数据范式的独一无二的指南。这种开创性的方法用通用的不可变数据结构表示数据。它简化了状态管理,简化了并发性,并消除了在面向对象代码中会发现的常见问题。这本书通过对话、代码片段和图表展示了强大的新思想,帮助您快速了解关于DOP的伟大之处。最重要的是,该范例与语言无关,您将学习编写可以用JavaScript、Ruby、Python、Clojure实现的DO
数据派THU
2022/09/07
1K0
【Manning新书】面向数据编程降低软件复杂度
面向对象编程的弊端有哪些?
面向对象编程作为一种流行的软件开发范式,有助于提高代码复用性、可维护性和扩展性,但它并非完美无缺,在特定场景和大型软件项目中也存在诸多弊端。
不脱发的程序猿
2024/11/26
2630
面向对象编程的弊端有哪些?
降低软件复杂性的一般原则和方法
本文是作者阅读John Ousterhout的《A Philosophy of Software Design》之后,结合自己的工作经验,对“降低复杂性”做了详细总结,希望给读者朋友们带来不一样的思路。
美团技术团队
2019/09/24
9210
降低软件复杂性的一般原则和方法
八股文-面向对象的理解
近年来,IT行业的环境相较以往显得有些严峻,因此一直以来,我都怀有一个愿望,希望能够创建一个分享面试经验的网站。由于个人有些懒惰,也较为喜欢玩乐,导致计划迟迟未能实现。然而,随着年底的临近,考虑到当前环境下许多开发者可能面临裁员等问题,我决定加速建设这个面试经验分享网站,以便为大家提供学习的平台,共同面对职场的挑战。
修己xj
2023/11/15
3120
八股文-面向对象的理解
现代软件开发:架构模式、编程范式、设计模式及云原生方法论
在今天的快速发展的软件行业中,构建高效、可维护和可扩展的应用程序是至关重要的。让我们探讨几个关键的概念和方法论,它们在现代软件开发中发挥着核心作用。
行者深蓝
2023/12/07
1.7K0
软件设计:面向对象编程中独立函数的作用与价值
面向对象编程(OOP)是一种广泛使用的软件设计方法,强调数据封装、继承和多态性。然而,在实践中,是否应该避免设计和使用独立的函数这一问题引发了广泛的讨论。在许多情况下,独立函数既可以提高代码的可读性,也可以增强软件的可维护性。本文将探讨在面向对象编程中设计和使用独立函数的优势与考量。
运维开发王义杰
2024/03/21
1310
软件设计:面向对象编程中独立函数的作用与价值
防御性编程?这不就来了
最近程序员界又重新流行起来了防御性编程这个概念,早期嘞,这个概念代表是一种细致、谨慎的编程方法。
wayn
2023/12/15
4051
防御性编程?这不就来了
从结构化过程式编程到面向对象编程:一个平稳的过渡
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它使用“对象”来设计软件。对象是包含数据(也被称为属性)和操作这些数据的方法的实体。面向对象编程的主要目标是提高软件的可重用性、灵活性和可维护性。
运维开发王义杰
2023/08/10
3520
从结构化过程式编程到面向对象编程:一个平稳的过渡
【愚公系列】软考高级-架构设计师 084-面向对象开发
面向对象开发(Object-Oriented Development,OO开发)是一种软件开发方法,它将问题视为一系列对象的集合,每个对象都有自己的属性和方法。在面向对象开发中,程序的主要构建单位是对象,而不是函数或过程。
愚公搬代码
2024/08/02
1590
C++ 数据封装的方法,重点是其编程思想
在C++中,数据封装一般指的是将数据和操作这些数据的函数绑定在一起的程序设计方式。通常使用C++的类来实现。
用户9470376
2024/03/13
2490
Java面向对象回顾
一切皆对象,现实生活中:电脑、耳机、水杯、书等等,相比现实生活,程序中的对象是抽象出来的,要么是基于现实中的对象抽象出来,只包含了现实中对象的部分信息,要么是根本应用程序的需要而抽象出来的,如:职工对象(通常只记录部分与职工相关性较高的信息),学生对象(通常也只记录与学生相关性较高的信息)。职工和学生是一个“角色对象”,因为他们也可能同时是儿子、女儿、父亲、母亲、观众、演员……,但在特定的场景下仅使用他们对应的属性信息等。程序中也有现实中不存在的对象,比如一个数据库、一张数据表、一个服务器的连接,这是根据应用程序的需要抽象得到的,为了完成业务需求!
訾博ZiBo
2025/01/06
1060
适合初学者学习的面向对象编程(OOP)入门指南
类是一种蓝图,用来创建对象。它定义了对象将拥有的属性和方法。就像建房子的图纸一样,图纸决定了房子的结构和功能,但并不是真正的房子。
前端达人
2024/06/27
3720
适合初学者学习的面向对象编程(OOP)入门指南
为什么说组合优于继承?
继承,它允许一个类(称为派生类或子类)从另一个类(称为基类或超类)继承属性和行为。换句话说,子类“是”超类的一种类型。它建立了一种“是”关系。例如,如果我们有一个类“Animal”和一个类“Dog”,则“Dog”类继承自“Animal”,因为狗是一种动物。
闫同学
2024/06/08
5670
【JAVA-Day62】Java继承:面向对象编程中重要的基石
本技术博客将深入研究Java中继承的核心概念,探寻其在面向对象编程中的重要地位。通过对继承的本质、倡导原因、技巧、与封装、多态的融合,以及面试考点的深入理解,我们将为你呈现继承的全貌,揭示其在实际开发中的价值和实践总结。
默 语
2024/11/20
1740
【JAVA-Day62】Java继承:面向对象编程中重要的基石
封装、继承与多态究极详解(面试必问)
继承是类与类之间的一种关系表现,我们知道除了继承,类之间的关系还可以有关联、依赖、实现、聚合、组合,为什么只强调继承?私以为实现是继承的特例,而其他四种关系都属于将类放在不同位置的灵活使用,且C中的结构体本身也具有这些特性,它并不是C++新创造出来的,但继承不一样,继承是新的需要提前约定的规则。
码事漫谈
2024/12/20
2190
架构设计的真谛:系统与子系统、模块与组件、框架与架构
在软件研发这个领域,程序员的终极目标都是想成为一名合格的架构师。然而梦想很美好,但现实却很曲折。
玄姐谈AGI
2021/03/25
8060
架构设计的真谛:系统与子系统、模块与组件、框架与架构
【愚公系列】软考中级-软件设计师 047-面向对象技术(考点简介)
面向对象技术(Object-oriented technology)是一种软件开发方法论,也是一种编程范式,它通过将系统中的实体抽象为对象,并将对象之间的关系和行为通过封装、继承和多态等机制进行描述和实现。
愚公搬代码
2024/04/30
1660
编程_三大编程思想:POP、OOP、AOP
POP:面向过程编程(Procedure Oriented Programming)
mikimo
2022/07/20
3.4K1
JDK17中的密封类sealed和permits使用指南:什么是Java中的sealed和permits?
在现代软件开发的多样化领域中,Java作为一种广泛使用的编程语言,持续不断地演进和创新。自Java 17版本引入的sealed类和permits关键字,正是这种创新精神的最新体现。这些特性旨在提供更精确的控制机制,允许开发者明确指定哪些类可以继承特定的类,从而增强了代码的安全性和模块化。本文将深入解析sealed类和permits的概念、它们的应用场景以及如何在Java程序中有效地利用这些特性。文章内容既适合初学者快速理解这些新概念,也适合经验丰富的开发者深入探索这些特性在复杂项目中的应用。👨‍💻👩‍💻
猫头虎
2024/04/09
1.8K0
JDK17中的密封类sealed和permits使用指南:什么是Java中的sealed和permits?
《解锁C++面向对象编程:通往代码艺术殿堂的密钥》
面向对象编程(OOP)宛如一座神秘而宏伟的殿堂,承载着无尽的智慧与力量,吸引着无数开发者投身其中,探寻其深藏的奥秘。它不仅是一种编程范式,更是一种思维方式,一种将现实世界的复杂事物抽象为代码世界中的对象,进而构建出强大软件系统的独特视角。
程序员阿伟
2025/04/27
970
《解锁C++面向对象编程:通往代码艺术殿堂的密钥》
推荐阅读
相关推荐
【Manning新书】面向数据编程降低软件复杂度
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档