Questions tagged «state»

4
在以“功能”风格进行编程时,您是否在应用程序逻辑中编织了一个应用程序状态?
如何构建具有以下所有功能的系统: 对不可变对象使用纯函数。 只传递给它所需功能的数据,不再传递(即没有大的应用程序状态对象) 避免对函数使用过多的参数。 避免仅出于将参数打包和拆包到函数的目的而构造新对象的方法,只是避免将过多的参数传递给函数。如果我要将多个项目作为一个对象打包到一个函数中,则我希望该对象成为该数据的所有者,而不是临时构造的东西 在我看来,State monad违反了规则2,虽然它并不明显,因为它是通过monad编织而成的。 我觉得我需要以某种方式使用Lenses,但是关于非功能语言的文章很少。 背景 作为练习,我将现有的应用程序之一从面向对象的样式转换为功能样式。我要尝试做的第一件事是尽可能多地利用应用程序的内核。 我听到的一件事是,如何用一种纯函数式的语言来管理“状态”,而我相信这是由State monad完成的,从逻辑上讲,您称一个纯函数为“传递状态”。世界原样”,那么当函数返回时,它会返回给您变化后的世界状态。 为了说明这一点,您可以用一种纯粹的功能性方式来创建“ hello world”的方式有点像,您将程序的屏幕状态传递给程序,然后返回印有“ hello world”状态的屏幕状态。因此,从技术上讲,您要调用一个纯函数,并且没有副作用。 基于此,我遍历了我的应用程序,并且:1.首先将我的所有应用程序状态放入单个全局对象(GameState)中。2.其次,使GameState不可变。您无法更改。如果需要更改,则必须构造一个新的。我通过添加一个复制构造函数来做到这一点,该复制构造函数可以选择接受一个或多个已更改的字段。3.对于每个应用程序,我都将GameState作为参数传递。在函数内,在完成将要执行的操作后,它将创建一个新的GameState并返回它。 我如何拥有纯功能核心,以及外部的循环,该循环将GameState馈入应用程序的主工作流程循环。 我的问题: 现在,我的问题是,GameState有大约15个不同的不可变对象。最低级别的许多功能仅对其中一些对象起作用,例如保持得分。因此,假设我有一个计算得分的函数。今天,GameState传递给此函数,该函数通过使用新分数创建新的GameState来修改分数。 似乎有些错误。该功能不需要完整的GameState。它只需要Score对象。所以我更新了它以传递分数,并仅返回分数。 这似乎很有意义,所以我进一步介绍了其他功能。有些功能需要我从GameState传入2、3或4个参数,但是随着我一直在应用程序的外部核心中使用该模式,我传入了越来越多的应用程序状态。就像在工作流循环的顶部,我将调用一个方法,该方法将调用将调用一个方法的方法,依此类推,一直到计算分数为止。这意味着当前分数会通过所有这些层,只是因为最底层的函数将要计算分数。 所以现在我有了带有数十个参数的函数。我可以将这些参数放入一个对象中以减少参数数量,但是然后我希望该类成为状态应用程序状态的主位置,而不是在调用时简单地构造以避免重复传递的对象输入多个参数,然后解压缩它们。 所以现在我想知道我的问题是否是我的函数嵌套得太深了。这是因为希望具有较小的功能,所以我在一个功能变大时进行重构,然后将其拆分为多个较小的功能。但是这样做会产生更深的层次结构,即使外部函数未直接在这些对象上运行,传递给内部函数的所有内容也都必须传递给外部函数。 似乎只是在避免这种问题的过程中传入了GameState。但是我回到了原来的问题,即向函数传递比函数所需更多的信息。

4
“ OOP隐藏状态”是什么意思?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 在cat-v.org上的许多反OOP咆哮中,我发现Joe Armstrong的一段话提出了一些反对OOP模型的异议,其中之一是: 异议4 –对象具有私有状态 国家是万恶之源。特别应避免具有副作用的功能。 尽管编程语言中的状态是不可取的,但在现实世界中,状态比比皆是。我对银行帐户的状态非常感兴趣,当我从银行存款或取款时,我希望银行帐户的状态能够正确更新。 考虑到现实中存在状态,编程语言应提供哪些设施来处理状态? OOPL说“隐藏程序员的状态”。状态只能通过访问功能隐藏和看到。常规编程语言(C,Pascal)说,状态变量的可见性由该语言的作用域规则控制。纯声明性语言表示没有状态。系统的全局状态包含在所有功能中,并且来自所有功能。诸如monads(用于FPL)和DCG(逻辑语言)之类的机制用于向程序员隐藏状态,以便它们可以“好像状态无关紧要”进行编程,但在必要时可以完全访问系统状态。 OOPL选择的“从程序员隐藏状态”选项是最糟糕的选择。他们没有揭露状态并试图找到最小化状态滋扰的方法,而是将其隐藏了起来。 这到底是什么意思?我几乎没有底层或程序方面的经验,主要是OOP,所以这可能解释了我对此有多么不熟悉。从更现代的角度来看,现在大多数面向对象的歇斯底里都通过了(至少据我所知),你们认为这种通过的准确性/相关性如何? 谢谢你的帮助。

8
变量如何引入状态?
我正在阅读“ C ++编码标准”,并且此行在其中: 变量会引入状态,因此您必须处理尽可能少的状态,并且生存期应尽可能短。 最终变异的所有东西都不会操纵状态吗?什么是你应该有应对尽可能少的状态尽可能的意思吗? 在不纯正的语言(例如C ++)中,状态管理不是您真正在做什么吗?除了限制可变寿命之外,还有什么其他方法可以处理尽可能少的状态?

1
功能语言中的UI模式
我想开始摆弄ClojureScript,但是我对某些要点感到困惑。我的问题是,当您尝试进行功能性工作时,什么是应对来自用户交互的状态更改的好方法? 让我举几个例子。我考虑过在浏览器中运行的应用程序,但是我认为这个问题更为普遍。当然,某些事情将会改变-至少是DOM。但我想了解如何组织其余代码以使用不可变数据结构。 1)说我想将一些事件附加到某些DOM对象。这在大多数情况下都不是很难做到的:在创建节点时,将其附加有各种事件处理程序的哈希映射。但是考虑使用事件委托的情况。然后,在创建新节点时,可以将事件处理程序附加到可能已经存在的某个父节点。因此,您将不得不更改与现有节点关联的哈希。 2)说我正在为输入字段设计一个自动完成模块。每次用户按下一个键,我都可以致电服务器以获取建议。这很简单。但是现在假设我想对其进行一些优化。如果我知道所有结果都匹配,foo那就没有必要再要求所有结果匹配了foobar; 我可以过滤前者。所以我需要建立某种缓存。每当用户插入一个新单词(而不是先前输入的单词的超集)时,此缓存就会更新。再说一遍:如何为缓存建模?最合理的方法似乎是将单词映射到结果的哈希映射,但是它应该是可变的。 您能否提出一些模式,以使其更容易将由于用户交互而引起的更改合并到功能设计中?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.