如果我添加一个新的案例类,这是否意味着我需要搜索所有模式匹配代码并找出需要处理新类的位置?我最近一直在学习这门语言,当我读到一些支持和反对模式匹配的论点时,我一直对应该在哪里使用它感到困惑。请参阅以下内容:
临:
Odersky1和
Odersky2
缺点:
Beust
每种情况下的评论也都很好。那么模式匹配是令人兴奋的东西还是我应该避免使用的东西?实际上,我想答案是“这取决于您何时使用它”,但是它有哪些积极的用例,哪些是消极的用例?
最佳答案
杰夫,我认为你有正确的直觉:这取决于。
当您有一组需要实现的相对固定的方法时,具有虚拟方法分派(dispatch)的面向对象的类层次结构很好,但是许多潜在的子类可能从层次结构的根继承并实现这些方法。在这样的设置中,添加新子类相对容易(只需实现所有方法),但添加新方法相对困难(您必须修改所有子类以确保它们正确实现新方法)。
当您拥有一组相对固定的属于某个数据类型的类时,具有基于模式匹配功能的数据类型是很好的,但有许多潜在的函数对该数据类型进行操作。在这样的设置中,为数据类型添加新功能相对容易(只需对其所有类进行模式匹配),但添加作为数据类型一部分的新类相对困难(您必须修改所有匹配的函数数据类型以确保它们正确支持新类)。
OO 方法的典型示例是 GUI 编程。 GUI 元素需要支持非常少的功能(在屏幕上绘制自己是最低限度的),但新的 GUI 元素一直在添加(按钮、表格、图表、 slider 等)。模式匹配方法的典型示例是编译器。编程语言通常具有相对固定的语法,因此语法树的元素很少更改(如果有的话),但不断添加对语法树的新操作(更快的优化,更彻底的类型分析等)。
幸运的是,Scala 允许您将这两种方法结合起来。案例类既可以进行模式匹配,也可以支持虚拟方法分派(dispatch)。常规类支持虚拟方法分派(dispatch),并且可以通过在相应的伴随对象中定义提取器来进行模式匹配。每种方法何时适合由程序员决定,但我认为两者都有用。
关于oop - Scala 的模式匹配是否违反了开放/封闭原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/563369/