『软件工程』计算机界 TOP 3 难题:“相等”是软件工程中许多重大问题的根源( 八 )


程序员应该怎么做?
也许你读了这篇文章后会觉得 , “哇 , 相等好复杂!我还是不要编程了 , 回家种地算了 。 ”但这篇文章如此之长的原因主要是太多的语言都做错了 。 都作对的确需要些心思 , 但并不是太难 。 肯定比种地要简单 。
在已有的类型上进行相等比较时 , 先问问自己:

  • 在这里进行相等比较本身合理吗?
  • 如果合理 , 那么是应该进行结构比较 , 还是引用比较?
  • 对于相应的比较方法 , 我采用的编程语言提供了哪些支持?
  • 我采用的编程语言对于该比较方法的实现是正确的吗?
在设计自定义类型时也可以询问类似的问题:
  • 我的类型应该支持相等比较吗?还是需要一个更复杂的比较 , 就像float那样?
  • 我的类型应该是可改变的吗?它会对相等性产生怎样的影响?
  • 应该支持引用比较?还是结构比较?还是应该同时支持两者?
如果你的类型是可改变的 , 则应该考虑将其改成不可改变的 。 即使语言默认是可改变的 , 这一点也可以实现!这样做除了能在相等性比较方面获得许多好处之外 , 不可改变的架构还有许多其他的好处 。 采用了不可改变数据结构的C# Roslyn编译器就是非常好的例子:
语法树的第三个属性是 , 它们是不可改变的 , 而且是线程安全的 。 这意味着 , 在获得一棵树之后 , 它就是当前代码状态的快照 , 而且永远不会改变 。 这样多个用户可以在不同的线程中与同一个语法树同时进行操作 , 而无需担心死锁或重复的问题 。 由于树是不可改变的 , 也不能针对树进行直接的改变 , 因此负责创建和修改语法树的工厂方法实际上会创建树的新快照 。 树本身的效率很高 , 因为它会重用底层结点 , 所以创建新版本的速度很快 , 只需要使用少量内存 。
——.NET Compiler Platform SDK文档
原文:https://www.craigstuntz.com/posts/2020-03-09-equality-is-hard.html
?现代编程语言大 PK , 2020 年开发者关心的七大编程语言!
?MySQL 狠甩 Oracle 稳居 Top1 , 私有云最受重用 , 大数据人才匮乏!| 中国大数据应用年度报告
?如何用CNN玩转AlphaGo版的五子棋?
?曾经摸鱼的程序员 , 如今在武汉自愿加班
?区块链和大数据一起能否开启数据完整性的新纪元?
?以太坊2.0、分片、DAG、链下状态通道……概述区块链可扩展性的解决方案!


推荐阅读