整个程序可以是不可变的吗? [关闭]

2024-06-11

  • 我熟悉不可变性并且可以设计不可变类,但我主要拥有学术知识,缺乏实践经验
  • 请参考上面的链接图片(尚不允许嵌入)
  • 从下往上看
  • 学生需要新地址
  • 我们并没有真正改变学生,而是创建一个包含新地址的新学生
  • mutator 方法返回这个新对象

Question:假设变异器调用来自不可变对象,如何处理这个新对象?

  • 新学生无法保存在 Lecture 中,因为 Lecture 也是不可变的
  • 所以我们还需要一个新的讲座,其中包含新的学生
  • 但是在哪里保存新的讲座呢?
  • 当然是在新学期,但它在哪里结束呢?
  • 至少可以通过使用组件外观模式来打破该链,该模式处理所有新对象的创建,而不必通过整个链转发调用

Question: 到哪里停呢?是否必须在某个地方有一个可变对象才能至少保存最顶层的实例?


这就是函数式编程的思想。一切都是不可变的,任何函数调用都不允许有副作用。改变复杂对象的唯一方法(如您的示例中)是重新创建父对象。

现在的问题是如何改变程序状态。因此,我们首先想到的是栈。它包含所有局部变量的值以及被调用函数的所有参数的值。我们可以通过调用新函数来创建新值。我们可以通过从函数返回来丢弃值。因此,我们可以通过调用函数来改变程序状态。然而,并不总是可以从函数返回来丢弃其局部变量,因为我们可能只想丢弃一些局部变量,但需要保留其他局部变量的值以供进一步操作。在这种情况下,我们根本无法返回,但我们需要调用另一个函数并仅将一些局部变量传递给它。现在,为了防止堆栈溢出,函数式语言有一个称为尾调用优化的功能,它能够从调用堆栈中删除不必要的条目。如果关联函数唯一需要做的事情就是返回自身调用的函数的值,则不需要调用堆栈条目。在这种情况下,保留调用堆栈条目是没有意义的。通过删除不必要的调用堆栈条目,其他未使用的局部变量的值将被丢弃。您可能想阅读相关内容here https://en.wikipedia.org/wiki/Tail_call. Also, 尾递归 https://stackoverflow.com/questions/33923/what-is-tail-recursion与此有关。

同样,这是纯函数式编程语言的想法,例如Haskell https://www.haskell.org/。一切都是不可变的,这真的很好,但是这些语言有它们唯一的问题和它们自己的处理这些问题的方法。例如,Monad(以及更高种类的类型)在这些语言中可用,但在命令式/面向对象编程语言中很少见到。

我喜欢在程序内存的叶子上有不可变的值。但是,组成这些不可变值(实际上形成应用程序逻辑)的代码确实包含可变状态。对我来说,这结合了两个世界的优点。然而,这似乎是一个偏好问题。

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

整个程序可以是不可变的吗? [关闭] 的相关文章

  • 从 Java 访问 Kotlin 类对象

    我有一个 Kotlin 类 它有一个类对象 例如 public class Foo public class object public val SomeValue Int 0 如果我从 Java 使用此类 如何访问类对象内的 SomeVa
  • Java从受限层调用方法

    我什至不确定这是否可行 但我想询问社区的总体意见 我必须解决以下问题 我的项目有 2 层 一个核心层和一个业务层 该核心层提供业务层 这时候Business类就可以导入Core类 为所欲为了 核心类只能导入核心类并使用其方法 禁止访问业务类
  • Java Web 应用程序的关闭钩子

    我需要在 java web 应用程序停止或 tomcat 停止时保存一些数据 如何才能做到这一点 编辑 如果我使用 jvm shutdown hook 有什么缺点吗 使用一个实现的类ServletContextListener https
  • 在 ant 中定义 Main-Class 来捆绑 jar 的混乱

    我正在尝试使用 Amazon Mechanical Turk API 构建一个 jar 文件 SDK 附带了一个 helloworld 文件 我试图将其打包作为健全性检查 它位于此处 http aws amazon com code SDK
  • Selenium2 中的 FirefoxDriver 是否有经过验证的 mouseOver 解决方法?

    我在用着硒Java 2 0b3 我有这个代码 WebDriver driver new InternetExplorerDriver Selenium seleniumDriver new WebDriverBackedSelenium d
  • 在 MacOS 命令行上使用 Android Studio 内置 Java

    这里有很多关于在 Mac 上安装 Java 以及让 Android Studio 使用正确版本的信息 很多已经过时 但是最近版本的 Android Studio 2 2 及更高版本 提供了自己的 Java 对于大多数 Mac 用户来说 没有
  • Spring-security - AccessDecisionVoter-impl 不会被调用

    我正在尝试创建自定义 AccessDecisionVoter 并在调用它时将其停止在调试中 我在每个方法中都设置了断点 但没有任何反应 spring security xml
  • JavaFX 在拖放完成后获取拖放目标文件夹

    Java Oracle 社区的问题 https community oracle com thread 3934986 https community oracle com thread 3934986 问题 我已经设置了下面的代码Butt
  • 如何在javafx中嵌入PApplet?

    所以我让我的处理代码在java中运行 但现在我想将它嵌入到我的 GUI 的 JavaFX 中 我怎样才能这样做呢 我尝试使用以下代码 但它似乎不起作用 package testprocessing import javafx applica
  • Freemarker、PDF、页眉/页脚和分页符

    Freemarker 的一个常见用途是生成 PDF 不幸的是 我必须生成一个包含很多页面的pdf 并且 他们 要求我添加包含一些信息的页眉和包含 第2 60页 等内容的页脚 在网上搜索我找到了如何创建宏模板 但它只共享一些常见标签 如css
  • 隐藏另一个布局的浮动操作按钮

    我有一个FloatingActionButton五月之内activity main xml名为的布局fabBtn 我的应用程序是用ViewPager和三个Fragments 我想隐藏FloatingActionButton当我的第一次Fra
  • Spring Boot,JPA 错误:“通过 JDBC 语句执行 DDL 时出错”

    我正在尝试使用一个非常基本的 到目前为止 Spring Boot 应用程序在我的 MySQL 数据库中添加一个条目 我使用了在网上找到的一些零碎内容 这是我试图遵循的代码 netgloo spring boot samples spring
  • 如何在 Spring Boot 中使用 CommonsMultipartResolver

    我尝试在 Boot 中使用 CommonsMultipartResolver 将我的旧应用程序 WAR 转换为 Boot 现在它得到以下代码 Configuration public class TestConfig Bean public
  • Java JDK中有并发List吗?

    如何创建一个并发 List 实例 在其中可以按索引访问元素 JDK 有我可以使用的类或工厂方法吗 ConcurrentLinkedQueue 如果您不关心基于索引的访问 而只想要列表的插入顺序保留特性 那么您可以考虑java util co
  • 如何知道机器的堆栈在内存中是向上还是向下增长? (JAVA)

    我有一个 C 程序来检查机器堆栈在内存中是向上还是向下增长 事情是这样的 include
  • 终极Java版本表(J2EE、Java EE、Servlet、JSP、JSTL)

    我正在寻找 Java EE 或以前称为 J2EE 和 Java SE 的组件分解 E g J2EE 1 3 Servlet 2 3 JSP 1 2 JSTL 1 0 J2EE 1 4 Servlet 2 4 JSP 2 0 JSTL 1 1
  • Eclipse 创建 Java 虚拟机失败

    我正在使用 eclipse 开发 android 应用程序 它总是进展顺利 但今天它出现了问题 当我尝试打开 Eclipse 时 它 向我显示此消息 Failed to create the java virtual machine Err
  • 使用 v8::Locker 的正确方法是什么?为什么必须使用它?

    我正在尝试使用 NDK 将 v8 嵌入到 Android 应用程序中 我有一个看起来像这样的 JNI 模块 未显示 JNI 映射代码 include
  • 使用lib添加自定义字体android

    我正在使用 android 自定义字体 lib Calligraphyhttps github com chrisjenx Calligraphy https github com chrisjenx Calligraphy 但对textv
  • java中的长轮询

    我已经编写了用于长轮询的服务器端代码 我想用java写客户端程序 因此 根据长轮询 客户端发送一个由服务器帮助的请求 当事件发生时服务器响应该请求 然后客户端发送新的请求 所以我面临的麻烦是用java编写的客户端 发送请求后 如何继续检查客

随机推荐

  • 在 '*' 标记之前编译“错误:预期 ')' 时出现多个相同错误

    我正在尝试用 C 语言编程 当我使用以下参数进行编译时 gcc D BSD SOURCE Wall ansi pedantic g tokenizer c FileOccur c WordList c wordstat c indexer
  • 使用与 eval 相反的括号表示法

    我有以下内容 var module function console log module ran var someString module string TypeError object is not a function eval s
  • 设计在 XHR 上抛出 HTTP 身份验证并注销

    我在使用 Devise 使用 OmniAuth 来验证我的 Rails 应用程序时遇到很多问题 我重新启动我的服务器并在隐身模式下打开一个新选项卡 以便清除 cookie 并加载我的应用程序 我登录 然后进入该应用程序 当我到达通过 AJA
  • Exec 战前目标存档包

    我想在打包战争之前运行 maven replacer plugin 我找到了 准备包 阶段 但它在战争组装和复制所有资源之前触发 但我需要在复制所有资源时和创建存档之前进行更改 这在maven中可能吗 顺便说一句 我使用 maven 2 2
  • 如何检查应用程序的 .NET 版本?

    除了在仅具有 NET Framework 版本 3 5 的计算机上运行之外 如何检查 NET 应用程序的版本 NET 框架版本控制在 NET 2 0 之后变为 foobar 一个应用程序的目标是CLR版本 它使用 EXE 的程序集元数据来实
  • Toast.LENGTH_LONG 和 Toast.LENGTH_SHORT 的值是多少?

    我正在我的应用程序中打印 Toast 消息以显示通知 但我想知道 Toast LENGTH LONG 和 Toast LENGTH SHORT 我还可以使用哪些其他值 谁能告诉我这两个变量的值是多少 还有另一个问题可以回答您正在寻找的内容
  • 核心数据推导表达式关键路径使用运算符作为中间组件

    我正在尝试编写一对多关系属性之和的派生表达式 我有一个商品和一个组 该商品有价格和总价 金额 价格 我想编写一个表达式 将该组的总价格作为其组成部分的总和 当我构建时出现错误 错误 属性配置错误 LAEItemGroup totalPric
  • MailChimp 取消订阅 URL 中每个参数的用途是什么?

    在以下 URL 中 从列表中取消订阅用户 http xxxxx us2 list manage com unsubscribe u 87f537bccxx35e53a1890e0d9 id 40dcxx6cd6 e c4aaxx1dd6 c
  • Numpy:查找两个 3-D 数组之间的欧几里德距离

    给定两个维度为 2 2 2 的 3 D 数组 A 0 0 92 92 0 92 0 92 B 0 0 92 0 0 92 92 92 如何有效地找到 A 和 B 中每个向量的欧几里得距离 我尝试过 for 循环 但速度很慢 而且我正在按 g
  • 从一个 NSManagedObjectContext 保存的更改不会反映在主 NSManagedObjectContext 上

    我有一个主NSManagedObjectContext是在appDelegate 现在 我正在使用另一个NSManagedObjectContext用于编辑 添加新对象而不影响主对象NSManagedObjectContext 直到我拯救它
  • 就地改变 numpy 函数输出数组

    我正在尝试编写一个对数组执行数学运算并返回结果的函数 一个简化的例子可以是 def original func A return A 1 A 1 为了加速并避免为每个函数调用分配新的输出数组 我希望将输出数组作为参数 并就地更改它 def
  • 将 Swift 闭包作为值添加到 Swift 字典中

    我想创建一个 Swift 字典 将 String 类型作为其键 将 Closures 作为其值 以下是我的代码 但它给了我错误 lvalue 与 String gt Void 不同 class CommandResolver private
  • 用 C# 解析和查询 SOAP

    我正在尝试解析一个大量命名空间的 SOAP 消息 源也可以在here http tinyurl com n3av6k
  • 如何解决 Xcode 7 中的 No Type or Protocol Named 错误?

    我试图passing从第二个开始的值class我正在使用的头等舱protocol and delegate过程 每当我运行我的程序时 我都会遇到以下问题 No Type or Protocol Named locateMeDelegate
  • 理解“窗口”对象[重复]

    这个问题在这里已经有答案了 可能的重复 JS 窗口全局对象 https stackoverflow com questions 10035771 js window global object 如何window对象工作 我知道它是顶级对象并
  • Liftweb 环境中的后台任务

    我必须编写守护进程 并且我想使用模型来连接到数据库和一些有用的 Lift 类 是否可以运行 Rails 的 rake 任务的模拟 Scala 社区组上也有类似的问题 答案是使用Actors来做后台处理
  • 转储 Windows DLL 版本的命令行工具?

    我需要一个命令行工具来转储标准 Windows DLL 版本信息 以便我可以通过 bash 脚本 Cygwin 对其进行处理 作为一名 Java 开发人员 我不太习惯 Microsoft 开发工具 尽管我对 Microsoft Visual
  • 使用 pytz 获取时区的国家/地区代码?

    我在用着pytz http pytz sourceforge net country information 我已经阅读了整个文档表 但没有看到如何做到这一点 我有一个时区 美国 芝加哥 我想要的只是获取该时区的相应国家 地区代码 美国 它
  • rspec 在需要存根的私有方法中测试私有方法

    Simplecov 检测到我遗漏了一些测试lib api verson rb class class ApiVersion def initialize version version version end def matches req
  • 整个程序可以是不可变的吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我熟悉不可变性并且可以设计不可变类 但我主要拥有学术知识 缺乏实践经验 请参考上面的链接图片 尚不允许嵌入 从下往上看 学生需要新地址