11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

为灵活性和健壮性而设计:异步消息模型、OOP 和函数式编程

  • 2007-11-17
  • 本文字数:926 字

    阅读完需:约 3 分钟

“吩咐,不要询问”:按照 Pragmatic Programmers 的说法,在面向对象编程中最好“吩咐一个对象让它去做些什么,而不是向它索要数据”。Michael Feathers 认为“这是一个极佳的建议”,特别是对于比较大的系统:

返回值把工作又推回给调用者。单单做完一件事然后向协作者发送一条消息还不算完;你必须等着看有没有什么被送回来,然后可能还要做更多的事情。如果不返回值会让我们更轻松一点。

Feathers 认为在测试驱动开发中使用 Mocks 会导致这种类型的架构:

与其吩咐一个对象去做事,然后询问它是否已经完成,你不如吩咐它去做事,然后看看它的协作者有什么变化。[……] 这有点像工作流。[……] 遇到新需求的时候比较不会影响到设计。而且,这样很合理。每个对象负责一件事情,并且通知下一个接班的对象。

我们还可以更进一步。Feathers 主张如果没有返回值需要等候,那么发送“异步消息比同步消息更好“。实际上 H.S. Lahman 早就主张过在面向对象架构中的“行为是被假定为异步的”。如今的OOP 模型是同步的,这是因为在面向对象编程语言中“没有区分开消息和方法”。因此“更加难以构造出正确的OOA/D 模型”,正确的模型不仅可以显著提高可维护性,还包括健壮性。

Michael Feathers 描述说这种做法也与 Erlang 的模型相吻合:

Erlang 隐含的思想是,如果你能创建大量的进程,并保证它们绝不共享状态,你就可以开发出更加健壮的系统。每个进程接收消息,做自己的工作,然后向其他进程发送消息。消息的发送主要是异步的。

Feathers 认为,“吩咐,不要询问”的编程模型“几乎是函数式编程的反面”,虽然“两者都有一个相对无状态的河床让数据从上流过”:

在最纯粹的函数式编程中,你从不吩咐,总是询问。而且如果有缓求值(lazy evaluation)帮忙,系统只需完成最必不可少的操作来回答你的问题。

不过可争议的是 Erlang 不能被认为是纯粹的函数式语言。Feathers 也特别引用 Ralph Johnson 的观点,他指出 Erlang 的“核心里头是 OO”。

就你的观点,哪种无状态模型最适合处理现今的适应性和健壮性问题呢?是 Erlang 的异步消息模型还是某种纯粹的函数式编程方法(如 Haskell)?

查看英文原文: Designing for flexibility and robustness: Asynchronous message model, OOP and Functional Programming

2007-11-17 11:41979
用户头像

发布了 225 篇内容, 共 55.3 次阅读, 收获喜欢 43 次。

关注

评论

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

「死磕」传统工业软件路径不通 他们给自己造了把梯子

ToB行业头条

在线JSON转XML工具

入门小站

工具

java学习中cookie原理

编程江湖

java 编程

定了!皮皮APP助力电子竞技游戏师职业技能标准发布!

联营汇聚

推荐一款少见开源的支付类项目(Spring Boot+Shiro+MyBatis+Redis)

北游学Java

Java redis spring mybatis

金融云原生漫谈(一)|银行业如何快速提升应用研发效能和交付效率?

York

金融云原生漫谈(四)|如何构建高可用、高并发、高性能的云原生容器网络?

York

云原生 金融科技 高性能网络

大数据开发之Spark Shuffle 原理分析

@零度

大数据 spark

vscode中Tasks及Emmet的应用

编程江湖

vscode

如何使用JDBC API操作数据库

编程江湖

JDBC

金融云原生漫谈(二)|中小银行破局之道:云原生架构转型全攻略

York

2022开篇之作,Docker与微服务实战教程

编程江湖

网络安全好学吗?手把手教你学metasploit信息收集 网络安全工程师学习资料汇总

学神来啦

青藤:一招制敌!微隔离,让勒索软件不再横行

青藤云安全

为什么要避免在 Go 中使用 ioutil.ReadAll?

AlwaysBeta

Go 源码 io Go 语言

资讯|WebRTC M96 更新

网易云信

大数据 WebRTC 开发

堡垒机和防火墙的区别是什么?能防删库跑路吗?

行云管家

运维 网络安全 防火墙 堡垒机

Flutter VS React Native,跨端方案大 PK

融云 RongCloud

flutter React Native Discord

金融云原生漫谈(三)|银行云原生基础设施构建:裸金属VS虚拟机

York

云原生 金融科技 新基建

元宇宙到家,那些「聪明」的设计工具

Zilliz

Towhee,开源的 embedding 框架与社区

Zilliz

数据库 开源 向量检索

静态代理模式——时间都去哪儿了

蝉沐风

设计模式 代理模式

后端老司机的跨域之旅

勇哥java实战分享

后端 CORS

防火墙是什么?怎么理解?

行云管家

运维 网络安全 防火墙 堡垒机

创业公司COO:用宜搭落地管理思想,打破数据壁垒|《102个开发者故事》第五期

钉钉宜搭低代码

低代码 数字化转型 企业管理 钉钉宜搭

为灵活性和健壮性而设计:异步消息模型、OOP和函数式编程_函数式编程_Sadek Drobi_InfoQ精选文章