oop - Scala 的模式匹配是否违反了开放/封闭原则?

标签 oop scala pattern-matching design-principles

如果我添加一个新的案例类,这是否意味着我需要搜索所有模式匹配代码并找出需要处理新类的位置?我最近一直在学习这门语言,当我读到一些支持和反对模式匹配的论点时,我一直对应该在哪里使用它感到困惑。请参阅以下内容:

临:
Odersky1
Odersky2

缺点:
Beust

每种情况下的评论也都很好。那么模式匹配是令人兴奋的东西还是我应该避免使用的东西?实际上,我想答案是“这取决于您何时使用它”,但是它有哪些积极的用例,哪些是消极的用例?

最佳答案

杰夫,我认为你有正确的直觉:这取决于。

当您有一组需要实现的相对固定的方法时,具有虚拟方法分派(dispatch)的面向对象的类层次结构很好,但是许多潜在的子类可能从层次结构的根继承并实现这些方法。在这样的设置中,添加新子类相对容易(只需实现所有方法),但添加新方法相对困难(您必须修改所有子类以确保它们正确实现新方法)。

当您拥有一组相对固定的属于某个数据类型的类时,具有基于模式匹配功能的数据类型是很好的,但有许多潜在的函数对该数据类型进行操作。在这样的设置中,为数据类型添加新功能相对容易(只需对其所有类进行模式匹配),但添加作为数据类型一部分的新类相对困难(您必须修改所有匹配的函数数据类型以确保它们正确支持新类)。

OO 方法的典型示例是 GUI 编程。 GUI 元素需要支持非常少的功能(在屏幕上绘制自己是最低限度的),但新的 GUI 元素一直在添加(按钮、表格、图表、 slider 等)。模式匹配方法的典型示例是编译器。编程语言通常具有相对固定的语法,因此语法树的元素很少更改(如果有的话),但不断添加对语法树的新操作(更快的优化,更彻底的类型分析等)。

幸运的是,Scala 允许您将这两种方法结合起来。案例类既可以进行模式匹配,也可以支持虚拟方法分派(dispatch)。常规类支持虚拟方法分派(dispatch),并且可以通过在相应的伴随对象中定义提取器来进行模式匹配。每种方法何时适合由程序员决定,但我认为两者都有用。

关于oop - Scala 的模式匹配是否违反了开放/封闭原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/563369/

相关文章:

javascript变量显示它之前的值

scala - Spark 流中是否需要检查点

ruby - open 关键字是 trait/mixin 吗?

sql - ORDER BY 更改了具有相同名称的列

python - 正则表达式 - 匹配最后出现的括号

c++ - 将多态性与模板结合使用

php - 仅遍历现有对象属性,而不是父类中的它们?

php - 从php中的子对象范围内访问父对象变量

mysql - 在使用 quill-async-mysql 和玩 2.6 时我应该使用什么模式演变?

haskell - Where 子句适用于多种模式