函数式编程概念
一、编程方式
1.1 面向对象编程OOP;
1.2 函数式编程Functional Programming:使用高阶函数,例如函数作为其他函数的参数;
1.3 响应式编程Reactive Programming:关注数据流和变化传播;
1.4 函数响应式编程:Functional Reactive Programming,就是通常说的FRP。
二、函数式编程的特性
2.1 函数是“第一等公民”。
函数与其他基础数据类型一样,处于平等地位。可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
2.2 闭包和高阶函数。
闭包是起函数作用并且可以像对象一样操作的对象。与此类似,函数式编程语言也支持高阶函数,高阶函数可以用另一个函数作为其输入参数,在大多数情况下,它甚至可以返回一个函数作为输出参数。这两种结构结合在一起,可以优雅的进行模块化编程,这是使用函数式编程的最大好处。
2.3 不改变状态(由此引申“引用透明”的概念)。
函数式编程只是返回新的值,不修改系统状态。在其他语言中,变量往往用来保存“状态”,不修改变量,意味着状态不能保存在变量中。函数式编程使用参数来保存状态,最好的例子就是递归。
引用透明。如果提供同样的输入,那么函数总是返回同样的结果,就是说表达式的值,不依赖于可以改变值得全局状态。这就可以从形式上推断程序行为,因此表达式的意义只取决于子表达式而不是计算顺序或者其他表达式的副作用。
2.4 递归。
函数式编程是用递归作为流程控制的机制。
2.5 “表达式”(expression)是一个单纯的运算过程,总是有返回值;”语句”(statement)是执行某种操作,没有返回值。
函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。原因是函数式编程的开发动机,一开始就是为了处理运算(computation),不考虑系统的读写(I/O)。”语句”属于读写操作,所以就被排斥在外。函数式编程强调没有”副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
MVVM
一、MVC及问题
MVC是Model —— View —— Controller,但是iOS开发者大多将其解释成Massive —— View —— Controller(重量级视图控制器),iOS开发中通常没有指出网络代码、数据组织代码所在的层级,导致Controller负责太多事情,导致代码变得臃肿复杂。因此需要给视图控制器(UIViewController)瘦身,对业务进一步分离。
传统MVC模式工程解耦会出现以下问题:
(1)iOS开发过程中,状态依赖(KVO)实现方式复杂,实用性小
(2)UIViewController比较复杂,代码耦合性高
为了解决MVC工程解耦时遇到的问题,MVVM流程起来了。
二、MVVM的引入
MVVM代表Model —— View —— ViewModel, 它主要解决Controller层复杂性高、耦合性高的问题,帮助我们重新组织工程代码。我将要在这里展示的 MVVM 的风格, 它跟 MVC 十分兼容,只要我们将 MVC中Controller层的代码分开处理即可完成。
(1)Model 在 MVVM 中没有真正的变化。 取决于你的偏好, 你的 model 可能会或可能不会封装一些额外的业务逻辑工作。我更倾向于把它当做一个容纳表现数据-模型对象信息的结构体, 并在一个单独的管理类中维护的创建/管理模型的统一逻辑。
(2)View包含实际 UI 本身(可以是 UIView 代码, xib,storyboard), 可以包含视图特定的逻辑, 或用户操作的反馈。在 iOS 中这不仅需要 UIView 代码和那些文件, 还包括部分UIViewController。
(3)ViewModel这个术语本身比较疑惑, 因为它混搭了前面两个我们已知的术语, 但却是完全不同的东西。 它不是传统模型层和视图层的结合,它的职责之一就是作为一个中间层连接模型层(Model);它还承担收集、解析和转换数据的责任。这将这留给了 view (controller) 一个更加清晰明确的任务:承载View层视图,组织展示由 view-model 提供的数据。
对比两种模式,可以简单的认为MVVM比MVC多了一个中间层View-Model ,可以理解为: 我们将Controller中的网络请求代码、数据管理代码和部分业务代码移动到了它拥有的View-Model 中。这样UIViewController 就能够专注的负责View的管理、界面流程跳转。
尽管我们的代码并有没有减少,代码层次增加了,但是Controller由臃肿变得简洁,由复杂变得清晰。针对功能单一的层次代码,我们易于理解,也方便进行单元测试。总的来说,MVVM模式更加适合iOS移动APP工程开发。
MVC模式 MVVM模式
网友评论