硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

函数式编程的后期架构

  • 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:2384707

评论

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

今天要学习的技术点,Python 筛选数字,模块导入,特殊变量__all__ 实战博客

梦想橡皮擦

5月月更

模块六作业: 拆分电商系统为微服务

凯博无线

拆分电商系统为微服务

dan629xy

Swin Transformer实战: timm使用、Mixup、Cutout和评分一网打尽,图像分类任务

AI浩

图像分类实战:mobilenetv2从训练到TensorRT部署(pytorch)

AI浩

HashMap 源码分析-基础结构

zarmnosaj

5月月更

代码之外:谈谈算法该怎么准备,不准备可以吗

宇宙之一粟

算法面试 代码之外 5月月更

数字孪生智慧物流之 Web GIS 地图应用

一只数据鲸鱼

GIS 数据可视化 智慧物流 数字孪生 三维仿真

OKALEIDO解决NFT流动性不足难题,更有创新平台通证分配方案

股市老人

STM32F103系列开发_点亮LED灯

DS小龙哥

5月月更

Kafka 万亿级消息实践之资源组流量掉零故障排查分析

vivo互联网技术

大数据 kafka 监控

中国信通院发布“可信开源”全景观察 成立三大开源产业组织

中国IDC圈

开源 开源治理

数字化转型背景下,企业如何做好知识管理?

小炮

企业知识管理

架构实战营 - 模块六 - 作业

michael

架构实战营 #架构实战营 架构师实战营 「架构实战营」

Hyperspace索引系统论文解析

漫长的白日梦

spark 数据湖 索引系统

Linux环境封装静态库

Loken

音视频 5月月更

SWA实战:使用SWA进行微调,提高模型的泛化

AI浩

VIT实战总结:非常简单的VIT入门教程,一定不要错过

AI浩

Go 依赖注入 Wire 详解 - 用户指南

baiyutang

Go 微服务 依赖注入 5月月更

架构学习(二)

爱晒太阳的大白

5月月更

ResNet实战:单机多卡DDP方式、混合精度训练

AI浩

绿色环保作为经济长线主题,MOVE PROTOCOL运动APP来助力

股市老人

M_6: 拆分电商系统为微服务

Jadedev

架构训练营

用IntelliJ IDEA ULTIMATE版看Java类图

程序员欣宸

Java IDEA 5月月更

跨平台应用开发进阶(十三) :uni-app应用异常退出时处理机制探究

No Silver Bullet

uni-app 5月月更 异常退出 处理机制

EfficientNet实战:tensorflow2.X版本,EfficientNetB0图像分类任务(小数据集)

AI浩

图像分类

模块六:拆分电商系统为微服务

jiaoxn

「架构实战营」

MobileVIT实战:使用MobileVIT实现图像分类

AI浩

还在为模型加速推理发愁吗?不如看看这篇吧。手把手教你把pytorch模型转化为TensorRT,加速推理

AI浩

位运算小妙招-求二进制序列中0的个数

芒果酱

数据结构 算法 5月月更

HashMap 源码分析-新增

zarmnosaj

5月月更

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