策略模式的功能类比是什么?

2024-01-05

免责声明:我不使用函数式语言;只是试图理解 FP 的某些部分。

Google 建议使用 lambda 的一阶函数可以提供与策略模式提供的类似功能的文章。

然而我们需要以某种方式匹配数据和相应的 lambda。通过 OO 设计,这是自动完成的虚拟方法表 (VMT) http://en.wikipedia.org/wiki/Virtual_method_table,即类型本身携带了推理执行流所需的重要信息,使得进一步添加新行为变得容易(开放封闭原则):继承和覆盖。旧代码保持不变。功能模式匹配在这方面似乎是静态的,并且不允许这种动态。

当然,可以编写一个可配置的匹配行为来根据给定的数据选择 lambda,但这不是我们在 OOP 中开箱即用的吗?


最简单的方法,我认为大多数人在谈论取代策略模式的高阶函数时所指的就是将策略作为参数传递给通用代​​码。下面是一个 Scala 示例,它对两个数字执行策略,然后将结果乘以 3:

def commonCode(strategy: (Int, Int) => Int)(arg1: Int, arg2: Int) : Int = 
  strategy(arg1, arg2) * 3

您可以这样定义各种策略:

def addStrategy(arg1: Int, arg2: Int) : Int      = arg1 + arg2

def subtractStrategy(arg1: Int, arg2: Int) : Int = arg1 - arg2

添加这样的调用:

commonCode(addStrategy)(2, 3)      // returns 15
commonCode(subtractStrategy)(2, 3) // returns -3

您可以使用部分应用程序来避免在各处传递策略:

val currentStrategy = addStrategy _
...
val currentCommon = commonCode(currentStrategy)_
currentCommon(2, 3) // returns 15

这很常见,我们不称其为策略或模式。这只是基本的函数式编程。这strategy参数到commonCode函数就像任何其他数据一样。您可以将其与许多其他函数一起放入数据结构中。您可以使用闭包或部分应用程序来关联其他特定于策略的数据。你可以使用像这样的 lambdacommonCode(_ / _)以避免给你的策略命名。

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

策略模式的功能类比是什么? 的相关文章

  • 异步编程设计模式

    我正在为 CF NET 开发一个小型技术框架 我的问题是 我应该如何编写异步部分的代码 在 MSDN 上阅读了很多内容 但我不太清楚 所以 这是代码 public class A public IAsyncResult BeginExecu
  • 使用 elm 高阶函数处理键盘事件

    我正在尝试创建一个高阶函数来创建仅捕获特定关键代码的函数 该代码的灵感来自 EvanonEnter来自他的 todomvc 实现的函数 仅捕获 Enter 函数 onKeyCode Int gt Msg gt Attribute Msg o
  • Java泛型 - 实现像map这样的高阶函数

    我决定用 Java 编写一些常见的高阶函数 map filter reduce 等 这些函数通过泛型实现类型安全 但我在一个特定函数中遇到通配符匹配问题 为了完整起见 函子接口是这样的 The interface containing th
  • 如何使用 FS2 中的分类器函数对对象进行分组?

    我有一个无序的流measurements 我想将其分组为固定大小的批次 以便以后可以有效地保留它们 val measurements for id lt Seq foo bar baz value lt 1 to 5 yield id va
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • 如何正确使用状态模式?

    在我的编程经验中 我遇到过一些状态模式的实现 并且完成了一些 我见过它们在各种场景中使用 主要是 UI 和解析 问题在于 所有这些在快速开发的压力下都变成了难以维护和理解的代码块 我正在考虑重构其中之一 但我无法在网上找到合适的资源 网上有
  • 需要澄清令人困惑的 Http4s 消息类型 `Response[F]` / `Request[F]`

    我很难理解为什么Request and Response参数化为F 类似的东西是猫效应数据类型资源 从文档中 https typelevel org cats effect docs std resource https typelevel
  • 在事件聚合器中混合枚举与事件类

    我最近尝试实现自己的简单事件聚合器 我从 MSDN 上的事件聚合器文章中获得了很多灵感 关于 MSDN 上的事件聚合器 我注意到一件事是事件实际上是它们自己的类 这根本不是一件坏事 然而 我只是觉得总是为每个小事件创建一个新的空类很尴尬 我
  • Haskell 有 takeUntil 函数吗?

    目前我正在使用 takeWhile x gt x 1 x 89 l 从列表中获取最多为 1 或 89 的元素 但是 结果不包括这些标记值 Haskell 是否有一个标准函数可以提供这种变化takeWhile结果中包含哨兵 到目前为止 我对胡
  • 将 javascript 放在 header 之外有多糟糕?

    这个问题几乎已经说明了一切 我开始添加一些功能到我的周末项目 http www my clock net 对于我和几个朋友来说 这是一个小应用程序 因为我们是交换生 所以它对我们来说有点有用 但事情是这样的 我在 php 中执行此操作并使用
  • 依赖注入容器——工厂模式

    我一直在尝试了解依赖注入 并一直在阅读并尝试编写一个类似于以下内容的小型依赖注入容器 http fabien potencier org article 12 do you need a dependency injection conta
  • 带参数的 Python 列表过滤

    python中有没有一种方法可以在列表上调用过滤器 其中过滤函数在调用期间绑定了许多参数 例如有没有办法做这样的事情 gt gt def foo a b c return a lt b and b lt c gt gt myList 1 2
  • RxJS 比命令式更快吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对函数式编程和函数式反应式编程比较陌生 我读了很多遍函数式反应式编程的强大力量 好的 可读 避免副作用等 但是 我不知道如何以功能
  • 状态机实现

    我正在尝试构建一个棋盘游戏 并且看起来它必须使用状态机来实现 我知道的状态模式 http en wikipedia org wiki State pattern来自 GoF 但我确信一定还有其他方法来实现状态机 请告诉我 如果您知道任何文章
  • C++ OOP:将哪些函数放入类中?

    假设我有一个a类 class a public void load data private void check data void work data void analyze data 这些函数都对类或其成员之一执行某些操作 然而这个
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • Haskell 真的是纯粹的吗(有任何语言可以处理系统外的输入和输出)吗?

    在谈到函数式编程中的 Monad 后 该功能是否真的使语言变得纯粹 或者它只是黑板数学之外的现实世界中计算机系统推理的另一张 免狱卡 EDIT 这不是有人在这篇文章中所说的火焰诱饵 而是一个真正的问题 我希望有人能用它来击倒我并说 证明 它
  • Either 相当于受检查的异常吗?

    从 Scala 开始并阅读有关Either我很自然地将新概念与我所知道的东西 在本例中来自 Java 进行比较 与之前有什么区别吗concept检查异常和Either 在这两种情况下 失败的可能性在方法中明确注释 throws或返回Eith
  • 全局常量是反模式吗?

    我一直认为仅仅为了保持常量而创建一个类是一个糟糕的设计 但最近 我尝试用谷歌搜索它 发现只有一个界面作为常量是不好的反模式 没有提到使用一类常量 我认为 由于常量类实际上与全局变量没有太大区别 这就是我反对它并倾向于重构此类类的原因 它创建
  • 如何在不进行尾调用优化的情况下用函数式编程替代方案替换 while 循环?

    我正在 JavaScript 中尝试一种更实用的风格 因此 我用诸如map和reduce之类的实用函数替换了for循环 然而 我还没有找到 while 循环的功能替代品 因为尾部调用优化通常不适用于 JavaScript 据我了解 ES6

随机推荐

  • 可能有类似 Autoit 的 JavaScript 宏吗?

    标题说明了一切 有没有办法在 JavaScript 中编写宏来实现与 Autoit 类似的功能 我只是想在我自己的计算机上 离线 操作文件 并且可以使用 autoit 轻松完成 但由于我目前正在学习 JavaScript 计划在 Node
  • 您可以在不使用 Storyboard 的情况下在 AutoLayout 控制台输出中标记视图吗?

    我正在观看有关 AutoLayout 的 WWDC 演讲 并且了解到在视图上设置 StoryboardID 可以使约束冲突的控制台输出更易于阅读 即 您得到一个名称而不仅仅是一个地址 他们向您展示了在 Interface Builder 中
  • 使用 Jest + Enzyme 测试 amplify Auth

    我对测试非常陌生 我终于觉得我已经掌握了它的窍门 然而 模拟仍然有点令人困惑 我目前正在测试注册功能 该功能执行到Auth signUp 我不确定是否需要在测试中模拟某些内容 或者是否需要它来运行不同的测试 async function s
  • 在 3D 图中绘制所有三个轴上的分布轮廓

    我在三维空间中有一个点云 并估计了这些点的一些分布 也在 3D 空间中 使用核密度估计 http docs scipy org doc scipy reference generated scipy stats gaussian kde h
  • 左循环 numpy 数组的最快方法(如弹出、推送队列)

    对于 numpy 数组 我想执行此操作 move x 1 x n 1 to x 0 x n 2 左移 在最后一个索引中写入新值 x n 1 newvalue 这类似于一个pop push newvalue 对于先进后出队列 仅倒置 一个简单
  • 具有两种类型标志的表上的 Laravel 关系

    我有两张桌子 products and users 这两个对象在表中都有与其关联的图像 images 图像表的架构是 编号 图像ID 资源 ID 旗帜 1 567575 1 用户 2 423423 423423 1 产品 根据这个标志 我正
  • 当视图再次出现时 RightBarButtonItem 消失

    我的问题是我的导航项中的 RightBarButtonItem 在视图第二次出现后消失 第一次加载视图时 它会正确显示 但第二次它会完全消失 该按钮在 viewWillAppear 中初始化 如下所示 UIBarButtonItem opt
  • Express.js 4 - 在静态文件之前使用中间件进行身份验证

    In my express我已经设置了要从应用程序提供的静态文件 public包含此行的目录 app use express static dirname public 现在 我需要在提供静态内容之前添加一个用于身份验证的中间件 并且如果用
  • 在哪里测试用 SPARQL 编写的 RDF 的查询

    我是语义网技术的初学者 我的问题可能是一个非常基本的问题 但我真的很难弄清楚 我有一个从 XML 创建的 RDF 文件 并使用 w3 org RDF VALIDATOR 对其进行了验证 我的问题是如何使用 SPARQL 对 RDF 文档运行
  • 将 HTML 代码作为甜蜜警报的文本传递

    我在用this https sweetalert js org 在我的应用程序中 我想使用如下所示的甜蜜警报 swal title Are you sure text You are going to delete b name b add
  • 如何在 std::string 和 Aws::String 之间进行转换?

    当尝试转换std string to an Aws String使用以下代码 std string s Johnny is cool Aws String aws s s 我收到以下错误 error no matching function
  • clang_complete:iOS 的 Vim 自动补全

    所以最近我一直在尝试建立一个基于Vim的iOS工作流程 我找到了 clang complete 并在我的 vimrc 中设置了 clang 用户选项 如下所示 let g clang user options fblocks isysroo
  • 如何推迟/推迟 f 字符串的评估?

    我正在使用模板字符串生成一些文件 并且我喜欢为此目的而使用的新 f 字符串的简洁性 以减少我以前的模板代码 如下所示 template a The current name is name names foo bar for name in
  • 如何避免 NumPy 中的“RuntimeWarning:除法中遇到无效值”?

    我试图避免警告RuntimeWarning invalid value encountered in divide在 NumPy 中 我想我可以这样做 import numpy as np A np array 0 0 print A dt
  • 迭代“std::multiset”的独特元素

    我所需要的只是知道某物是否存在以及它存在了多少次 我将迭代现有的事物并查询其中存在多少 到目前为止我的实现使用multiset 我这样做 std multiset
  • 附加到正在运行的进程的探查器?

    我需要一个适用于 Windows 和 Linux 的良好分析器 它们不必是同一个 针对每个操作系统的单独建议都可以 它可以附加到未以任何 特殊 方式编译的已运行进程 并给出我对进程花费大部分时间的函数进行统计 我有一些长时间运行的科学代码
  • 如何通过引用获取对象的大小?

    假设我有一堂课 class Foo 我还有另一个功能 void getf Foo f std cout lt
  • Facebook 点赞按钮 - 隐藏计数?

    In the 设置对话框 http developers facebook com docs reference plugins like对于 Like Button 布局只有两种选择 替代方案1 https web archive org
  • redux框架wordpress调用变量

    我已经通过 wordpress 安装了 redux 插件 非常棒 我一直在使用demo内容来熟悉框架 但我不知道如何调用模板中的数据 我已经使用选项树很长时间了 并发现了这一点 这是我认为正确的呼唤 但我想不是 这是我认为可以上传徽标的代码
  • 策略模式的功能类比是什么?

    免责声明 我不使用函数式语言 只是试图理解 FP 的某些部分 Google 建议使用 lambda 的一阶函数可以提供与策略模式提供的类似功能的文章 然而我们需要以某种方式匹配数据和相应的 lambda 通过 OO 设计 这是自动完成的虚拟