+ All Categories
Home > Software > Collection pipeline par Mathieu Godart

Collection pipeline par Mathieu Godart

Date post: 16-Apr-2017
Category:
Upload: cocoaheads-france
View: 6,547 times
Download: 1 times
Share this document with a friend
21
Migration vers le patron « Collection Pipeline » en Objective-C Mathieu Godart — @MonsieurDart Jeudi 10 septembre 2015 @ CocoaHeads
Transcript
Page 1: Collection pipeline par  Mathieu Godart

Migration vers le patron« Collection Pipeline »

en Objective-C

Mathieu Godart — @MonsieurDartJeudi 10 septembre 2015 @ CocoaHeads

Page 2: Collection pipeline par  Mathieu Godart

L’INSPIRATION

• Martin Fowler

• Refactoring with Loops and Collection Pipelines

http://martinfowler.com/articles/refactoring-pipelines.html

• Many use cases in the article

• Here, only one case, translated into ObjC

Page 3: Collection pipeline par  Mathieu Godart

L’IDÉE SOUS-JACENTE

• Traitement des collections d’objets :

• La boucle est la méthode la plus basique

• Mais ce n’est pas la seule : approche en « pipeline »

[Liste initiale] — fonction —> [Liste filtrée]

• Pas seulement pour la programmation fonctionnelle…

Page 4: Collection pipeline par  Mathieu Godart

L’IDÉE SOUS-JACENTE

• ObjC (et Swift) possèdent ce qu’il faut pour ça :

• Lambdas : pour nous les blocs

• Bibliothèques : pour nous YOLOKit ou BlocksKit

Page 5: Collection pipeline par  Mathieu Godart

BRIQUES DE BASE

• Les bibliothèques YOLOKit ou BlocksKit

• Fonctions de filtrage sur collections (NSArray, NSSet…)

• Autres fonctions de manipulation avec des blocs

• Chaînage des appels généralisé

Page 6: Collection pipeline par  Mathieu Godart

CODE DE DÉPART

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company {

NSMutableArray *result = [NSMutableArray new];

for (MGAuthor *a in authors) {

if ([a.company isEqual:company]) {

var handle = a.twitterHandle;

if (handle != null) [result addObject:handle];

}

}

return [NSArray arrayWithArray:result];

}

Page 7: Collection pipeline par  Mathieu Godart

CODE DE DÉPART

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company {

NSMutableArray *result = [NSMutableArray new];

for (MGAuthor *a in authors) {

if ([a.company isEqual:company]) {

var handle = a.twitterHandle;

if (handle != null) [result addObject:handle];

}

}

return [NSArray arrayWithArray:result];

}

Page 8: Collection pipeline par  Mathieu Godart

VARIABLE TEMPORAIRE

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company{

NSMutableArray *result = [NSMutableArray new];

NSArray *loopStart = authors;

for (MGAuthor *a in loopStart) {

if ([a.company isEqual:company]) {

var handle = a.twitterHandle;

if (handle != null) [result addObject:handle];

}

}

return [NSArray arrayWithArray:result];

}

Page 9: Collection pipeline par  Mathieu Godart

PREMIER FILTRAGE

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company{

NSMutableArray *result = [NSMutableArray new];

NSArray *loopStart = authors

.select(^(MGAuthor *a){ return [a.company isEqual:company];});

for (MGAuthor *a in loopStart) {

if ([a.company isEqualToString:company]) {

var handle = a.twitterHandle;

if (handle != null) [result addObject:handle];

}

}

return [NSArray arrayWithArray:result];

}

Page 10: Collection pipeline par  Mathieu Godart

CE DONT ON A BESOIN

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company{

NSMutableArray *result = [NSMutableArray new];

NSArray *loopStart = authors

.select(^(MGAuthor *a){ return [a.company isEqual:company]; })

.map(^(MGAuthor *a){ return a.twitterHandle; });

for (NSString *handle in loopStart) {

var handle = a.twitterHandle;

if (handle != null) [result addObject:handle];

}

return [NSArray arrayWithArray:result];

}

Page 11: Collection pipeline par  Mathieu Godart

CODE DE DÉPART

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company{

NSMutableArray *result = [NSMutableArray new];

NSArray *loopStart = authors

.select(^(MGAuthor *a){ return [a.company isEqual:company]; })

.map(^(MGAuthor *a){ return a.twitterHandle; })

.select(^(NSString *h){ return h != null; });

for (NSString *handle in loopStart) {

if (handle != null) [result addObject:handle];

}

return [NSArray arrayWithArray:result];

}

Page 12: Collection pipeline par  Mathieu Godart

NETTOYAGE FINAL

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company{

NSMutableArray *result = [NSMutableArray new];

return authors

.select(^(MGAuthor *a){ return [a.company isEqual:company]; })

.map(^(MGAuthor *a){ return a.twitterHandle; })

.select(^(NSString *h){ return h != null; });

for (NSString *handle in loopStart) { [result addObject:handle];

}

return [NSArray arrayWithArray:result];

}

Page 13: Collection pipeline par  Mathieu Godart

TA DA !- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company{

return authors

.select(^(MGAuthor *a){ return [a.company isEqual:company]; })

.map (^(MGAuthor *a){ return a.twitterHandle; })

.select(^(NSString *h){ return h != null; });

}

Page 14: Collection pipeline par  Mathieu Godart

TA DA !- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company{

return authors

.select(^(MGAuthor *a){ return [a.company isEqual:company]; })

.map (^(MGAuthor *a){ return a.twitterHandle; })

.select(^(NSString *h){ return h != null; });

}

Page 15: Collection pipeline par  Mathieu Godart

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company {

return authors

.select(^(MGAuthor *a){ return [a.company isEqual:company]; })

.map (^(MGAuthor *a){ return a.twitterHandle; })

.select(^(NSString *h){ return h != null; });

}

- (NSArray *)twitterHandles:(NSArray *)authors forCompany:(NSString *)company {

NSMutableArray *result = [NSMutableArray new];

for (MGAuthor *a in authors) {

if ([a.company isEqual:company]) {

var handle = a.twitterHandle;

if (handle != null) [result addObject:handle];

}

}

return [NSArray arrayWithArray:result];

}

Page 16: Collection pipeline par  Mathieu Godart

ENCORE PLUS CONCIS EN SWIFT

-(阵列*)的⼿手:(阵列*)作者公司:(字符串*)公司 { 返回作家 。选择(^(作者* A){返回[公司是平等:公司];}) 。地图(^(作者* A){返回⼀一个句柄;}) 。选择(^(字符串* H){返回H =空;}); }

Page 17: Collection pipeline par  Mathieu Godart

AUTRE FONCTIONS UTILES

• select, map, slice

• groupBy

• first, any, sort

• flatMap

• …

Page 18: Collection pipeline par  Mathieu Godart

DU POUR ET DU CONTRE…

• Philosophie ou manière de penser différente

• Lourde barrière à l’entrée, mais peut s’avérer plus claire :

• À l’écriture, à la relecture et à la maintenance

• Favorise les variables immuables (immutable)

• Vous ouvre au fonctionnel… et au map-reduce

Page 19: Collection pipeline par  Mathieu Godart

DES QUESTIONS ?DES REMARQUES ?

DES AVIS ?

Page 20: Collection pipeline par  Mathieu Godart

MERCI LES AMIS…

Mathieu Godart — @MonsieurDartJeudi 10 septembre 2015 @ CocoaHeads

Page 21: Collection pipeline par  Mathieu Godart

Recommended