与可变结构相比,不可变结构有哪些优点?

2024-05-02

我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误,尤其是在多线程代码中。不过,在创建结构时,我看不出创建一个完全不可变的结构比创建一个可变的结构有任何好处。

让我们以保存一些分数的结构为例:

struct ScoreKeeper {
    var score: Int
}

在这个结构中,我可以更改现有结构变量的分数值

var scoreKeeper = ScoreKeeper(score: 0)
scoreKeeper.score += 5
println(scoreKeeper.score)
// prints 5

不可变版本看起来像这样:

struct ScoreKeeper {
    let score: Int

    func incrementScoreBy(points: Int) -> ScoreKeeper {
        return ScoreKeeper(score: self.score + points)
    }
}

及其用法:

let scoreKeeper = ScoreKeeper(score: 0)
let newScoreKeeper = scoreKeeper.incrementScoreBy(5)
println(newScoreKeeper.score)
// prints 5

我没有看到第二种方法相对于第一种方法的好处,因为结构是值类型。如果我传递一个结构体,它总是会被复制。因此,结构是否具有可变属性对我来说似乎并不重要,因为代码的其他部分无论如何都会在单独的副本上工作,从而消除了可变性问题。

不过,我看到有些人使用第二个示例,它需要更多代码,但没有明显的好处。有什么我没有看到的好处吗?


不同的方法将有助于对代码进行不同类型的更改。不可变结构与不可变类对象非常相似,但可变结构和可变类对象有很大不同。因此,如果由于某种原因需要使用类对象来代替,那么使用不可变结构的代码通常可以很容易地进行调整。

另一方面,使用不可变对象通常会使用修改版本替换变量的代码变得更加脆弱,以防向相关类型添加其他属性。例如,如果一个PhoneNumber类型包括 AreaCode、LocalExchange 和 LocalNumber 的方法以及采用这些参数的构造函数,然后为 Extension 添加“可选”第四个属性,然后是应该通过传递新区号来更改某些电话号码的区号的代码、 LocalExchange 和 LocalNumber 到三参数构造函数将删除每个电话号码的 Extension 属性,而可以直接写入 AreaCode 的代码不会出现该问题。

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

与可变结构相比,不可变结构有哪些优点? 的相关文章

随机推荐

  • C# - 应用程序的参数

    我怎样才能做到当程序名称末尾添加参数时它会执行特定的方法或其他什么 另外 这个有名字吗 Example 程序 exe i 我也见过 1 这些被称为命令行参数 有一个MSDN 上的很好的教程 http msdn microsoft com e
  • 跨多个表的 JPA 本机查询

    我将以下内容定义为存储库 dispenseRepository 中的本机查询 Query value SELECT p c s d from patient p consult c script s dispense d where p p
  • REST api:在一次获取中请求多个资源[重复]

    这个问题在这里已经有答案了 我正在尝试设计一个 RESTful API 用户可以在单个 GET 请求中获取单个产品或产品列表 每个产品都有一个唯一的 ID 单个产品 URL 非常简单 http mycompany com api v1 pr
  • R:将多列转换为单列[重复]

    这个问题在这里已经有答案了 我有一个看起来像这样的数据框 ID week1 t week1 a week2 t week2 a 1 12 22 17 4 1 15 32 18 5 1 24 12 29 6 2 45 11
  • Git 注释详细信息

    我读了this http git scm com 2010 08 25 notes html and this https github com blog 707 git notes display但仍然认为它们晦涩难懂 目前为止了解到 创
  • 类型不包含“GetProperties”的定义

    我正在将库项目迁移到 net 标准 当我尝试使用System Reflection调用APIType GetProperties 类型不包含 GetProperties 的定义 这是我的project json version 1 0 0
  • 需要有关上下文菜单的建议

    我有一个 XML 布局 其中有两个编辑文本字段 一个用于 标题 另一个用于 故事 当用户在这些文本字段中输入数据并按后退按钮时 该条目将作为标题集保存在列表视图中 列表视图出现在 A1 活动中 现在A1扩展了Activity 每当 长按 列
  • 使用堆属性按排序顺序打印树 (Cormen)

    我对算法理论 来自 Cormen 感到耳目一新 二进制尝试一章中有一个练习 要求 min heap 属性可以用来打印 n 节点的键吗 树在 O n 时间内排序 展示如何做 或解释为什么不做 我想是的 这是可能的 在最小堆中 节点中的元素小于
  • cesium:如何在Cesium中设置不同形状的Z-index?

    如何在Cesium中设置不同形状的Z index 请参阅下面的屏幕截图 我希望圆柱体内的广告牌图标显示在圆柱体上 提前致谢 这并不容易 因为您的圆柱体是实际的 3D 体积 并且您的广告牌位于其中 3D 渲染引擎中没有 CSS 样式的 Z 索
  • 如何以编程方式证明“六度分离”概念?

    我有一个包含 2000 万用户以及这些人之间的联系的数据库 如何证明 六度分离 的概念以最有效的方式在编程中 链接到有关六度分离的文章 http en wikipedia org wiki Six degrees of separation
  • 如何从 ModelState 键中删除前缀?

    例如 有一个Web Api操作方法 public HttpMessageResponse Post UserDto userDto if this ModelState IsValid return this Request CreateE
  • 当替换器使用变量时,如何调用 Regex::replace_all?

    对于下面的代码 我尝试输出输入单词 后跟随机字符串 第一个函数可以编译 但我不想要它 因为它不使用随机字符串 第二个函数会产生编译器错误 我如何解决它 use regex Regex fn main let cd rust ok but i
  • Python 中的数字列表求和[重复]

    这个问题在这里已经有答案了 给定一个数字列表 例如 1 2 3 4 5 我如何计算它们的总和 1 2 3 4 5 我如何计算它们的成对平均值 1 2 2 2 3 2 3 4 2 4 5 2 问题一 要对数字列表求和 请使用sum https
  • 任务返回类型出错 - “x 有错误的返回类型”

    我有一行代码 即 bool stop await Task
  • 如何在 RxJS 中通过 ID 去抖

    我的问题是下一个 我想取消我的应用程序的点赞功能 我使用操作在我的应用程序中进行更改 例如 dispatch likePost 1 gt dispatch type LIKE POST id 1 给出下一个例子 我在时间 0 发送一个操作
  • RabbitMQ Java 客户端自动重新连接

    当我的应用程序失去与 RabbitMQ 的连接时 我将其连接工厂设置为自动尝试并重新连接 ConnectionFactory factory new ConnectionFactory factory setUsername usernam
  • 为什么调用 parseInt 时需要使用基数参数?

    基数实际上意味着什么 为什么我们需要它 parseInt 10 radixValue 您可能并不总是希望将整数解析为以 10 为基数的数字 因此提供基数允许您指定其他数字系统 基数是单个数字的值的数量 十六进制为 16 八进制为 8 二进制
  • 合并 pandas 数据框中两列的连续日期

    ID Order ID statr date end date Product Sub Product 746 001 08 Oct 2019 0 00 00 16 Nov 2019 0 00 00 LPP Abc 746 002 10 O
  • 文本框中的逗号

    我想得到你的帮助来解决这个问题 当我创建一个文本框并输入 时重点是 我希望它出现 逗号 我已经尝试过使用 textBox Text Replace 但它不起作用 更多建议 先感谢您 protected void TextBox1 TextC
  • 与可变结构相比,不可变结构有哪些优点?

    我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误 尤其是在多线程代码中 不过 在创建结构时 我看不出创建一个完全不可变的结构比创建一个可变的结构有任何好处 让我们以保存一些分数的结构为例 struct ScoreKeepe