如何在App开发中使用Functional Programming

Rod*_*uiz 8 functional-programming ios swift

我一直在阅读和使用功能编程(FP),我非常喜欢它的概念,但我不确定如何将它们应用于我的大多数应用程序.

我将更具体,让我们谈谈iOS应用程序.我确实看到了如何使用一些概念,如不可变数据结构和高阶函数,但不知道如何使用/大多数纯函数 - 避免副作用 - 这似乎是FP的主要部分.

我觉得这个应用程序的大部分内容都是关于协调输入调用,显示数据,保存数据,发出网络请求,从一个屏幕导航到另一个屏幕,动画.

所有这些都是FP上不纯的功能:

  • 协调输入:按钮点击,通知,服务器套接字推送,所有那些我必须决定呼叫什么,在哪里观察它们等.
  • 显示数据:从本地数据库或服务器读取(副作用).
  • 保存数据:与上述相同(但写作).
  • 制作网络请求:很明显,所以我在这里举一个例子 - 从Instagram中检索列表图像.
  • 导航:这基本上是呈现视图控制器,这是一个副作用.
  • 动画:改变屏幕上的内容,副作用.

我必须处理数据的地方很少,而且几乎总是从数据库中检索一些Struct并将多个信息连接到View Controller将使用的另一个Struct(就像5行......假设你需要在视图中显示5个属性).当然,你可能需要做一些像转换这样的处理money: Int = 20 to moneyString: String = "US$\(money).00",但就是这样.

我觉得我在应用开发周期中没有实现FP.任何人都可以澄清我如何实现这一目标吗?也许有例子.

谢谢.

编辑:现在,按照清洁架构的想法,我有这样的东西作为我的架构:

在此输入图像描述

输入可以来自View,按钮点击,他们去ViewController谁决定Interactor拨打哪个.这Interactor将访问必要的Gateways以获取一些数据并将其转换为可传递给Presenter(以委托形式)的可呈现数据.最后Presenter将更新View以显示新数据.

此外,输入可以来自External源,如服务器告诉您某些数据已更新,您必须刷新View.这将是Interactor(以观察者的形式),它将跟随链的其余部分,如前面的例子.

唯一的FP部分是将Gateway数据转换为可显示的数据.所有其他都有副作用.我觉得我做错了,也许有些代码应该以不同的方式组织,以便更多的代码可以转移到纯函数.

Ala*_* T. 1

您的工具箱中应该始终有不止一种工具。FP 是一种很好的方法,也是大多数人在应用程序的各个部分都应该遵守的规则(例如,通过 MVVC 中的视图控制器在视图上呈现模型)。

尝试在应用程序中的所有内容上使用 FP 可能并不值得。一旦您要保存数据或管理时间的流逝,您就必须处理状态。即使是“restful”服务(在概念上是 FP 方法的良好候选者)也不会是纯粹的 FP 并且具有一定的状态依赖性。这并不是因为它们是糟糕的 FP 实现,而是因为它们的目的是管理外部持久状态。您可以旋转它以将存储的数据视为“输入”,但从服务的任何一侧,另一侧仍然会产生副作用(只读操作除外)。

如果您接受 MVVC 负责管理状态转换这一事实,并允许其组件之间存在非 FP 关系,那么为每个组件实现较小规模的 FP 范例就会变得更容易。

例如,您的视图控制器不应具有任何复制或维护模型中任何数据的转换版本的变量。在某些情况下,在 MVVC 组件之间使用委托确实会违反 FP 规则,但在视图控制器的功能范围内,这些是输入(而不是状态)。通过在开始编码之前规划(和绘制)交互图,您将能够更好地隔离关注点,而不会陷入破坏组件内的 FP 的死胡同。

在模型本身内,计算属性可以在很大程度上确保您遵守 FP。

无论如何,如果您从不使用 var 语句(这在某些地方将是一个挑战),您可能最终会得到符合 FP 的代码。