速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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:30971
用户头像

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

关注

评论 1 条评论

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

从状态机的角度async和await的实现原理

C++后台开发

多线程 linux开发 Linux服务器开发 状态机 C++开发

来自开发者的点赞,龙蜥社区荣登“2022 中国技术品牌影响力榜单”

OpenAnolis小助手

开源 龙蜥社区 思否 榜单 技术先锋

【Unity干货教程】如何实现Unity和Android原生互相调用?

3DCAT实时渲染

Unity 实时云渲染 Unity3D

模块一作业

源子陌

架构实战营

Linux安装Vue环境

Geek_7ubdnf

Linux Vue

为什么建议SQL初学者尽量选择Web版SQL工具?

雨果

sql 数据库管理工具 SQL开发

pip安装更换镜像

Geek_7ubdnf

Linux

Apollo实现cron语句的热配置

Geek_7ubdnf

Java Apollo

选择LED显示屏电源的7个指南

Dylan

电源电路 LED显示屏 led显示屏厂家

RTE 领域的发展,为视频编解码标准带来哪些新变化?丨Dev for Dev 专栏

声网

定时任务cron

Geek_7ubdnf

Java

SQL常用语句

Geek_7ubdnf

sql

本地安装并创建MySQL数据库

Geek_7ubdnf

MySQL 数据库

Spring+Vue工程部署在Linux

Geek_7ubdnf

Java spring Linux Vue

openEuler资源利用率提升之道 05:虚机混部介绍与功耗管理技术

openEuler

数据库 Linux 操作系统 openEuler OpenStack

卷扩容业务失败了,在线等…

华为云开发者联盟

开发 华为云 企业号 1 月 PK 榜 卷扩容 磁盘扩容

软件测试/测试开发 | 代码覆盖率集成

测试人

软件测试 自动化测试 测试开发 代码覆盖率

现代数据平台要实现自助用数,要解决的三个问题

华为云开发者联盟

大数据 后端 华为云 企业号 1 月 PK 榜

GoLang的安装和使用

Geek_7ubdnf

golang

Tapdata Cloud 场景通关系列:集成阿里云计算巢,实现一键云上部署真正开箱即用

tapdata

如何使用 Node.js Stream API 减少服务器端内存消耗

华为云开发者联盟

后端 开发 华为云 内存消耗 企业号 1 月 PK 榜

Mybatis自动生成增删改查代码

Geek_7ubdnf

Java mybatis

软件测试/测试开发 | 接口测试价值与体系

测试人

软件测试 自动化测试 接口测试 测试开发

Java中restTemplate的使用

Geek_7ubdnf

Java

阿里云化身“智能云管”,助力中国联通首次实现大规模平台自主运维

云布道师

阿里云

华为云云筑·开发者年度盛典精彩回顾

华为云开发者联盟

云计算 开发者 华为云 数字人 企业号 1 月 PK 榜

内部分享讲解DevOps后,我再组织成文

MavenTalker

DevOps 研发管理 敏捷实践

【UE虚幻引擎】干货!UE修改分辨率的3种方法

3DCAT实时渲染

游戏开发 虚幻引擎 ue 游戏开发引擎

实测 | Apipost和Apifox哪个更好用?

不想敲代码

接口调试 接口管理工具 API接口工具

SpringBoot基础知识

Geek_7ubdnf

Java springboot

Apollo本地快速部署

Geek_7ubdnf

Java Apollo

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