写点什么

Michael Feathers 希望消除错误能驱动设计

  • 2018-09-26
  • 本文字数:1296 字

    阅读完需:约 4 分钟

Michael Feathers 因其著作《高效操作遗留代码》( Working Effectively With Legacy Code )一书而广为人知。他发现错误中存在着一些值得关注之处,但他也承认大部分开发人员并未投入时间去关注这些错误。在他看来,很多错误解决机制就是采取某种程度上的放弃。在 Explore DDD 2018 大会上,Feathers 做了主题演讲,探讨消除错误如何驱动软件系统的设计。

针对领域驱动设计(DDD)大会的主题,Feathers 在演讲一开始就给出了对“领域”(Domain)的五种定义。他在这些定义中发现了一个共性,即领域就是一种范围,一些领域是随意构造的,也有一些是人们创造的。正因为领域是随意构造的,因此人们可以重新塑造和扩展领域。虽然人们可以直接使用 DDD 模拟并适应不断变化的业务流程,但为了更好地应对乃至消除错误,Feathers 建议应对领域做尽可能类似的更改。

Feathers 指出,领域扩展可能会导致一些不和谐因素,因此必须慎重。Feathers 就此举了两个例子,一个是在可选日期中输入了二月三十日,另一个是在编程语言中允许对数组赋以负的索引值。对于前者,人们非常易于理解简单域模型是如何允许这种非法情况的发生。但是对于负的数组索引值,情况则恰恰相反,对此应抛出一个错误。一旦这样的技术可用,并被人们按有效的语法采纳,那么我们就会意识到领域扩展对此类情况是非常有用的。

Feathers 提及,他探索错误的部分灵感来自于 Joe Duffy 博客中对微软的Midori 操作系统研究项目的论述,尤其是对错误模型l 的分析。Duffy 提及,“错误模型试图回答的一个基本问题就是,'错误’是如何传递给程序员和系统用户的?”这个看似简单的问题,自然导致了“如何定义错误”的挑战。Feathers 沿此思路继续推理,最终得到人们希望知道的是“为什么我们会存在错误?”。换句话说,如果“错误”只是一个用于指代我们领域中不匹配概念的用词,那么我们应该怎么做?

演讲进而从领域的概念延伸到如何实际处理错误。在遇到错误时,人们主要存在三种做法。第一种做法是简单地返回空值。这种做法消除了对任何错误原因的解释,需要人们对空引用做额外的检查工作,并且混淆了人们仍在处理错误的事实。另一种做法是抛出异常。这种做法也许要优于返回空值,因为它可以给出了问题的一些相关信息,但它仍需要调用者去处理异常情况。第三种做法是将错误作为领域的一部分。Feathers 认为,“错误就是我们领域的一部分,因为错误可能会发生在我们的工作中”。很显然,Feather 提倡采用第三种做法。

扩展领域意味着提出问题,“我们真正希望会发生什么?”。不应只是告诉他人错误的相关信息,而应引入一些新概念去提供可操作信息。一个例子就是使用空对象模式返回 ItemNotFound对象,其具体实现取决于具体的情况。

在演讲中的最后,Feathers 给出了 Erlang 的设计理念,并按英式风格概括为“保持冷静,任其崩溃”。计算是与现实世界紧密联系的,因此在现实中计算可能会产生失败。Erlang 通过将现实情况囊括在领域之中,扩展了应用的领域。如果一种语言的整个领域可以使用这种方式扩展,那么即便是更小的系统,都一定能受益于涵盖错误的领域扩展。

查看英文原文: Michael Feathers Wants Error Elimination to Be a Design Driver

2018-09-26 05:301043
用户头像

发布了 391 篇内容, 共 139.7 次阅读, 收获喜欢 257 次。

关注

评论 1 条评论

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

技术分享| anyRTC复盘一起看球场景

anyRTC开发者

CDN RTC 实时音视频 直播连麦 AI降噪

详解JAVA线程问题诊断工具Thread Dump

华为云开发者联盟

Java 后端 开发 华为云 12 月 PK 榜

物联网平台设备运维监控报警介绍——实践类

阿里云AIoT

运维 监控 物联网 数据可视化

华为企业交换机ESW助力企业走上云端

路过的憨憨

从工具到实践:如何在GitHub上保障开源项目安全?

SEAL安全

GitHub 开源 开源项目 开源安全 12 月 PK 榜

这么硬核的教程绝对不能错过!无水印下载ins视频保存到手机相册!

frank

ins ins视频和图片

物联网平台从设备端到云端业务系统全链路开发实战——实践类

阿里云AIoT

sql 监控 物联网 存储 消息中间件

GitHub标星120K+!最新23版Java岗面试攻略,涵盖28个技术栈!

程序知音

Java java面试 java编程 后端技术 Java面试八股文

AI技术实践 | 人脸核身在未成年人保护领域的实践应用

牵着蜗牛去散步

人工智能 腾讯云 腾讯 人脸识别 未成年保护

融云 x OHLA:「社交+游戏」双轮驱动,逐鹿中东陌生人社交

融云 RongCloud

社交 融云

【干货分享】PCB 板变形原因!不看不知道

华秋PCB

生产 工艺 PCB PCB设计

新年送礼选贾斯特里尼&布鲁克斯葡萄酒,高端大气有面子

联营汇聚

小课堂|RSA加密数据太长报错解决

孟君的编程札记

Java rsa RSA密码

严选精品葡萄,酿造百年贾斯特里尼&布鲁克斯葡萄酒

联营汇聚

火山引擎工具技术分享:用AI完成数据挖掘,零门槛完成SQL撰写

字节跳动数据平台

大数据 BI BI 分析工具 12 月 PK 榜

java培训学习后找不到工作的原因有哪些

小谷哥

重磅 | 九科信息受邀参加2022中国互联网大会“数字政府论坛”

九科Ninetech

某车企用户数据泄露,新能源汽车信息安全问题不容忽视

行云管家

信息安全 企业 堡垒机

助力企业构建更可靠的云上云下网络,华为云企业交换机巧解企业上云难题!

路过的憨憨

海量请求下的接口并发解决方案

Java全栈架构师

Java 数据库 面试 后端 架构师

云成本优化方案-采购云管平台!

行云管家

云计算 云资源 云成本、

贯穿汽车用户全生命周期,火山引擎数智平台能帮车企做这些事!

字节跳动数据平台

大数据 数据产品 12 月 PK 榜

华为云桌面,高流畅低延时,给你丝滑办公体验

爱尚科技

国产ETL etl-engine 流批一体数据交换引擎 轻量级 跨平台 支持动态解析GO语言脚本

weigeonlyyou

Prometheus Influxdb go语言 ETL Hadoop hd

贾斯特里尼&布鲁克斯葡萄酒,来自法国的专属浪漫

联营汇聚

如何轻松做数据治理?开源技术栈告诉你答案

NebulaGraph

数据治理 图数据库 全链路数据血缘 数据血缘

盘活数据资产,驱动不动产数字化创新

华为云开发者联盟

数据库 后端 华为云 12 月 PK 榜

第三周作业 外包学生管理系统-架构设计文档

不爱学习的程序猿

华为企业交换机ESW,企业数据上云,一步到位

路过的憨憨

图计算引擎分析——Gemini

京东科技开发者

内存 图计算 压缩 引擎 静态数据

钉钉 ANR 治理最佳实践 | 定位 ANR 不再雾里看花

阿里巴巴终端技术

android 钉钉 anr

Michael Feathers希望消除错误能驱动设计_语言 & 开发_Thomas Betts_InfoQ精选文章