5. OO MAKES CODE UNDERSTANDABLE BY
ENCAPSULATING MOVING PARTS
Micael Feathers
FUNCTIONAL PROGRAMMING
6. FP MAKES CODE UNDERSTANDABLE BY
MINIMIZING MOVING CODE PARTS
Micael Feathers
FUNCTIONAL PROGRAMMING
7. FUNCTIONAL PROGRAMMING
OBJECT ORIENTED PROGRAMMING
✦ 객체 기반
✦ Object = field (variable) + method (function)
✦ 메소드는 객체 내부 변수를 참조하여 return value를 생성
✦ 개념
✦ Polymorphism, Inheritance, Encapsulation
✦ 설계원칙
✦ 디자인 패턴, SOLID
8. FUNCTIONAL PROGRAMMING
OBJECT ORIENTED PROGRAMMING
✦ 장점
✦ 현실 세계를 반영한 객체 기반의 설계
✦ 코드에 대한 이해도가 빠름
✦ 대규모 시스템 설계에서 유리
✦ 단점
✦ 공유 자원에 대한 race condition
✦ Dead lock, Starvation 등
9. FUNCTIONAL PROGRAMMING
FUNCTIONAL PROGRAMMING
✦ 함수 기반
✦ 수학의 함수와 비슷, ‘f(x) = y’
✦ 단, 함수는 매개변수를 제외한 다른 외부변수를 참조하지 않는다.
✦ x에 대한 함수의 출력은 항상 f(x)
✦ 설계 목적
✦ 각 함수에 대한 참조 무결성을 보장
✦ 병렬, 비동기 처리에 대한 내성 강화
10. THE REASON WHY WE SHOULD DO
FUNCTIONAL PROGRAMMING IS….
Neal Ford
FUNCTIONAL PROGRAMMING
12. FUNCTIONAL PROGRAMMING
OOP
✦ Method : running
✦ The implements of running method is depend on the kind of subclass.
MEN’S RUNNING DOG’S RUNNING BIRD’S RUNNING
ANIMAL’S RUNNING
13. FUNCTIONAL PROGRAMMING
FP
✦ Method : running
✦ The running function is independent
✦ The running function does not have any data.
✦ It makes risks minimized in FP
‘MEN’ ‘DOG’ ‘BIRD’
FUNCTION RUNNING
(ANIMAL)
17. FUNCTIONAL PROGRAMMING
LAMBDA
✦ 추상화, 변수 바인딩에 기반한 함수 표현식 -> 익명 함수
✦ 함수
✦ 일반 함수 -> f1(x, y) = z
✦ 항등 함수 -> f2(x) = x
✦ High-order function -> f1(x, y) = z -> f1(f2(x), y) = z
✦ Curring -> f1(x, y) = z, f1(z, y) = a -> f1(f1(x, y), y) = a
20. FUNCTIONAL PROGRAMMING
CURRYING
✦ Partial application과 비슷
✦ 일부 인자를 미리 binding 하는 partial application과 다르게 단일 인자만 고정
✦ Partial applciation의 차이
✦ Partial application : f1(x, y, z), f2(x, y) -> f1(f2(x, y), z)
✦ Currying : f1(x, y) = z, f1(z, y) = a -> f1(f1(x, y), y) = a
✦ Swift에서 미지원
✦ pod ‘Curry’
21. FUNCTIONAL PROGRAMMING
HIGH-ORDER FUNCTION
✦ 함수를 매개변수로 받을 수 있는 함수
✦ 함수를 return할 수 있는 함수
✦ map : (T) -> U
✦ flatten : ([[T], [U]]) -> [T, U]
✦ filter : ([A, B, C]) -> [A]
✦ reduce : (T , [A, B, C]) -> D
✦ Etc.
22. FUNCTIONAL PROGRAMMING
FUNCTOR
✦ 값을 캡슐화한 자료구조
✦ Context + value + map
✦ Type 자체를 추상화
✦ 내부의 값이 무언인지 모름
✦ 심지어 값이 비어 있을 수 있다
✦ map 함수를 지원
✦ T -> U
✦ Type으로부터 안전하고 내부의 값만 map을 통해서 변경 가능
23. FUNCTIONAL PROGRAMMING
MONAD
✦ 역시 값을 캡슐화한 자료구조
✦ Context + value + flatMap
✦ 역시 Type 자체를 추상화
✦ 하지만 flatMap 함수를 지원
✦ flatten : 1차원 위상화 [[x], [y], z] -> [x, y, z]
✦ map : T -> U
✦ Type으로부터 안전하고 내부의 값만 map을 통해서 변경 가능
24. FUNCTIONAL PROGRAMMING
MONAD
✦ 역시 값을 캡슐화한 자료구조
✦ Context + value + flatMap
✦ 역시 Type 자체를 추상화
✦ 하지만 flatMap 함수를 지원
✦ flatten : 1차원 위상화 ex) [Optional(Optional(.some)), Optional(.none), z] -> [some, nil, z]
✦ map : T -> U
✦ Type으로부터 안전하고 내부의 값만 map을 통해서 변경 가능
✦ 중첩되어 있는 context에 대한 유연한 대처 가능 - Context(Context(Context(value))) -> Context(value)
25. FUNCTIONAL PROGRAMMING
MONAD
✦ 실제 Alamofire의 ‘Result.swift’를 확인
✦ success 안에 의미 있는 value
✦ failure 안에는 error
✦ failure context의 경우 : chaining에 따른 처리를 하지
않고 Error만을 return
✦ success context의 경우 : value를 chaining에 따른
처리를 통해 변경 최종 context에서 의미있는 value를
획득 가능