Scala的模式匹配是否违反了开闭原则?

2023-11-22

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

Pro: Odersky1 and Odersky2

Con: Beust

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


杰夫,我认为你有正确的直觉:这要看情况。

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala的模式匹配是否违反了开闭原则? 的相关文章

  • scala 返回列表中的第一个 Some

    我有一个清单l List T1 目前我正在执行以下操作 myfun T1 gt Option T2 val x Option T2 l map myfun l flatten find gt true The myfun函数返回 None
  • IntelliJ IDEA 能否正确格式化 scala.html 文件以及如何启用它?

    IntelliJ IDEA 12 Ultimate 和 CE 格式化我的 main scala html 文件中的以下行 在 Play 应用程序中 main css gt As main css gt 是的 真的 它分解了带引号的字符串 我
  • Scala 中的随机列表[重复]

    这个问题在这里已经有答案了 我对 scala 中的随机播放列表有疑问 使用scala util Random 例如我有 val a cyan val b magenta val c yellow val d key val color Ra
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 如何调用 Scala 抽象类型的构造函数?

    我试图弄清楚如何调用 Scala 抽象类型的构造函数 class Journey val length Int class PlaneJourney length Int extends Journey length class BoatJ
  • 创建新的保护子句

    在 Elixir 中 我将如何为函数创建新的保护子句 显然 我已经看到你不能只调用 a 中的任何函数when声明 但如果能够做这样的事情那就太好了 defmodule Player do def play card player do de
  • 如何决定使用 IS A 还是 HAS A Relation

    public class B public String getMe return Some 假设我有一个上面的类 我们应该通过哪些参数来决定使用什么 是否是一个或有一个关系 HAS A public class A public stat
  • sbt 找不到启动器 jar:./bin/sbt-launch.jar

    我已经成功地使用 sbt 进行基本的 Scala 编译好几年了 但有一天它由于某种原因停止工作 我在自己的帐户中使用它 但我决定让我的系统管理员在我们的本地网络上安装最新版本 当我尝试运行它时 我得到 找不到启动器 jar bin sbt
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • Scala 为了在 JVM 上运行做出了哪些妥协?

    Scala 是一种很棒的语言 但我想知道如果它有自己的运行时 如何改进 IE 由于 JVM 的选择 做出了哪些设计选择 我所知道的两个最重要的妥协是 类型擦除 http java sun com docs books tutorial ja
  • “对象之间通过传递消息进行通信”到底是如何实现的?

    在几本有关面向对象编程的介绍性文本中 我遇到过上述陈述 来自维基百科 在 OOP 中 每个对象都能够接收消息 处理数据 以及发送消息与其他对象相关 并且可以被视为具有独特角色或责任的独立 机器 该语句在代码中到底意味着什么 class A
  • 如何使用 zio-test 测试异常情况

    我有以下功能 我想测试 def people id Int RIO R People 如果有 People 则此函数返回 Peopleid 分别 如果没有则失败 例如 IO fail ServiceException s No People
  • scala 如何对元组进行排序?

    我试图了解 scala 如何处理元组的排序和排序 例如 如果我得到了列表 val l for i lt 1 to 5 yield i i 2 Vector 1 2 2 4 3 6 4 8 5 10 scala 知道如何对其进行排序 l so
  • sh / Bash shell 脚本中 !# (bang-pound) 的含义是什么?

    我想了解这个 Scala 脚本是如何工作的 usr bin env bash exec scala 0 object HelloWorld def main args Array String println Hello world arg
  • 如何考虑子类型的多态性

    里氏替换原则指出 超类型的不变量必须保留在子类型中 我对这个原理和多态性的交叉特别感兴趣 事实上 特别是子类型多态性 参数多态性和 Haskell 类型类似乎就是这种情况 因此 我知道当函数的参数是逆变且返回类型是协变时 函数是子类型 我们
  • 具有通用返回类型的可选函数参数

    您将如何实现通过正则表达式解析某些输入并将创建的字符串转换为其他类型的类 我的做法是 class ARegex T regex Regex reform Option String gt T def findFirst input Stri
  • 使用spark-sql从oracle加载数据时如何增加默认精度和小数位数

    尝试从 oracle 表加载数据 其中我有几列保存浮点值 有时它最多保存 DecimalType 40 20 即点后 20 位数字 目前 当我使用加载其列时 var local ora df DataFrameReader ora df l
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练

随机推荐

  • 更改 eclipse 创建 .eclipse、.p2 和其他文件夹的位置

    我看到 eclipse 在我的用户主文件夹中创建了一些文件夹 例如 eclipse p2 等 我想更改此默认文件夹 我想将所有内容保存在 D 位置 我读了这个在 Linux 中更改 eclipse 文件夹但我不明白我必须更改哪个文件 ini
  • 如何在 SQL 中创建 REPLACE PATTERN?

    我有一个很长的 NVARCHAR 变量 我需要在其中替换一些模式 如下所示 DECLARE data NVARCHAR 200 Hello PAT1 stackoverflow PAT2 world PAT3 我需要全部更换 PAT 带有空
  • 分配给设备内存的 CUDA 全局(如 C 语言)动态数组

    因此 我尝试编写一些利用 Nvidia CUDA 架构的代码 我注意到与设备进行复制确实损害了我的整体性能 因此现在我尝试将大量数据移动到设备上 由于这些数据被用于许多函数 我希望它是全局的 是的 我可以传递指针 但我真的很想知道在这种情况
  • 查找两个字符串共享的所有 n 个字长子串的最大长度

    我正在制作一个Python脚本 它可以找到两个字符串共享的所有n个字长的子字符串的 最长可能 长度 忽略尾随标点符号 给定两个字符串 这是一个示例字符串 这也是一个示例字符串 我希望脚本识别出这些字符串具有 2 个共同单词的序列 this
  • Spring Boot Jackson 日期和时间戳格式

    application yml配置 jackson date format yyyy MM dd timestamp format yyyy MM dd HH mm ss serialization write dates as times
  • 这是从文件中读取行并将其拆分为 Rust 中的单词的正确方法吗?

    编者注 此代码示例来自 Rust 1 0 之前的版本 在语法上不是有效的 Rust 1 0 代码 此代码的更新版本会产生不同的错误 但答案仍然包含有价值的信息 我已经实现了以下方法来以二维数据结构返回文件中的单词 fn read terms
  • 缓慢图像缩放的数学

    我有一个带有漫画书布局的 bmp 图像 目前我的代码是这样工作的 如果我右键单击并按住鼠标按钮 我可以在漫画书页面上的一个框架周围绘制一个选取框类型的框 当我释放按钮时 它将放大到该框架 但它是即时的 我希望它有动画效果 因此 不要将 Pi
  • 如何实现 ContentProvider 来向 Gmail、Facebook、Evernote 等提供图像

    我之前的问题 是否可以通过数据 URL 在 Android 上共享图像 与这个问题相关 我已经弄清楚如何在没有将文件写入外部存储的权限的情况下将图像从我的应用程序共享到另一个应用程序 但是 我仍然遇到一些问题行为 当我尝试从手机 Andro
  • 禁用特殊目录上的某些 php 功能

    我想禁用执行一些 php 函数 例如file put content exec eval在特殊目录上 我可以用disable functions在 php ini 中 但如何定义一个特殊的文件夹 例如c poject public 如果您的
  • 解析日期时间格式以获取格式字符串

    我希望能够得到格式字符串来自日期时间字符串 e g 2012 12 08 15 00 00 gt yyyy MM dd HH mm ss 2013 30 01 16 00 gt 年 日 月 时 分 这可能吗 以完全通用的方式很难做到这一点
  • 通过邮件发送 PDF 文件或提供应用程序直接查看文件

    我的 Android 4 应用程序可以创建 PDF 格式的不同报告 我想为用户提供通过邮件发送文件或在任何可以处理 PDF 文件的应用程序中打开文件的选项 目前我使用以下代码 Intent intent new Intent Intent
  • Pandas:根据目标分布从 DataFrame 中采样

    我有一个包含数据集的 Pandas DataFrameD都有一些连续值的实例x x以某种方式分布 比如统一 可以是任何东西 我想画画n样本来自D为此x有一个我可以采样或近似的目标分布 这是来自一个数据集 这里我只取正态分布 我如何从中采样实
  • mkmf 编译 C 扩展时会忽略子文件夹中的文件

    我想这样组织 C 源代码 ext native extension lib Source files are kept in here may contain sub folders native extension c native ex
  • ListBox DrawItem HotLight 在 OwnerDraw 模式下状态?

    我在用着OwnerDrawFixed作为我的 WinForms 应用程序中自定义 ListBox 控件的 DrawMode 当用户将鼠标悬停在列表框项上时 即在 MouseMove 上 我想重新绘制 ListBoxItem 的背景 或执行其
  • 使用向量来索引没有线性索引的矩阵

    你好 我正在尝试找到一种方法来使用 x y 点向量从 MATLAB 中的大型矩阵进行索引 通常 我会将下标点转换为矩阵的线性索引 例如使用向量作为矩阵的索引 但是 矩阵是 4 维的 我想获取具有相同第一维和第二维的第三维和第四维的所有元素
  • 全程锁定 iPhone 应用程序方向

    我收集最新版本的 iOS 中改变的方向方法 并且我没有使用 UIWebView 有没有办法将整个应用程序锁定为纵向模式 或者我是否必须强制每个视图控制器 在 iOS 7 中 您只能在项目 gt 常规 gt 部署信息中检查纵向
  • NodeJS npm 安装 pg 失败

    我尝试在我的 ubuntu 虚拟机上 npm install pg 但出现错误 gt email protected install usr local lib node modules core node modules pg gt no
  • 如何解决这个问题:在 logcat -->> 加载 /system/media/audio/ui/Effect_Tick.ogg 时出错?

    我有个问题 error loading system media audio ui Effect Tick ogg 当我单击 navdraw 图标时会显示它 有人可以帮助我吗 这是 logcat 上的错误 04 20 01 42 11 24
  • 有没有办法在我的 WPF 应用程序中使用 ODTTF 字体文件?

    创建 XPS 文件时 它会将原始文档的字体子集化并混淆为 ODTTF 字体文件 并将它们捆绑在 XPS 文件中 这只是一个 zip 文件 因此很容易提取它们 我已提取其中一个 ODTTF 文件 并将其作为资源包含在我的 WPF 应用程序中
  • Scala的模式匹配是否违反了开闭原则?

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