写点什么

函数式编程的后期架构

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

评论

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

行云创新:云原生技术助力企业数字化转型

行云创新

技术 云原生 转型 数字化 平台

在线GIF图片帧修改工具

入门小站

工具

5G三年成厦,泛在千兆为应用造榫卯

脑极体

【Flutter 专题】138 图解自定义国旗渐变头像

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

谈 C++17 里的 State 模式之二

hedzr

c++ 算法 设计模式 Design Patterns 有限状态机

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

白洞计划

金九银十不要怕!有了腾讯这本2021年最新Java面试手册,offer手到擒来!

Java 程序员 架构 面试 后端

互斥锁、自旋锁、读写锁...理清它们的区别和应用

行云创新

云计算 编程 开发 应用

音视频终端引擎优化实践

百度开发者中心

最佳实践 音视频 实践案例 智能视频 行业深度

FunTester框架Redis性能测试之map & INCR

FunTester

redis 性能测试 测试框架 测试开发 FunTester

CTF压轴题解题思路和过程

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

华为大牛总结的超全Linux学习笔记,看这一篇就够了!

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

北鲲云超算平台如何将云计算与高性能计算结合

北鲲云

[27]智慧金融--AI目前最被看好的落地领域

Databri_AI

人工智能

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

SOA开发者

智能网联汽车行业信息安全现状与威胁

SOA开发者

翻译积累 - Java正则表达式Pattern类

小马哥

翻译 日更

以匠心正道,以决心致远:毫末智行的自动驾驶之路

脑极体

003云原生之架构原则

穿过生命散发芬芳

云原生 10月月更

重磅来袭,虚拟化技术分类

hanaper

linux线上CPU100%排查

入门小站

Linux

Docker OOM Killer

AiDaddy

Docker JVM trouble shooting

JVM g1 gc 学习笔记二

风翱

GC 9月日更

强烈推荐!88页《Redis学习文档》完整版,PDF开放下载

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

通俗易懂!306页图解计算机网络,涵盖所有基础知识

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

002云原生之架构定义

穿过生命散发芬芳

云原生 9月日更

一文了解「模块化」 区块链的当前形势:执行、安全性及数据可用性

CECBC

【实战】基于TensorRT 加速YOLO系列以及其他加速算法实战与对比

cv君

AI 引航计划

手把手教学基于深度学习的遥感影像倾斜框算法训练与分析

cv君

AI 引航计划

如何让文件共享 SDK 支持使用 Uri 上传文件

ZEGO即构

文件存储 分区存储 文件共享

打造“大国重器”高性能计算,联想与英特尔如何携手点亮数字经济加速度?

脑极体

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