1. Immutable Data
let foo = "bar"
한번 데이터를 넣으면 그 데이터를 바꾸지 마라.
(= 새로운 데이터를 사용하고 싶으면 새로 선언해서 사용해라)
2. Pure Function
함수 밖에 있는 변수를 바꾸지 말고, 안에서 변수를 만들어서 사용해라.
(같은 Input 에서 같은 Output을 내보내는 것)
3. Fuction as First-Class Citizen
Function을 일급 객체로 사용해라 (Swift에서 지원)
4. Lazy Evaluation
func heavyJob() -> String {
return "This is heavy job"
}
func Log(_ mesage: String) {
#if DEBUG
print(message)
#endif
}
func Log(_ mesage: () -> String) {
#if DEBUG
print(message())
#endif
}
Log(heavyJob()) // 릴리즈 버전에서도 heavyJob() 를 일단 실행 후 작동
LazyLog(heavyJob) // 릴리즈 버전에서도 매개변수로 함수가 전달되기 때문에 작동하지 않음
위 예제와 같이 함수의 실행을 Lazy하게 실행시켜 효율적으로 개발이 가능하다.
5. High-Order Function
다른 함수를 전달인자로 받거나 함수 실행 결과를 함수로 리턴하는 함수 (ex: Filter, Reduce, Map)
6. Recursing
효율을 높이기 위해 재귀 함수를 사용한다.
특히 재귀를 맨 끝에 구현하는 경우 : 꼬리 재귀 -> Swift는 컴파일러가 최적화를 지원한다.
7. Currying
함수를 리턴하는, 함수를 리턴하는, 함수를 리턴하는 함수
(이해가 잘 안되는데.. 따로 알아봐야 할듯)
그래서 FP가 무엇인가..?
Function No Side-Effect Declarative Programing
함수를 이용해서 사이드 이펙트 없이 선언형 프로그래밍을 하는 것
-> No Side Effect가 KEY
//non-FP : 오브젝트가 가지고 있는 메소드를 사용
account.deposit()
user.login()
// FP : 함수를 사용하여 데이터를 넣어줌
deposit(acoount)
user(User)
No Side-Effect
OOP - 오브젝트의 연관 관계로 만들어짐 - 모듈 (State / Method() )
FP - 순수함수는 인풋 들을 아웃풋이 서로 연결되어서 큰 아웃풋을 만들어 낸다. - 모듈(함수) (State가 없다)
결국은 State가 있냐 없느냐의 차이가 OPP와 FP의 차이이다.
Imperative vs Declarative (HOW vs What)
//Declarative
let fizz: (Int) -> String = { i in i % 3 == 0 ? "fizz" : "" }
let buzz: (Int) -> String = { i in i % 5 == 0 ? "buzz" : ""}
let fizzbuzz = { i in { $0.isEmpty ? "\(i)": $0}(fizz(i) + buzz(i)) }
let output = { print($0) }
(1...100).map(fizzbuzz).forEach(output)
위 예제는 단계를 거쳐 좀 더 깔끔한 선언형 프로그래밍 방식으로 변형할 수 있는데 분량이 많아 아래 포스팅에서 집중적으로 작성하였습니다.
http://azsha.tistory.com/101?category=743068
참고링크
https://iosdevkor.github.io/let_us_go_2018_spring_review/ 에서 "곰튀김님의 Functinal Programing이 뭐하는 건가요?"
'Programer > iOS' 카테고리의 다른 글
[FP] Imperative -> Declarative 예제를 통해 바꿔보기 (FizzBuzz) (0) | 2018.07.16 |
---|---|
[FP] 함수 & 고차함수 vs 클로저 (0) | 2018.07.12 |
[Swift] Class와 Struct 무엇을 써야 할까요? (Class VS Struct) (0) | 2018.07.05 |
[Tip] iOS 세미나, 밋업 정보 (0) | 2018.06.04 |
[Tip] Apple MDM / 엔터프라이즈 계정 관련 (0) | 2018.02.05 |