美文网首页我爱编程
2018-04-08 编程思想

2018-04-08 编程思想

作者: 贝灬小晖 | 来源:发表于2018-04-09 14:26 被阅读67次

第一种:面向函数编程
1.面向函数编程

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

但真的看了一遍 爱是摸不到头脑的感觉

真的从需求角度来理解吧

  • 有一个数组, 数组中存放很多数字
  • 需求: 从数组中帅选出所有的偶数

// 定义数组(当然其他数字也可以)
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

// 解决方案一:
var evens = Int
for n in numbers {
if n % 2 == 0 {
evens.append(n)
}
}

print(evens)

方案解决了问题, 但是是否有缺陷呢?

  • 如果我希望得到所有的奇数应该怎么办?
  • 对! 复制一份, 或者直接在循环中判断.
  • 那么, 如果我想获得3的倍数, 4的倍数, 5的倍数数字呢? 复制多份? 显然并不合理.
  • 对! 扩展性非常的差!

// 解决方案二:
let evens1 = numbers.filter { (num : Int) -> Bool in
return num % 2 == 0
}

方法的解析
filter接受一个闭包参数
闭包本身有一个Int类型参数, 表示数组中的数字
返回值是一个Bool类型. 用于过滤符合条件的数字
当满足条件时, 就会将满足条件的数字放入到数组中
这样做有什么好处?
如果我选择获取奇数, 只需要将==改成!=
如果我希望获取3/4/5的倍数, 只需要改变2

let eveee = numbers.filter{$0 % 2 == 0}
甚至我们的代码还可以这样写:
Swift闭包的简单写法而已, $0表示用于获取第一个闭包参数
不熟练可以暂时忽略这种写法
let evens2 = numbers.filter { $0 % 2 == 0 }

三. 什么是函数式编程?
什么是函数式编程呢?

函数式编程其实是一种编程思想, 代码写出来只是它的表现形式.
在面向对象的编程思想中, 我们将要解决的一个个问题, 抽象成一个个类, 通过给类定义属性和方法, 让类帮助我们解决需要处理的问题.(其实面向对象也叫命令式编程, 就像给对象下一个个命令)
而在函数式编程中, 我们则通过函数描述我们要解决的问题, 以及解决问题需要怎样的方案.
函数本身可以作为变量, 作为参数, 作为返回值(这样说有一点抽象, 下面的解决方案中就是将函数作为函数的参数)

四. 示例程序分析

面向对象的思考
我现在要对一个数组进行处理, 我可以封装一个用于处理数组各种情况的工具类
工具类中我提供下面几个方法
1> 获取该数组所有的偶数
2> 获取该数组所有的奇数
3> 获取数组中其他数字
当然你也可以让调用方法的时候多传递几个参数, 来确定我获取的到底是什么, 以便于让内部进行处理.
但是工具类不可能考虑到各种情况, 另外到底要对数组进行怎样的处理, 其实调用者最清楚.
那么为何不让调用者把要做怎样的操作给我传递过来呢?

2.函数式编程的思考

如果系统没有filter函数, 我们可以自己给Array扩充一个这样的函数
封装一个函数, 函数的参数是一个对数组中数字的操作.
这个数字到底是 %2 %3 %4, 将这样的操作传递进去
既然是一个操作, 操作本身就是一个函数
所有, 函数的参数是一个函数.(没错, 让函数作为函数的操作)

// 给系统Array扩充函数
extension Array {
func myOwnFilter(oprationFunc : (Int) -> Bool) -> [Int] {
var tempArray = Int
for item in self {
if oprationFunc(item as! Int) {
tempArray.append(item as! Int)
}
}
return tempArray
}
}

// 用自己的函数解决问题
let evens3 = numbers.myOwnFilter { (num : Int) -> Bool in
return num % 2 == 0
}
print(evens3)

  • 扩充的函数要求传递的是一个闭包, 闭包其实就是一个特殊的函数. 因此, 扩充的函数传递的是另外一个函数
  • 在扩充的函数中我们通过传递的函数来判断数字是否符合需求, 符合需求, 则加入数组中.
  • 这样我们就可以根据用户自定义的需求来过滤需要的数字了.

如果我们的写的更有扩充性, 可以使用泛型

  • 比如: 获取字符串数组中包含"w"的字符串
  • 这个时候需要这样来修改我的函数

extension Array {
func myOwnFilter(oprationFunc : (Element) -> Bool) -> [Element] {
var tempArray = Element

    for item in self {
        if oprationFunc(item) {
            tempArray.append(item)
        }
    }
    
    return tempArray
}

}

五. 函数式编程有什么用?

函数式编程最早诞生于1958年, 在Lisp语言使用.
Lisp是什么?
Lisp有各种神奇的传说, 比如天才程序员通常使用Lisp, 比如用其他语言实现一个功能需要上千行的代码. 用Lisp只需要少许的代码.
Lisp目前并没有流行起来, 这可以说不是一门编程语言, 而是一门数学课.
Lisp被应用比较广泛的场景还是在人工智能中
石器时代的函数式编程, 是否有学习的必要呢?
其实目前非常火的语言包括Python、Ruby、Javascript, 对函数式编程的支持都很强, 就连java、PHP都有加入匿名函数(本质也是一种函数式编程)

第二种:链式编程
3.链式编程
链式编程就是将多个方法用点语法链接起来,让代码更加简洁

make.width.height.equalTo(0);

我们设置一个控件的top和left距离父控件为1:
contentView.snp_makeConstraints { (make) in
make.top.left.equalTo(1)
}

SnapKit 中就有了很多链式思想

第三种:面向切面编程

相关文章

  • 2018-04-08 编程思想

    第一种:面向函数编程1.面向函数编程 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一...

  • python面向对象1

    编程思想 编程思想:面向过程编程(穷人思想)、函数式编程、面向对象编程(富豪) 面向过程编程: 算法和逻辑 函数式...

  • 链式编程思想

    链式编程思想 链式编程思想

  • Day14 面向对象基础

    一.编程思想 编程思想: 面向过程编程(穷人思想), 函数式编程, 面向对象编程(富豪) 1.求1+...+100...

  • 寻找“高深术语”中活泼泼的地气

    面向对象的编程思想 编程,很简单,敲代码;思想,也简单,深思细想;编程思想,或者说思想编程,一说就知道难了,难在哪...

  • 前端思考

    编程语言 编程思想 编程能力 学习能力

  • 《Java编程思想》——《Java编程思想》——

  • 编程思想

    编程思想要解决的问题是什么? 编程思想的核心目的是,对现实世界建模。 当前流行哪些编程思想? 1. 面相对象编程 ...

  • 编程思想

    图解设计模式 Iterator 模式 设计模式 Iterator 模式如何提升你的阅读能力? 导读:今天这篇文章是...

  • 编程思想

    响应式 函数式 链式

网友评论

    本文标题:2018-04-08 编程思想

    本文链接:https://www.haomeiwen.com/subject/uwpmhftx.html