hi,我是熵减,见字如面。

在软件开发中,你是否遇到过这种情况:

你正在开发一个购物车的功能,需要在用户添加商品到购物车时,将商品的信息存储到数据库中。你设计了一个简单的方法,如下所示:

public void addToCart(Item item) {// 将商品信息存储到数据库中
}

在这个方法中,你假设了将商品信息存储到数据库的操作总是会成功,而没有考虑到可能会出现任何错误。然而,在实际情况中,可能会发生各种错误,例如数据库连接失败、写入失败、数据格式不正确等。

如果你只是假设操作总是会成功,并且没有考虑到错误情况,那么你就会遇到海勒姆定律的问题。

什么是海勒姆定律呢?其有什么意义和启示呢,下面我们来具体看一下吧。

什么是海勒姆定律

海勒姆定律(Hyrum's Law)是一个软件开发中的概念,它指的是:

“当你依赖于一个 API 的时候,你实际上也依赖于这个 API 的实现细节。”

换句话说,即使一个 API 已经被定义和文档化了,但由于实现的方式可能存在多种选择,所以你在使用这个 API 的时候也要考虑到其实现的细节,而不仅仅是其所声明的功能。

海勒姆定律得名于 Google 工程师 Hyrum Wright,他在一次演讲中提出了这个概念。

Hyrum Wright强调了开发者应该更加注意 API 的实现细节,因为这些细节可能会影响到你的代码在未来的可维护性和稳定性。

海勒姆定的意义

海勒姆定律(Hyrum's Law)是一条关于软件开发中 API 使用的规律。其意义在于以下3点:

海勒姆定律的意义在于提醒开发人员,当使用 API 时不仅要考虑其功能,还要了解其实现细节和限制。在软件开发过程中,API 是非常常见的工具,它们可以帮助我们快速实现功能,提高开发效率。

然而,API 的实现方式和细节可能会对代码的行为产生影响,甚至可能导致不可预料的问题。海勒姆定律强调了这一点,提醒开发人员在使用 API 时需要仔细评估其实现细节和稳定性,以避免出现潜在的问题,提高代码的可维护性和稳定性。

此外,海勒姆定律还强调了软件开发的迭代性和变化性。随着软件需求和技术环境的不断变化,API 的实现方式也可能随之发生变化。因此,及时了解并适应 API 的变化,对于保持软件的可维护性和稳定性也非常重要。

一个常见的案例

一个经典的海勒姆定律案例是在多线程环境下使用 Java 的 ArrayList,具体表现为对 ArrayList 的并发修改可能会导致线程安全问题。

下面是一个简单的 Java 代码的示例,演示了对 ArrayList 的并发修改可能导致的线程安全问题:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ArrayListConcurrencyExample {private static List<Integer> list = new ArrayList<>();public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(10);for (int i = 0; i < 1000; i++) {executorService.submit(() -> list.add(1));}executorService.shutdown();while (!executorService.isTerminated()) { }System.out.println("Size of list: " + list.size());}
}

在这个示例中,我们创建了一个固定大小的线程池,然后启动 1000 个线程,每个线程都向 ArrayList 中添加一个整数。最后,我们打印 ArrayList 的大小。

在单线程环境下,这段代码可以正常工作,输出的结果应该为 1000。然而,在多线程环境下,由于 ArrayList 不是线程安全的,可能会出现并发修改问题,导致结果不确定,例如输出的结果可能小于 1000。

要解决这个问题,我们可以使用线程安全的 List 实现,例如使用 Java 的 Vector 或者 Collections.synchronizedList 方法来包装 ArrayList,以保证并发修改时的线程安全性。

海勒姆定律的实践建议

以下是一些有助于在实践中落实海勒姆定律的建议:

  • 了解 API 的文档和规范。 在使用 API 之前,应该先仔细阅读相关文档和规范,了解 API 的功能、用法、限制和可能的问题。

  • 编写健壮的代码。 在使用 API 时,应该编写健壮的代码,考虑到各种可能的错误和异常情况,以保证代码的可靠性和稳定性。

  • 使用稳定的 API 版本。 如果有多个版本的 API 可以选择,应该尽量选择稳定的版本,并尽量避免使用过时或废弃的版本。

  • 进行集成和单元测试。 在使用 API 时,应该编写集成测试和单元测试,验证 API 的正确性和稳定性,并及时修复可能出现的问题。

  • 注意 API 的依赖关系。 在使用 API 时,应该注意其依赖关系,避免引入不必要的依赖,同时也要确保其依赖的组件或库是可靠的和稳定的。

  • 及时处理 API 的变更。 随着软件需求和技术环境的变化,API 的实现方式也可能随之发生变化。在使用 API 时,应该及时了解并适应 API 的变更,以保持软件的可维护性和稳定性。

综上所述,在通过遵循这些实践建议,可以更好地落实海勒姆定律,提高代码的可维护性和稳定性,同时也能够更好地适应软件开发过程中的变化和创新。

海勒姆定律的反模式

除了常见的实践建议外,以下是一些常见的反模式,这些做法不利于落实海勒姆定律:

  • 直接依赖具体实现。 有些开发人员可能会直接依赖具体实现,而忽略了 API 的规范和约定。这种做法会使代码与实现紧密耦合,增加了代码的脆弱性和难以维护性。

  • 忽略 API 的限制和异常。 有些开发人员可能会忽略 API 的限制和异常情况,而直接假定 API 总是能够正常工作。这种做法会增加代码的不确定性和出错概率,导致代码的不可靠性和难以维护性。

  • 直接使用底层库或组件。 有些开发人员可能会直接使用底层库或组件,而忽略了 API 的规范和封装。这种做法会使代码与底层实现紧密耦合,增加了代码的复杂性和难以维护性。

  • 忽略 API 的版本变更。 有些开发人员可能会忽略 API 的版本变更,而仍然使用过时或废弃的版本。这种做法会增加代码的不兼容性和难以维护性,同时也会使代码与技术发展脱节。

  • 不合理地添加或删除依赖。 有些开发人员可能会不合理地添加或删除依赖,而忽略了 API 的依赖关系和稳定性。这种做法会使代码的依赖关系变得混乱和不可控,增加了代码的复杂性和难以维护性。

综上所述,避免这些常见的反模式,能够更好地落实海勒姆定律,提高代码的可维护性和稳定性,同时也能够更好地适应软件开发过程中的变化和创新。

最后

海勒姆定律是一个非常重要的原则。其告诉我们,在处理复杂系统时,我们不能只关注系统的主要功能,还需要考虑系统中的各种依赖关系和副作用。

如果我们只是假设一切都是正确的,并没有考虑到系统的各种依赖关系和副作用,那么就会遇到各种意外和问题,这可能会导致系统崩溃或出现其他严重问题。

在编写代码时,我们应该注意避免海勒姆定律的陷阱,并考虑使用一些最佳实践来确保代码的稳定性和可靠性。

总之,海勒姆定律的重要性不能被忽视。对于开发人员来说,了解这个原则,并在实践中应用它,将有助于提高代码的质量和稳定性,从而为用户提供更好的体验。


阅读,思考,练习,分享,日日不断之功。

嗯,写完了。

新的一天,加油哦 (ง •̀_•́)ง

软件开发定律:海勒姆定律(Hyrum's Law)相关推荐

  1. 统治软件开发中的著名定律

    文| https://www.timsommer.be/famous-laws-of-software-development/ 翻译| 码农翻身 和其他领域一样,在软件开发的世界中也有一些有趣而著名 ...

  2. 软件开发定律系列之布鲁克斯定律有感

    布鲁克斯定律: 人月=人*月,月≠人月/人 极端情况下,Brooks定律会出现这样的情况:"投入更多的人到一项延迟的工作上,可以导致该项工作更加延迟". Barry Bohem:可 ...

  3. [FW]软件开发中的11个系统思维定律

    "我会更加努力地工作"--一匹名叫Boxer的马(出自乔治·奥威尔的<动物农庄>) 彼得·圣吉在其著作<第五项修炼>中提到的系统思维定律同样适用于软件开发. ...

  4. 康威定律-软件之道:软件开发争议问题剖析

    每个架构师都应该研究下康威定律 http://36kr.com/p/5042735.html 软件之道:软件开发争议问题剖析((美)AndyOram)  http://baike.baidu.com/ ...

  5. 11 Laws of The System Thinking in Software Develo(软件开发中的11个系统思维定律)

    The System Thinking Laws from Peter Senge's book "The Fifth Discipline" applied to Softwar ...

  6. 软件开发的定律:布鲁克定律

    hi,我是熵减,见字如面. 在软件项目开发中,你是否遇到过这种情况: 你的项目进度落后了,你的老板或客户不满意,你的团队压力很大,你觉得需要增加一些人手来加快速度.但是,当你增加了新的成员后,你发现项 ...

  7. 软件开发中的著名定律

    软件开发中的著名定律 和其他领域一样,在软件开发的世界中也有一些有趣而著名的定律,开发人员.管理人员还是架构师,都经常在会议或闲谈中提到他们,很多时候我们都只是点头附和,免得让人知道自己其实根本没听说 ...

  8. 软件管理定律系列之布鲁克斯定律

    布鲁克斯定律: 人月=人*月,月≠人月/人 极端情况下,Brooks定律会出现这样的情况:"投入更多的人到一项延迟的工作上,可以导致该项工作更加延迟". Barry Bohem:可 ...

  9. 海思软件开发入门篇 (一)

    标题 海思软件开发入门篇 (一)   (第一次写博客,有错别字与写的不好的地方敬请谅解.)   加过很多群,也逛过很多论坛,很多人在问,第一次接触海思不知道从而入手,的确,现在一个SDK动不动上G,还 ...

最新文章

  1. 单片微机原理P4:80C51串口与串行总线拓展
  2. Alluxio:2022年大数据五大趋势,多云下数据湖兴起,AI成为主流
  3. 征战多云时代,Nutanix这款Kubernetes多云PaaS新利器,你Get到了吗?
  4. 笔记本电脑控制面板在哪_2020年滚筒洗衣机选购指南:滚筒洗衣机应该怎么选?哪一些滚筒洗衣机性价比更高?...
  5. go + influxdb + grafana 日志监控系统
  6. PHP中H5棋牌开发的异常处理
  7. python大数据在汽车销售中的数据分析与研究
  8. 关于VS2008的Web创作组件安装错误
  9. RTL8153B RTL8153 千兆以太网 有~现 ~货
  10. 5道Python数据分析面试题
  11. 怎样去除掉心灵的杂草
  12. IT能力框架(模型)
  13. 用python播放声音文件(mp3、wav、m4a等)
  14. iuap 助力国贸股份打造数字化风控平台
  15. python简单爬取斗图图片(自学第十天)
  16. CSS命名规范-BEM
  17. dhs手术是什么意思_求教DHS的适应症和手术操作规范
  18. 聊聊C++跨类通信机制之消息总线及其实现
  19. 电玩世界——青龙羊毛
  20. JS 将数值取整为10的倍数

热门文章

  1. 小学计算机绘画简报,广州市小学电脑绘画、小报制作比赛简报.doc
  2. OSChina 周四乱弹 ——过节上班没关系,老王他休息!
  3. c语言,通过计算行最简的方式来求行列式的值
  4. 循环队列-击鼓传花游戏
  5. 5G科普——5G系统架构
  6. 干货!公平意识在在线元学习的研究
  7. Window自带远程控制
  8. 11、ADS使用记录之LNA设计
  9. oracle ORA-01704: string literal too long问题分析
  10. 计算机主板命名根据,华硕主板命名_技嘉主板命名_微星主板命名_快速看懂-太平洋电脑网...