Tag: 函数编程

使用Promise类型解决歧义并提高性能

最近,我们在标准银行工程部遇到了一个问题,即我们同时运行相同的服务调用。 在任何给定时间都有大量用户使用该应用程序的情况下,任何昂贵且不必要的服务调用都可能给您的后端系统带来巨大压力,并给应用程序以缓慢的感觉。 与往常一样,您可以遵循以下提供的游乐场文件: TYRONEMICHAEL /缓存的承诺 缓存的承诺–使用Promise类型 github.com 解决歧义并提高性能 描述最初的问题 我们有许多不同的功能团队。 如果我们需要特定团队的数据或功能,则该团队可提供面向公众的界面。 使用该接口的其他功能团队不在乎实现。 让我们看一个简单的例子。 这将是面向公众的界面的示例。 现在应该缓存所有服务调用,因此让我们编写一个用于缓存用户的快速接口和实现。 最后是实现公共接口的存储库的私有实现。 让我们退后一步,更详细地说明上述内容。 该实现检查缓存以查看我们是否有当前用户,如果找到用户,则返回该用户。 如果找不到用户,我们将触发服务调用以获取用户。 我们在后台线程上进行所有服务调用,从而防止任何人锁定主线程。 如果在主线程上完成了服务调用,则会引发致命的运行时错误。 提取用户后,我们将填充缓存。 您可以使用以下代码段测试上述内容。 现在,这种方法存在三个主要问题: 无法确定服务呼叫是否已触发并且尚未返回。 因此,我们可以在填充缓存之前发生多个服务调用。 如果我们看一下接口,我们不知道我们必须在后台线程上运行该函数。 是的,该应用程序将在运行时引发致命错误,但我们也不必查看实现。 最后,我们可能会意外地在主线程上调用getCurrentUser()而不是崩溃,因为缓存已被填充。 这是我们需要解决的三个重要问题。 使用Promise解决问题 在开始解决方案之前,重要的是要提及结果类型。 我在我的很多文章中都提到了它,但是基本上一个应用可以处于两种状态之一,即成功状态或失败状态 。 维基百科很好地总结了它。 结果类型提供了一种优雅的错误处理方式,而无需求助于异常处理。 当可能失败的函数返回结果类型时,程序员必须在获得预期结果之前考虑成功或失败的路径; 这消除了错误的程序员假设的可能性。 现在,程序可以进入另一个状态。这就是Promise Type的出现。Wikipedia再次很好地总结了Futures和Promises。 Promise and Futures描述一个对象,该对象充当最初未知的结果的代理,通常是因为其值的计算尚未完成。 基本上,您可以将Promise视为未来的结果 。 因此,更正我之前的陈述,程序实际上可以处于以下三种状态之一: 成功状态 失败状态 等待/未知状态 有很多框架和库影响了Promise或Future Type,但我专门使用Google的框架和库。 通过更新我们的界面: 至: 我们消除了所有歧义。 我们不再需要查看实现以确定是否必须在后台线程上运行该函数。 […]

Swift中的变形金刚

变形金刚? 直到最近,每当我听到“功能是Swift中的头等公民!” ,我希望将闭包作为方法中的回调或完成块传递,也许是要从异步网络调用中获取一些数据,如下所示: func fetchUsers(_补全:@转义([用户])->无效){ // .. } 或将代码块分配给变量: 让闭包= { 令a = 1 + 2 + 3 打印(a) } 真好 我们也知道Swift的map和其他高阶函数将闭包作为参数。 多进行一些挖掘,这将打开一个门户,进入另一个维度,即编写代码的功能方式。 等等,暂时不要下载RxSwift,我们可以从这里开始一些基础知识。 我对函子/单子的可疑理论 原来, map , flatMap , reduce之类的东西代表了Swift的功能风格。 Haskell是一种纯函数式语言,在Haskell的fmap和liftM之间直接映射到Swift的map和flatMap 。 这些实体称为函子或单子 。 这些来自类别理论。 如果我被迫开枪简要介绍我对该概念的非常有限的理解,我会说, 我们对基本类型执行操作的方式,函子/单子使我们即使在上下文中也可以对此类进行操作。 例如: func addTwo(int:Int)-> Int { 返回int + 2 } 让三个= addTwo(int:1)// 3 让threeOrMore = [1,2,3] .map(addTwo)// [3,4,5] […]

Swift中的功能设计模式:解释器

Swift与Java,C#和Objective-C不同。 这些都是出现在面向对象编程热潮高峰期的语言。 特别是Java和C#总是试图将您的解决方案压缩到面向对象的框架中。 自由功能不应该存在。 他们应该是某个班级的一部分。 从那时起,整个软件开发社区变得更加务实,并接受有时考虑功能而不是对象是有用的。 诸如Scala,Clojure,Swift,Kotlin和Julia之类的较新的编程语言都更加注重功能结构,而以OOP为代价。 最近,我读了Reza Shirazian关于Swift中的设计模式的博客,特别是解释器模式。 他展示了如何以Java和C#中的经典OOP传统实现设计模式。 我在这里想要做的是显示Swift中还有其他可用的方法。 这是功能性思维而非面向对象思维的演示。 这个想法是您尝试将问题组合成功能而不是对象的组合。 Reza的示例正在创建一个程序,该程序可以解析简单的数学表达式,例如: l + p-10.00 我们将不讨论如何从文本字符串创建解析树。 相反,我们将研究如何构建和评估表示该表达式的解析树。 因此,我们想要做的是创建一个抽象语法树,如上图所示,它表示我们的数学表达式。 Reza很好地介绍了这一点,因此我不再重复。 取而代之的是,我将研究如何在语法树中表示各个节点,以及如何将其组成以形成树以及如何评估该树。 下面是组成几个节点以形成这样的语法树的示例。 让expression =减去(add(variable(“ l”),variable(“ p”)),number(10.0)) 然后,我们可以使用绑定到变量l和p的值来评估它。 var结果= exp([“ l”:2.0,“ p”:4.0]) 在Reza的“面向对象”方法中,像“添加”节点这样的单个节点被表示为一个对象: 类添加:表达式{ var leftOperand:表达式 var rightOperand:表达式 init(leftOperand:Expression,rightOperand:Expression){ self.leftOperand = leftOperand self.rightOperand = rightOperand } func interpret(变量:[String:Expression])-> Double { 返回leftOperand.interpret(variables)+ rightOperand.interpret(variables) } } 他重复此模式来描述其他运算符,例如减法,除法和乘法。 […]

高阶功能适用于优雅的高级编码器

(((((()-> {})-> {})-> {})-> {})-> {} 好。 这篇文章有点愚蠢,因为我将使用另一个高阶函数编写一个高阶函数,以便向您展示什么是高阶函数。 我希望我不会犯任何错误。 高阶函数是将函数作为其参数的函数。 好吧,我认为该陈述并不能解释“全部”,但这是我可以向任何非编码者朋友解释的最简单的方法,所以请问。 无论如何,许多编程语言中都存在高阶函数。 我将在本文中使用Swift,但是所有其他语言的概念应该相同。 让我们深入研究。假设我们有一个整数数组。 让数组= [1,2,3,4] 这是将所有元素乘以2的Computer-science-101方法,这是 var newArray = [Int]() 对于0中的i .. <array.count { 让element = array [i] * 2 newArray.append(element) } print(newArray)// [2,4,6,8] 实际上,这里的for循环可以被forEach函数代替,后者是Swift附带的高阶函数。 甜… var newArray = [Int]() array.forEach({ newArray.append($ 0 * 2) }) print(newArray)// [2,4,6,8] 请注意,我们没有将0乘以2。 $ $ 0只是保留的简短形式,表示闭包的第一个参数。 不要问我为什么是$ 0。 […]

函数式编程:使用Swift

在技​​术行业中,有一种关于编程范例的炒作,对于许多人来说,这是很难理解的:函数式编程。 我不会介绍函数式编程起源的技术性。 因为真的吗 谁在乎? 我们将讨论的是函数式编程,这是通过Swift带来的荣耀。 每个人都知道FP的基础知识:基于函数的编程。 我将以这种基本理解为基础。 在我们深入探讨任何事物之前,让我先列举一下使用FP的原因,这将使FP更好地了解(并且在您难以理解事物时,可以帮助您避免自杀)。 函数式编程的原因 责任划分:由于您编写的所有内容都是基于功能的,因此它可以帮助团队在处理某个功能时更好地进行分工和征服。 因为在FP中,一个功能只能做一件事,而只能做那件事。 松散耦合:在OOP中,我们将类和对象作为构建基块。 每个行为都集中在一个对象中。 所有对象相互连接并相互依赖以执行完整功能。 这导致高耦合。 FP具有独立的功能,可促进松耦合。 可测试:由于上述原因,在OOP中进行测试变得困难。 FP可以轻松解决该问题。 可重用:FP功能如前所述是独立的,这有助于一遍又一遍地使用功能而无需重写。 减少冗余代码 可读性和可维护性:FP允许将代码划分为不同功能所执行的功能。 这消除了混乱和意大利面条的代码,有助于维护和理解代码库。 可追溯性:在FP中,功能是自包含的,因此是独立的。 因此调试和错误解决变得容易。 他们如何自我约束? 我会尽快告诉你 并行性:FP有一个无状态编程原理,我将在下面定义。 它要做的是获取要读取的每个资源的副本,而永远不会在该资源上写入。 这消除了死锁的可能性,并促进了并发操作。 什么是FP? FP遵循三个基本原则: 不变性:FP促进常数。 建议确保您的变量完全不改变值。 还是不经常,如果不可能的话。 无状态编程:FP中的任何功能都不会改变其外部程序/系统的状态。 如果函数将变量的状态更改为超出其自身范围,则它不是FP函数。 无副作用:通过上述行为,FP确保系统所做的一切对系统的任何其他部分均没有影响。 没有意外的数据行为,没有无法追踪的值变化。 这样可以确保每个功能都是独立的和独立的。 我们将在Swift中使用FP涵盖什么 在本节中,我们将讨论FP功能以及Swift中如何支持它们。 代数数据类型 模式匹配 功能 函子 应用程式 因此,现在您可以跳到您感兴趣的标题,而无需全部阅读。 代数数据类型 代数数据是通过组合其他类型而形成的类型。 考虑以下枚举,以供将来使用: 枚举NHLTeam {case canadienscase参议员case rangerscase企鹅caseblackHawkscase首府} enum […]

只是我的类型! — Swift中的自定义类型和错误处理

在坐下来编写代码之前,重要的是解决您需要处理的第一个错误,而不是try -ing。 阅读文档或花时间学习错误处理并不是大多数人都觉得有趣的时光。 起初绝对不是我的。 但是,在探索了有关该主题的一些教程和当代文献之后,我发现在构造自定义类型以处理错误方面有一定的赞赏。 无论您是终身使用的Swift开发人员,还是刚入门的人,都有可能听说过Functional Programming 。 函数式Swift是一个很棒的资源,它是Swift中函数式编程的简介。 尽管此资源着重介绍了许多很棒的主题,但我发现有关枚举和Swift错误的部分在我的项目中特别有用。 这篇文章将带您浏览一些受这些部分启发的示例。 以下示例可在我的演示存储库中的操场上找到。 随意克隆或下载仓库,然后继续! 我确定我们已经编写了所有方法来检查数组或字典中的某些值。 这些容器类型是Swift标准库的一部分,是iOS开发不可或缺的一部分。 在下面的示例中,我们将优化一种方法,该方法仅使用个人的memberName来检索团队成员的数量。 但是,要获取团队成员的数量,需要先查找团队。 构建此方法的合理方法可能如下所示: 使用可选的返回类型 func numberOfTeamMembers(memberName:String)->整数? {卫队让team = teamNames [memberName]否则{return nil} 后卫让号= teamMembers [team] else {return nil} 返回号码 } 然后,我们可以像下面这样在我们的代码中调用此方法: let someLookup = numberOfTeamMembers(memberName: “Tommy”) 还不错吧? 我们的numberOfTeamMembers(memberName:)方法将返回可选的Int? 如果查找成功。 否则,如果其中一项检查失败, someLookup将包含nil 。 尽管这似乎是解决问题的一种合理方法,但我们对查找失败的原因一无所知。 换句话说,如果上述方法返回nil ,那么我们将不知道哪些检查没有通过。 对于更复杂的方法,在跟踪查找错误的来源时可能会出现问题。 numberOfTeamMembers(memberName:)方法的缺点之一在于其返回类型Int? 。 如果我们可以创建自己的返回类型怎么办? 具体来说,如果查找成功,则可以返回Int的类型,如果查找失败,则可以返回详细的错误。 为此,我们可以尝试如下操作: […]

[서평]功能性思维

用户对RxSwift的评论,与在Google上的评论一样。 RxSwift가매력적인로그래밍가그래밍이해했지만,만기에기초가되는지식이다。 로프 미리객체지객체로향과로점이다。 。사용이라는다두고바라이다。 ,가책의지막이있듯이,다,문이에다좋이있듯다。 。사재사용하고다。 있고스를사용하는객체지향로향이있고다있고재사재맞춘로그래밍이함수형다。 。사용하기함수를사때마다른가안되겠다。 。프그래밍에서 유유 유유유유。 커링 私有化和私有化(私有,公共)。 。가적인만들지작업이가능하다。 func add(x: Int, y: Int) -> Int { return x + y } 하자가함수다고다고가정하자。 항상1추추할할할있을까? func addOne(x: Int) -> Int { return add(x: x, y: 1) } 。가있듯이이된된다。 일이다。 항상지만2,3,4,5될까가해주는될까? 4추가적인가필요하다。 자이렇게해보자。 func add(_ x: Int) -> (Int) -> Int […]