QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

函数式编程的后期架构

  • 2023-06-07
    北京
  • 本文字数:1564 字

    阅读完需:约 5 分钟

函数式编程的后期架构

许多软件架构方法都是假设该架构在一开始时就进行了规划。但不幸的是,以这种方式规划的架构之后很难更改。函数式编程可以帮助我们实现松耦合,从而可以将预先的规划保持在最低限度,并可以在之后更改架构决策。


Michael Sperber 在OOP 2023 Digital大会上谈到了软件架构和函数式编程。


Sperber 给出了一个将系统代码划分为不同构建块的例子。这是一种特别重要的架构决策,可以单独处理不同的构建块,也可以与不同团队一起协作。实现这一点的一种方法是对粗粒度的构建块(有界上下文)使用领域驱动设计(DDD):

DDD 是指,我们应该在开始时就通过上下文映射来识别有界上下文。但是,如果上下文之间的界限设置错了,我们就会丧失很多优势。我们会把它们搞错,至少会有一点点错误,然后之后就很难更改了。


根据 Sperber 的说法,与面向对象编程(OOP)相比,函数式编程能够支持后期架构并减少耦合。


Sperber 认为,为了推迟宏观架构决策,我们必须始终保持解耦。他说,函数式编程中的组件本质上仅是数据类型和函数,这些函数在没有可变状态的情况下工作。与典型的 OO(面向对象)组件相比,这使得依赖关系更显式化,并且耦合更松散。这反过来又使我们能够构建独立于宏体架构的函数,Sperber 说到。


Sperber 明确表示,函数式编程并不“仅仅是没有可变状态的 OOP”。它有自己的领域建模、抽象和软件构建方法和文化。我们在 OO(面向对象)项目中可以通过采用不变性来获得一些好处。正如 Sperber 所解释的那样,要获得所有这些,我们需要更深入地研究,并使用适当的函数式语言:


函数式架构广泛使用高级抽象来实现可重用的组件,更重要的是,提供可预测未来的灵活领域模型。在探索和开发这些领域模型时,函数式程序员经常利用数学提供的丰富词汇表。由此产生的抽象从根本上说是由函数语言所提供的高级抽象设施实现的。


InfoQ 采访了Michael Sperber,探讨了当前的架构技术工具箱是如何使我们更倾向于做出糟糕的决策,而这些决策在以后很难更改,以及如何解决这个问题。


InfoQ:在项目开始时,定义宏观架构的挑战有哪些?

MichaelSperber:软件架构的一个流行定义是,它是以后很难更改的决策。在开始时就这样做意味着是在你掌握的信息最少时做决策。因此,这些决策很有可能是错误的。


InfoQ:在上下文之间移动边界变得如此困难的原因是什么?

Sperber:在架构界,我们似乎忘了如何在有界上下文或单体中实现模块化,这就是为什么会有“模块化”这个新术语的原因,这意味着常规单体在默认情况下是非模块化的,其内部是紧密耦合的。


InfoQ:所以你的意思是说我们不知道如何在单体中实现松耦合?

Sperber:是的。这是因为 OO(面向对象)架构的基础是使用可变状态进行编程,即在适当的位置更改对象。这些状态变化导致了不可见的依赖关系,这些依赖关系很难被看见,并且会使构建块纠缠在一起。这不仅会影响项目的功能,还会影响其他质量目标。


InfoQ:你能举个例子吗?

Sperber:假设我们选择并行来作为实现高性能的策略:我们需要选择聚合根,并通过互斥来保护对这些根的访问。这是一项乏味的工作,容易出错,也难以快速完成,并且会极大地增加耦合。


InfoQ:如果架构师和开发人员想改进他们做出架构决策的方式,你有什么建议能给到他们?

Sperber:即使我们不能在项目中使用函数式语言,也可以尝试一下函数式编程的基础知识,感受一下其中的差异和机会。如果你是 FP(函数式编程)的新手,推荐你采用“如何设计程序”作为入门指南,如何你是德语使用者,则推荐DeinProgramm


另外推荐两本关于函数编程软件构建的书:

Scott Wlaschin:领域建模函数化 Sandy Maguire:代数驱动设计


原文链接:https://www.infoq.com/news/2023/04/late-arch-functional-programming/


声明:本文为 InfoQ 翻译,未经许可禁止转载。


延伸阅读:

函数式编程语言时代已经来临

为什么函数式编程没有流行起来?

面向对象设计原则与函数式编程

2023-06-07 11:2372950

评论

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

Matlab常用图像处理命令108例(一)

timerring

图像处理 数字图像处理

厉害了!刷完这份 532 算法秘笈后,我成功斩获字节、快手offer

做梦都在改BUG

Java 数据结构 面试 算法

全面项目管理软件:Project Office 激活版

真大的脸盆

项目管理 Mac Mac 软件 项目流程

图数据结构-路径查找

alexgaoyh

DFS 图数据库 知识图谱 路径规划 三元组

燃!网易架构大牛熬夜手敲千页网络协议笔记,竟在GitHub标星数万

做梦都在改BUG

Java 计算机网络 网络协议

普通大专生,从面试无人问到拿下阿里offer!说说我的艰辛历程

做梦都在改BUG

Java 面试 专科

面试官:如何防止 Java 源码被反编译?我:有点懵

做梦都在改BUG

Java Java源码

阿里内网开源:多位大佬联合撰写的Java多线程手册被我拿到了

做梦都在改BUG

Java 多线程

云边端协同时序数据库的挑战与解决方案

CnosDB

时序数据库 开源社区 CnosDB 云边端协同

清华AIR与英特尔开展合作,研发全新绿色数据中心解决方案

科技之家

看完这一篇,ShardingSphere-jdbc 实战再也不怕了

勇哥java实战分享

深度解析首个Layer3 链 Nautilus Chain,有何优势?

西柚子

学会用规则引擎Drools,让你早点下班

JAVA旭阳

Java drools

BetterSnapTool for Mac 帮你整理窗口,提升效率

Rose

BetterSnapTool 窗口管理软件 mac软件下载

想要快速学会Blender雕刻?这些Blender雕刻技巧不要错过

Finovy Cloud

深入理解CSS Grid网页布局,并通过示例代码来演示如何使用它

兴科Sinco

前端 前端开发 网页布局 CSS Grid 网络相册

GridView(网格视图)的基本使用

芯动大师

ListView Android; girdview

在 Linux 上有哪些运行程序的方式?

蓬蒿

Shell fork Linux 上启动程序 execv

应该升级 JDK 到 17 了吗

HoneyMoose

IBM Semeru Windows 下的安装 JDK 17

HoneyMoose

OpenAI-J 如何进行测试

HoneyMoose

Okhttp 的 retrofit2 运行警告信息异常

HoneyMoose

Amazon GuardDuty 的新增功能 – Amazon EBS 卷的恶意软件检测

亚马逊云科技 (Amazon Web Services)

解决mac电脑打开应用“意外退出”的问题 (点按“重新打开”以再次打开应用程序)

Rose

意外退出 Mac软件

深度解析首个Layer3 链 Nautilus Chain,有何优势?

股市老人

字节一面:“为什么网络要分层?每一层的职责、包含哪些协议?”

做梦都在改BUG

Java 计算机网络 网络协议

苹果办公必备远程工具:Royal TSX使用教程

Rose

SSH Royal TSX 教程 Royal TSX 破解 Royal TSX mac下载

表格检测识别技术的发展历程

合合技术团队

人工智能 算法 表格识别

从ChatGPT到AGI还有多远?| 社区征文

轻口味

ChatGPT

热点面试题:Vue2、3 生命周期及作用?

沉浸式趣谈

JavaScript 生命周期 Vue 3 vue2 前端面试题

函数式编程的后期架构_语言 & 开发_Ben Linders_InfoQ精选文章