NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

函数式编程的后期架构

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

评论

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

【译】使用Kotlin从零开始写一个现代Android-项目-Part1(1)

android 程序员 移动开发

【面试准备】JavaWeb部分,android webview

android 程序员 移动开发

一个8年Android 开发想转后端,还来得及嘛?,android开发菜鸟教程

android 程序员 移动开发

一种清晰, 便于扩展android项目架构方案,kotlin编程

android 程序员 移动开发

【透镜系列】看穿 _ 触摸事件分发 _,android界面开发框架

android 程序员 移动开发

一个Android开发6年程序员的年终面试总结,2021无畏艰难险阻,迎风潇洒前行

android 程序员 移动开发

【议程公布】2021年MongoDB中文社区南京技术沙龙

MongoDB中文社区

mongodb

一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤

android 程序员 移动开发

一款简单的消息防抖框架,安卓开发权威指南

android 程序员 移动开发

一篇文章让你彻底了解三次握手和四次挥手,轻松拿下offer

android 程序员 移动开发

【译】使用Kotlin从零开始写一个现代Android-项目-Part1

android 程序员 移动开发

一个非常好用的页面引导工具guideView,html5移动开发框架

android 程序员 移动开发

【面试必会】全网最具深度的三次握手,腾讯Android开发面试记录

android 程序员 移动开发

华为云·核心伙伴开发者训练营第七期开营,共赴产业云美好明天!

华为云开发者联盟

华为云 鲁班会

一个中专生的逆袭之旅(如何做到收到阿里、腾讯、滴滴等面试邀请)

android 程序员 移动开发

一篇看懂Android与Flutter之间的通信,最新Android开发面试解答

android 程序员 移动开发

【译】彻底理解 Android 中的阴影,三年经验Android开发面经总结

android 程序员 移动开发

恒源云(GpuShare)_未闻Prompt名(论文学习笔记)

恒源云

深度学习

一位Android程序员入坑Flutter后整理出一份超详细的学习笔记

android 程序员 移动开发

一场赛跑引起的并发知识,flutterrow换行

android 程序员 移动开发

一篇文章,全面总结2020最新整理-Android-大厂高频面试知识点

android 程序员 移动开发

Cube 技术解读 | Cube 卡片技术栈详解

阿里巴巴终端技术

支付宝 客户端开发 卡片服务 cube 动态化

一位普通Android程序员呕心沥血八次大小厂的面试复盘总结,收藏一波扩展知识体系!

android 程序员 移动开发

一封给Android开发者 UI 自动化测试上手指南,前方高能

android 程序员 移动开发

一文了解AndroidStudio3-4的全部更新,androidapp开发从入门到精通

android 程序员 移动开发

一种有效管控APP隐私权限的解决方案,Android400道面试题通关宝典助你进大厂

android 程序员 移动开发

一篇通俗易懂的Android视图系统设计与实现,精通android网络开发pdf

android 程序员 移动开发

【译】彻底理解 Android 中的阴影(1),apk优化签名

android 程序员 移动开发

【阿里P8大牛教你Android入门之路(java篇,移动端开发工程师转型

android 程序员 移动开发

一文带你搞懂Android的-Binder-机制,flutterandroid最低版本

android 程序员 移动开发

一线互联网技术总监的忠告:我们精通那么多技术为何还是做不好一个项目?

android 程序员 移动开发

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