"swift. Функциональное программирование", Игорь...

19
Спикер: Тема презентации: Литвиненко Игорь Swift. Функциональное программирование в массы

Upload: dataart

Post on 18-Feb-2017

284 views

Category:

Education


3 download

TRANSCRIPT

Page 1: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Спикер:

Тема презентации:

Литвиненко Игорь

Swift. Функциональное программирование

в массы

Page 2: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Агенда

• Проблемы ООП• Что такое ФП• Ищем решение в

функциональном программировании (ФП)

• Основные столпы ФП• Разбираемся на примерах• Когда не надо применять ФП• Заключение

Page 3: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Экскурс в историю

Page 4: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Проблемы императивной (ОО в частности) концепции

• Порог вхождения• Не тривиально разбивание на

абстракции• Не правильное понимание

паттернов – объект типа БОГ• Не очевидны побочные эффекты по

интерфейсу• Сама концепция изменения

состояния перестает работать• Грязный код• Потеря в производительности

Page 5: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Что такое ФП

Функциона́льное программи́рование — парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).

Page 6: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Основные столпы ФП

• Неизменность входных данных• Никаких побочных

эффектов• Многопоточность

• Изменение уровня абстракции за счет функций высших порядков• Больше реюзабельного кода• Лучше читабельность• Сохранение контекста

Page 7: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Неизменность входных данных

Page 8: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Неизменность входных данных

class User { ... }

class ViewController { var user: User}

class NetworkOperation { init(user: User)}

Page 9: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Неизменность входных данных

var a = [1, 2, 3]var b = a// a = [1, 2, 3]; b = [1, 2, 3]b.append(4)// a = [1, 2, 3]; b = [1, 2, 3, 4]

var a = UIView()var b = a

// a.alpha = 1; b.alpha = 1b.alpha = 0// a.alpha = 0; b.alpha = 0

Page 10: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Изменение уровня абстракции за счет функций высших порядков

let numbers = [1,2,3]let squares = numbers.map { $0 * $0 }let odds    = numbers.filter { $0 % 2 == 1 }let sum     = numbers.reduce(0) { $0 + $1 }

let act1SceneCount =  romeoAndJuliet.reduce(0){ count, title in      title.hasPrefix("Act 1") ? count + 1 : count}

Page 11: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Опциональные типы данных и сахар Swift’a

- Generics- Статическая типизация- Перегрузка операторов- Опциональные типы

- (NSUInteger)indexOfObject:(ObjectType)anObjectReturn ValueThe lowest index whose corresponding array value is equal to anObject. If none of the objects in the array is equal to anObject, returns NSNotFound.

public func indexOf(element: Self.Generator.Element) -> Self.Index?

Page 12: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Пример 1. Валидация локального файла

func old_and_busted_expired(fileURL: NSURL) -> Boollet fileManager = NSFileManager()if let filePath = fileURL.path { if fileManager.fileExistsAtPath(filePath) { var error: NSError? let fileAttributes = fileManager.attributesOfItemAtPath(filePath, error: &error) if let fileAttributes = fileAttributes { if let creationDate = fileAttributes[NSFileModificationDate] as? NSDate { return creationDate.isBefore(NSDate.oneDayago()) } } else { NSLog("No file attributes \(filePath)") } }}

Page 13: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Пример 1. Валидация локального файла

let fileExists : (String) -> (String?) = { path in fileManager.fileExistsAtPath(path) ? path : nil}let retrieveFileAttributes : (String) -> ([NSObject: AnyObject]?) = { path in var error: NSError? let attributes = fileManager.attributesOfItemAtPath(path, error: &error)

if attributes == nil { NSLog("Unable to check \(path): \(error)") } return attributes}let extractCreationDate : [NSObject:AnyObject] -> NSDate? ={ $0[NSFileModificationDate] as? NSDate}

Page 14: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Пример 1. Валидация локального файла

let filePath: String?let fileExists: String -> String?let extractFileAttributes: String -> [NSObject:AnyObject]?let extractCreationDate: [NSObject:AnyObject] -> NSDate?

func bind<A, B>(a: A?, f: A -> B?) -> B?{ if let x = a { return f(x) } else { return .None }}

func >>=<A, B>(a: A?, f: A -> B?) -> B?{ return bind(a, f)}

return filePath >>= fileExists >>= retrieveFileAttributes >>= extractCreationDate >>= checkExpired ?? false

Page 15: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Пример 2

let names = ["neal", "s", "stu", "j", "rich", "bob", "aiden", "j", "ethan", "liam", "mason", "noah", "lucas", "jacob", "jayden", "jack"]

let result = names .filter({ $0.characters.count > 1}) .map({$0.capitalizedString}) .joinWithSeparator(", ")

Page 16: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Когда не надо применять ФП

Page 17: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Когда не надо применять ФП

Page 18: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Заключение

• Функциональное программирование – круто

• Объектно-ориентированное программирование – тоже круто

• ООП + ФП – идеальное сочетание• Swift модный язык

Page 19: "Swift. Функциональное программирование", Игорь Литвиненко, DataArt

Контакты

Игорь ЛитвиненкоSenior Mobile Developer at [email protected]