SlideShare una empresa de Scribd logo
1 de 13
Design Patterns
  en Cocoa
 Presentation CocoaHeads Paris
           Avril 2010
      par Renaud Pradenc
Introduction
Cette présentation est un résumé de la
présentation que j’ai donné le jeudi 8 avril, et
dont le sujet était les Design Patterns. Au
départ, il s’agissait de parler du livre Les
design patterns de Cocoa aux éditions
Pearson, dont j’ai fait la relecture technique
(c’est à dire vérifié que la traduction en
français n’apportait pas d’erreur). La
présentation s’est transformée en une
introduction aux Design Patterns.
Le problème posé par la programmation
orientée objet
La conception d’une application orientée objet peut se résumer ainsi:
établir la liste des tâches à réaliser
répartir ces tâches parmi les objets en leur donnant des responsabilités.


Cette seconde étape est la plus difficile, puisqu’il semble qu’elle s’appuie
essentiellement sur l’expérience du développeur; toutefois, on peut dicter
quelques lignes générales telles que:
donner une taille adéquate aux objets, ni trop grands (beaucoup de méthodes
et de variables d’instance), ni trop petits (ce qui complique les connexions
entre objets, et n’aide pas à la compréhension).
préférer la composition (faire appel à d’autres objets) à l’héritage.


Ces principes ne sont toutefois pas suffisants.
Les design patterns
Au fil du temps, on a remarqué que les mêmes problèmes de conception revenaient souvent, et qu’on
pouvait les régler d’une façon standardisée.


Ces solutions standardisées sont les design patterns.


Elles présentent trois avantages:
Ne pas réinventer la roue
Inutile de chercher pendant des heures une solution adéquate. Une fois le problème identifié, un livre
nous offre la solution.
Adopter une solution optimale
Il s’agit d’une solution éprouvée, certainement meilleure qu’une autre que vous pourriez imaginer.
Fournir un vocabulaire commun aux développeurs
La communication est essentielle dans la réussite d’un projet logiciel. Utiliser le nom d’un epattern
explique sans ambiguïté de quoi il s’agit.


Pour faire un parallèle, les design patterns sont à la POO, ce que les algorithmes sont aux traitements
des données. Si vous avez besoin de classer des nombres pas ordre croissant, il existe plusieurs
algorithmes connus: bubblesort, quicksort, bucketsort… ces algorithmes ont chacun leurs avantages et
leur défauts (complexité, lenteur, empreinte mémoire), que les autres programmeurs connaissent
Un livre est fondamental sur le sujet: Design Patterns, publié en 1995 (quinze ans… une éternité en
informatique) par quatre auteurs surnommés le Gang of Four. Ce livre expose 23 patterns classés dans
trois catégories: Création, Structure et Comportement.
Design Patterns et
       Cocoa
Connaître toutes ces design patterns n’est
pas indispensable, l’utilisation de Cocoa nous
imposant déjà plusieurs patterns. D’autres
patterns sont déjà implémentées par les
classes de Cocoa ou le runtime Objective-C.


La réunion Cocoa Heads fut l’occasion d’en
voir trois qui sont parmi les plus courantes:
le singleton, la délégation et enfin le MVC.
Singleton
Il s’agit sans doute de la pattern la plus connue. L’idée est que certains objets ne doivent exister
qu’en un seul exemplaire dans une application. Des exemples de tels objets dans Cocoa sont: le
gestionnaire de fichier (NSFileManager), la palette des polices (NSFontPanel) ou encore l’application
(NSApplication).


Pour obtenir cet objet partagé, on appelle une méthode de classe:
+[NSFileManager defaultManager]
+[NSFontPanel sharedFontPanel]
+[NSApplication sharedApplication]


Le principe de l’implémentation d’un singleton est simple: le .m contient une variable statique. Au
premier appel de la méthode de classe, on instancie la classe, on stocke le pointeur dans la variable
statique et on renvoie ce pointeur. Dans tous les appels suivants, on renvoie simplement le pointeur.


Vous trouverez un exemple de code dans ce document:
http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals
(chapitre «Cocoa Objects», section «Creating a Singleton object»).
Comme vous le verrez, le gros du code consiste à adapter les opérations de gestion mémoire ou de
copie à ce cas particulier où il n’existe qu’une instance de l’objet.
MVC — Modèle,Vue,
   Contrôleur
L’idée est de séparer les composants visuels (les Vues: fenêtres, boutons, etc.) du code métier
(Modèle: la logique de l’application). Un objet Contrôleur permet de synchroniser les deux couches.


Le but principal de cette démarche est de détacher le modèle de l’interface utilisateur:
Conserver le modèle à part organise l’application rigoureusement. Par exemple, si l’application
possède un bouton «Visiter le site web», il serait tentant de sous-classer le bouton pour ouvrir
l’URL dans le navigateur web. Le jour où un article de menu «Visiter le site web» fait son apparition,
il serait également tentant de sous-classer l’article de menu et simplement copier-coller le code
d’ouverture de l’URL.
La séparation imposée par le MVC dicte qu’il faut mettre une méthode d’ouverture de l’URL dans la
partie modèle, et que le bouton et l’article de menu appellent cette méthode. Toute duplication du
code est à proscrire: cela augmente la complexité et les chances de bogues. Le MVC favorise la
factorisation du code.
L’exemple du diaporama montre une application qui stocke des mesures en millimètres. Sur un
système américain, les mesures sont affichées en pouces, et sur un système français, en mm. C’est la
couche Contrôleur qui s’inquiète de savoir quelle unité utiliser et qui effectue les conversions.
Comme on me l’a fait remarquer pendant la présentation, on pourrait très bien afficher les mesures
dans les deux unités en même temps.
On peut tout à fait imaginer une application en ligne de commande, utilisant le même modèle mais
qui afficherait son résultat sous forme de texte et serait commandé au clavier.
La délégation
Cette dernière pattern laisse souvent perplexes les nouveaux venus
à Cocoa, pourtant sa mise en œuvre est simple à comprendre.


Dans l’exemple qui suit, nous voulons contraindre les dimensions
d’une fenêtre. Voici la technique à base d’héritage:
La méthode -(void)setFrame:(NSRect)frame
est surchargée dans la classe MyWindow.


En utilisant le principe de la délégation, voici
ce que ça donne:
Quand la fenêtre à l’intention de changer de taille, elle appelle la
méthode -(NSSize) windowWillResize:(NSWindow*)window toSize:
(NSSize)proposedFrameSize de son délégué. Celui-ci a alors
l’opportunité de renvoyer une taille différente de celle proposée.


Voici quelques avantages de cette démarche:
NSWindow est une classe complexe, et les programmeurs
d’applications ne disposent pas de son code source. Ils ne connaissent
pas non plus ses méthodes et variables d’instance privées.
Écrire une méthode de délégation est beaucoup plus facile que de
sous-classer NSWindow.
On peut changer de délégué à l’exécution: plutôt que changer
d’algorithme, utilisez un délégué qui implémente un algorithme
différent.
On peut partager un délégué entre plusieurs fenêtres.


La délégation est très courante en Cocoa. Elle prend plusieurs
formes: les data sources (utilisées notamment pour les NS/
UITableView) sont une forme de délégation.
Délégué et protocole
Contrairement à d’autres langages objets, Objective-C n’autorise pas l’héritage multiple, c’est à dire qu’une classe
ne peut avoir qu’une classe parente.
Cependant, le langage propose la notion de protocole: il s’agit d’une liste de méthodes qu’un objet doit
implémenter pour être conforme (en Java, les protocoles sont appelés interfaces. On C++, on les considérerait
comme des classes abstraites pures).


Un protocole est un bon moyen de définir la forme d’une méthode déléguée. Pour l’exemple de NSWindow ci-
dessus, Apple n’a pas défini de protocole, mais cela pourrait donner quelque chose comme:


@protocol NSWindowDelegate
@optional
-(NSSize) windowWillResize:(NSWindow*)window toSize:(NSSize)proposedFrameSize;
@end
La directive @optional indique que l’implémentation de la méthode par le délégué est optionnelle. Il existe une
directive @required qui indique un caractère obligatoire. Dans notre exemple, le délégué d’une fenêtre n’est pas
tenu d’implémenter toutes les méthodes déléguées; le comportement par défaut est correct la plupart du temps.


Dans le cas des data sources, sur Mac, il n’existe pas de protocole. Si vous oubliez d’implémenter une des
méthodes nécessaires, vous verrez un message dans la console à l’exécution. Sur Cocoa Touch, Apple impose que
des data sources répondent à un protocole avec plusieurs méthodes @required. L’absence d’une de ces
méthodes provoquera une erreur à la compilation, ce qui est bien mieux.


L’exemple du diaporama montre l’implémentation de la délégation pour une vue personnalisée, jetez-y un œil.
Le livre Les design
      patterns de Cocoa
Au départ, c’est pour parler du livre que j’avais invité à Cocoa Heads, alors parlons-en !


Soyons honnêtes, ce livre ne vous expliquera pas comment utiliser les design patterns dans vos programmes
Cocoa. C’est avant tout un livre qui explique quels choix de conception ont été effectués dans Cocoa et
pourquoi.


Les deux auteurs travaillent avec Cocoa et son ancêtre NeXTStep depuis des années. Ce sont des membres
fondateurs du site Stepwise, qui fut longtemps un site de référence sur la programmation Cocoa (mais qui a
malheureusement fermé récemment). Ils ont écrit Cocoa Programming, le premier mode d’emploi de Cocoa
vraiment accessible, à une époque où seule la documentation d’Apple existait.


Ce sont vraiment des passionnés de Cocoa, et cela se sent dans la lecture; de fait, le livre est surtout une plongée
dans les arcanes de Cocoa, et c’est pour cela que je le conseillerais à tout programmeur sérieux sur Mac.


Le livre souffre de deux défauts bien réels. D’une part, il y a une volonté de revenir aux design patterns pour
justifier le titre du livre. D’autre part, le livre aurait gagné à être amputé d’un bon tiers: il y a beaucoup de
répétitions, et certains chapitres sont inutiles. C’est un défaut récurent des livres américains, lié à leur culture: il
faut que le client en ait pour son argent, le livre doit donc être épais — alors que c’est de l’information que nous
achetons, pas du papier !

Cela dit, pour la relecture technique, il a fallu que je le lise l’ouvrage de la couverture à la couverture, ce qui
s’avère ennuyeux. Sautez les passages les moins intéressants, et je vous garantis une lecture pleine d’intérêt, qui
approfondira considérablement votre connaissance de Cocoa.
Renaud Pradenc
    Céroce
www.ceroce.com

Más contenido relacionado

La actualidad más candente

Java uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaJava uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaAmel Morchdi
 
Introduction java
Introduction javaIntroduction java
Introduction javaFouad Root
 
DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
 DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisantcluelessjoe
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en JavaOussama BEN KHIROUN
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Faycel Chaoua
 
Design Pattern: Développement et Bonnes pratiques
Design Pattern: Développement et Bonnes pratiquesDesign Pattern: Développement et Bonnes pratiques
Design Pattern: Développement et Bonnes pratiquesAlex Wilfried OUATTARA
 
JAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAJAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAAymen Bedwivski
 
Java uik-chap2-dev java
Java uik-chap2-dev javaJava uik-chap2-dev java
Java uik-chap2-dev javaAmel Morchdi
 

La actualidad más candente (10)

Java uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaJava uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 java
 
Introduction java
Introduction javaIntroduction java
Introduction java
 
DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
 DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en Java
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
 
Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
 
Design Pattern: Développement et Bonnes pratiques
Design Pattern: Développement et Bonnes pratiquesDesign Pattern: Développement et Bonnes pratiques
Design Pattern: Développement et Bonnes pratiques
 
Patrons de conception
Patrons de conceptionPatrons de conception
Patrons de conception
 
JAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAJAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVA
 
Java uik-chap2-dev java
Java uik-chap2-dev javaJava uik-chap2-dev java
Java uik-chap2-dev java
 

Destacado

La naissance de l'escalade libre date t-elle des années 70 ?
La naissance de l'escalade libre date t-elle des années 70 ?La naissance de l'escalade libre date t-elle des années 70 ?
La naissance de l'escalade libre date t-elle des années 70 ?jc WECKERLE
 
Désinstaller Troie: Win64/Patched.H, supprimer Trojan: Win64/Patched.H instan...
Désinstaller Troie: Win64/Patched.H, supprimer Trojan: Win64/Patched.H instan...Désinstaller Troie: Win64/Patched.H, supprimer Trojan: Win64/Patched.H instan...
Désinstaller Troie: Win64/Patched.H, supprimer Trojan: Win64/Patched.H instan...101scorphio105
 
Question 2
Question 2Question 2
Question 2Levg82
 
Mi CV actualizado a junio 2012. Carmen Urbano.
Mi CV actualizado a junio 2012. Carmen Urbano.Mi CV actualizado a junio 2012. Carmen Urbano.
Mi CV actualizado a junio 2012. Carmen Urbano.Carmen Urbano
 
2937368 curso-completo-de-linux-ubuntu
2937368 curso-completo-de-linux-ubuntu2937368 curso-completo-de-linux-ubuntu
2937368 curso-completo-de-linux-ubuntuetac24
 
Math 2éme année lycée
Math 2éme année lycéeMath 2éme année lycée
Math 2éme année lycéeTaha Can
 
Faire progresser les managers
Faire progresser les managersFaire progresser les managers
Faire progresser les managersL'internome
 
2010 03-06 powerpointapc
2010 03-06 powerpointapc2010 03-06 powerpointapc
2010 03-06 powerpointapcRicardo
 
Fiche de révision chap 2 svt
Fiche de révision chap 2 svtFiche de révision chap 2 svt
Fiche de révision chap 2 svtAhmad Nehme
 
G12 presentación grupo12_10-10-2012
G12 presentación grupo12_10-10-2012G12 presentación grupo12_10-10-2012
G12 presentación grupo12_10-10-2012tallera
 
Petit journal de campagne n°4 - L'entreprise responsable
Petit journal de campagne n°4 - L'entreprise responsable Petit journal de campagne n°4 - L'entreprise responsable
Petit journal de campagne n°4 - L'entreprise responsable CroissancePlus
 
Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
Ayudas a la internacionalización de las empresas aragonesas para el año 2013. Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
Ayudas a la internacionalización de las empresas aragonesas para el año 2013. Carmen Urbano
 
Mondays at work - Servicios
Mondays at work - ServiciosMondays at work - Servicios
Mondays at work - ServiciosMondays at Work
 

Destacado (20)

Resumen etapas de la historia
Resumen etapas de la historiaResumen etapas de la historia
Resumen etapas de la historia
 
La naissance de l'escalade libre date t-elle des années 70 ?
La naissance de l'escalade libre date t-elle des années 70 ?La naissance de l'escalade libre date t-elle des années 70 ?
La naissance de l'escalade libre date t-elle des années 70 ?
 
Désinstaller Troie: Win64/Patched.H, supprimer Trojan: Win64/Patched.H instan...
Désinstaller Troie: Win64/Patched.H, supprimer Trojan: Win64/Patched.H instan...Désinstaller Troie: Win64/Patched.H, supprimer Trojan: Win64/Patched.H instan...
Désinstaller Troie: Win64/Patched.H, supprimer Trojan: Win64/Patched.H instan...
 
Enseñamos
 Enseñamos Enseñamos
Enseñamos
 
Question 2
Question 2Question 2
Question 2
 
Mi CV actualizado a junio 2012. Carmen Urbano.
Mi CV actualizado a junio 2012. Carmen Urbano.Mi CV actualizado a junio 2012. Carmen Urbano.
Mi CV actualizado a junio 2012. Carmen Urbano.
 
2937368 curso-completo-de-linux-ubuntu
2937368 curso-completo-de-linux-ubuntu2937368 curso-completo-de-linux-ubuntu
2937368 curso-completo-de-linux-ubuntu
 
Math 2éme année lycée
Math 2éme année lycéeMath 2éme année lycée
Math 2éme année lycée
 
Faire progresser les managers
Faire progresser les managersFaire progresser les managers
Faire progresser les managers
 
2010 03-06 powerpointapc
2010 03-06 powerpointapc2010 03-06 powerpointapc
2010 03-06 powerpointapc
 
Fiche de révision chap 2 svt
Fiche de révision chap 2 svtFiche de révision chap 2 svt
Fiche de révision chap 2 svt
 
Logos
LogosLogos
Logos
 
G12 presentación grupo12_10-10-2012
G12 presentación grupo12_10-10-2012G12 presentación grupo12_10-10-2012
G12 presentación grupo12_10-10-2012
 
Petit journal de campagne n°4 - L'entreprise responsable
Petit journal de campagne n°4 - L'entreprise responsable Petit journal de campagne n°4 - L'entreprise responsable
Petit journal de campagne n°4 - L'entreprise responsable
 
Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
Ayudas a la internacionalización de las empresas aragonesas para el año 2013. Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
 
Algorithmique
AlgorithmiqueAlgorithmique
Algorithmique
 
Paris
ParisParis
Paris
 
Clase #2 de word ii
Clase #2 de word iiClase #2 de word ii
Clase #2 de word ii
 
CodeCamp 2010 | Hyper-V en Windows Server 2008 R2 e interoperabilidad con Linux
CodeCamp 2010 | Hyper-V en Windows  Server 2008 R2 e interoperabilidad con LinuxCodeCamp 2010 | Hyper-V en Windows  Server 2008 R2 e interoperabilidad con Linux
CodeCamp 2010 | Hyper-V en Windows Server 2008 R2 e interoperabilidad con Linux
 
Mondays at work - Servicios
Mondays at work - ServiciosMondays at work - Servicios
Mondays at work - Servicios
 

Similar a Design patterns

Introduction of the most important design pattern
Introduction of the most important design patternIntroduction of the most important design pattern
Introduction of the most important design patternThierry Gayet
 
Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db firstZineb ELGARRAI
 
ADDIE : Modèle d'ingénierie pédagogique
 ADDIE : Modèle d'ingénierie pédagogique ADDIE : Modèle d'ingénierie pédagogique
ADDIE : Modèle d'ingénierie pédagogiqueyazbekfarah
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPkemenaran
 
Scenari4 fabienne droullours eleanring expo
Scenari4 fabienne droullours eleanring expoScenari4 fabienne droullours eleanring expo
Scenari4 fabienne droullours eleanring expoHusson Anne-Marie
 
Scenari4 fabienne droullours eleanring expo
Scenari4 fabienne droullours eleanring expoScenari4 fabienne droullours eleanring expo
Scenari4 fabienne droullours eleanring expoHusson Anne-Marie
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_finalDuchess France
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_finalagnes_crepet
 
Outils de construction pour la recherche
Outils de construction pour la rechercheOutils de construction pour la recherche
Outils de construction pour la rechercheJohan Moreau
 
Presentation mkframework software craftsmanship a l'afup
Presentation mkframework software craftsmanship a l'afupPresentation mkframework software craftsmanship a l'afup
Presentation mkframework software craftsmanship a l'afupMichael Bertocchi
 
Py osv newsletter-062018
Py osv newsletter-062018Py osv newsletter-062018
Py osv newsletter-062018FabMob
 
Réussir son projet Drupal
Réussir son projet DrupalRéussir son projet Drupal
Réussir son projet DrupalAdyax
 

Similar a Design patterns (20)

Etude des Frameworks PHP
Etude des Frameworks PHPEtude des Frameworks PHP
Etude des Frameworks PHP
 
Introduction of the most important design pattern
Introduction of the most important design patternIntroduction of the most important design pattern
Introduction of the most important design pattern
 
Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db first
 
Chapter1
Chapter1Chapter1
Chapter1
 
ADDIE : Modèle d'ingénierie pédagogique
 ADDIE : Modèle d'ingénierie pédagogique ADDIE : Modèle d'ingénierie pédagogique
ADDIE : Modèle d'ingénierie pédagogique
 
Lmo02.ppt
Lmo02.pptLmo02.ppt
Lmo02.ppt
 
Projet+com02.ppt
Projet+com02.pptProjet+com02.ppt
Projet+com02.ppt
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
 
Le framework-executor
Le framework-executorLe framework-executor
Le framework-executor
 
Scenari4 fabienne droullours eleanring expo
Scenari4 fabienne droullours eleanring expoScenari4 fabienne droullours eleanring expo
Scenari4 fabienne droullours eleanring expo
 
Scenari4 fabienne droullours eleanring expo
Scenari4 fabienne droullours eleanring expoScenari4 fabienne droullours eleanring expo
Scenari4 fabienne droullours eleanring expo
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
Outils de construction pour la recherche
Outils de construction pour la rechercheOutils de construction pour la recherche
Outils de construction pour la recherche
 
Presentation mkframework software craftsmanship a l'afup
Presentation mkframework software craftsmanship a l'afupPresentation mkframework software craftsmanship a l'afup
Presentation mkframework software craftsmanship a l'afup
 
Py osv newsletter-062018
Py osv newsletter-062018Py osv newsletter-062018
Py osv newsletter-062018
 
Presentation forum php 2010
Presentation forum php 2010Presentation forum php 2010
Presentation forum php 2010
 
Réussir son projet Drupal
Réussir son projet DrupalRéussir son projet Drupal
Réussir son projet Drupal
 

Más de CocoaHeads.fr

Présentation gnireenigne
Présentation   gnireenignePrésentation   gnireenigne
Présentation gnireenigneCocoaHeads.fr
 
Wireless ad hoc distribution
Wireless ad hoc distributionWireless ad hoc distribution
Wireless ad hoc distributionCocoaHeads.fr
 
Déploiement ad hoc et beta test
Déploiement ad hoc et beta testDéploiement ad hoc et beta test
Déploiement ad hoc et beta testCocoaHeads.fr
 
Automatisation shipping process
Automatisation shipping processAutomatisation shipping process
Automatisation shipping processCocoaHeads.fr
 
Slides de la Localisation
Slides de la LocalisationSlides de la Localisation
Slides de la LocalisationCocoaHeads.fr
 
Presentation de Mars
Presentation de MarsPresentation de Mars
Presentation de MarsCocoaHeads.fr
 
Presentation de Mars
Presentation de MarsPresentation de Mars
Presentation de MarsCocoaHeads.fr
 
Presentation de Mars
Presentation de MarsPresentation de Mars
Presentation de MarsCocoaHeads.fr
 

Más de CocoaHeads.fr (14)

Hello xcode 4 v2
Hello xcode 4 v2Hello xcode 4 v2
Hello xcode 4 v2
 
Présentation gnireenigne
Présentation   gnireenignePrésentation   gnireenigne
Présentation gnireenigne
 
Mac app store redux
Mac app store reduxMac app store redux
Mac app store redux
 
Organic quality
Organic qualityOrganic quality
Organic quality
 
Wireless ad hoc distribution
Wireless ad hoc distributionWireless ad hoc distribution
Wireless ad hoc distribution
 
Déploiement ad hoc et beta test
Déploiement ad hoc et beta testDéploiement ad hoc et beta test
Déploiement ad hoc et beta test
 
Automatisation shipping process
Automatisation shipping processAutomatisation shipping process
Automatisation shipping process
 
Bitmaps
BitmapsBitmaps
Bitmaps
 
Slides de la
Slides de la Slides de la
Slides de la
 
Slides de la Localisation
Slides de la LocalisationSlides de la Localisation
Slides de la Localisation
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Presentation de Mars
Presentation de MarsPresentation de Mars
Presentation de Mars
 
Presentation de Mars
Presentation de MarsPresentation de Mars
Presentation de Mars
 
Presentation de Mars
Presentation de MarsPresentation de Mars
Presentation de Mars
 

Design patterns

  • 1. Design Patterns en Cocoa Presentation CocoaHeads Paris Avril 2010 par Renaud Pradenc
  • 2. Introduction Cette présentation est un résumé de la présentation que j’ai donné le jeudi 8 avril, et dont le sujet était les Design Patterns. Au départ, il s’agissait de parler du livre Les design patterns de Cocoa aux éditions Pearson, dont j’ai fait la relecture technique (c’est à dire vérifié que la traduction en français n’apportait pas d’erreur). La présentation s’est transformée en une introduction aux Design Patterns.
  • 3. Le problème posé par la programmation orientée objet La conception d’une application orientée objet peut se résumer ainsi: établir la liste des tâches à réaliser répartir ces tâches parmi les objets en leur donnant des responsabilités. Cette seconde étape est la plus difficile, puisqu’il semble qu’elle s’appuie essentiellement sur l’expérience du développeur; toutefois, on peut dicter quelques lignes générales telles que: donner une taille adéquate aux objets, ni trop grands (beaucoup de méthodes et de variables d’instance), ni trop petits (ce qui complique les connexions entre objets, et n’aide pas à la compréhension). préférer la composition (faire appel à d’autres objets) à l’héritage. Ces principes ne sont toutefois pas suffisants.
  • 4. Les design patterns Au fil du temps, on a remarqué que les mêmes problèmes de conception revenaient souvent, et qu’on pouvait les régler d’une façon standardisée. Ces solutions standardisées sont les design patterns. Elles présentent trois avantages: Ne pas réinventer la roue Inutile de chercher pendant des heures une solution adéquate. Une fois le problème identifié, un livre nous offre la solution. Adopter une solution optimale Il s’agit d’une solution éprouvée, certainement meilleure qu’une autre que vous pourriez imaginer. Fournir un vocabulaire commun aux développeurs La communication est essentielle dans la réussite d’un projet logiciel. Utiliser le nom d’un epattern explique sans ambiguïté de quoi il s’agit. Pour faire un parallèle, les design patterns sont à la POO, ce que les algorithmes sont aux traitements des données. Si vous avez besoin de classer des nombres pas ordre croissant, il existe plusieurs algorithmes connus: bubblesort, quicksort, bucketsort… ces algorithmes ont chacun leurs avantages et leur défauts (complexité, lenteur, empreinte mémoire), que les autres programmeurs connaissent Un livre est fondamental sur le sujet: Design Patterns, publié en 1995 (quinze ans… une éternité en informatique) par quatre auteurs surnommés le Gang of Four. Ce livre expose 23 patterns classés dans trois catégories: Création, Structure et Comportement.
  • 5. Design Patterns et Cocoa Connaître toutes ces design patterns n’est pas indispensable, l’utilisation de Cocoa nous imposant déjà plusieurs patterns. D’autres patterns sont déjà implémentées par les classes de Cocoa ou le runtime Objective-C. La réunion Cocoa Heads fut l’occasion d’en voir trois qui sont parmi les plus courantes: le singleton, la délégation et enfin le MVC.
  • 6. Singleton Il s’agit sans doute de la pattern la plus connue. L’idée est que certains objets ne doivent exister qu’en un seul exemplaire dans une application. Des exemples de tels objets dans Cocoa sont: le gestionnaire de fichier (NSFileManager), la palette des polices (NSFontPanel) ou encore l’application (NSApplication). Pour obtenir cet objet partagé, on appelle une méthode de classe: +[NSFileManager defaultManager] +[NSFontPanel sharedFontPanel] +[NSApplication sharedApplication] Le principe de l’implémentation d’un singleton est simple: le .m contient une variable statique. Au premier appel de la méthode de classe, on instancie la classe, on stocke le pointeur dans la variable statique et on renvoie ce pointeur. Dans tous les appels suivants, on renvoie simplement le pointeur. Vous trouverez un exemple de code dans ce document: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals (chapitre «Cocoa Objects», section «Creating a Singleton object»). Comme vous le verrez, le gros du code consiste à adapter les opérations de gestion mémoire ou de copie à ce cas particulier où il n’existe qu’une instance de l’objet.
  • 7. MVC — Modèle,Vue, Contrôleur L’idée est de séparer les composants visuels (les Vues: fenêtres, boutons, etc.) du code métier (Modèle: la logique de l’application). Un objet Contrôleur permet de synchroniser les deux couches. Le but principal de cette démarche est de détacher le modèle de l’interface utilisateur: Conserver le modèle à part organise l’application rigoureusement. Par exemple, si l’application possède un bouton «Visiter le site web», il serait tentant de sous-classer le bouton pour ouvrir l’URL dans le navigateur web. Le jour où un article de menu «Visiter le site web» fait son apparition, il serait également tentant de sous-classer l’article de menu et simplement copier-coller le code d’ouverture de l’URL. La séparation imposée par le MVC dicte qu’il faut mettre une méthode d’ouverture de l’URL dans la partie modèle, et que le bouton et l’article de menu appellent cette méthode. Toute duplication du code est à proscrire: cela augmente la complexité et les chances de bogues. Le MVC favorise la factorisation du code. L’exemple du diaporama montre une application qui stocke des mesures en millimètres. Sur un système américain, les mesures sont affichées en pouces, et sur un système français, en mm. C’est la couche Contrôleur qui s’inquiète de savoir quelle unité utiliser et qui effectue les conversions. Comme on me l’a fait remarquer pendant la présentation, on pourrait très bien afficher les mesures dans les deux unités en même temps. On peut tout à fait imaginer une application en ligne de commande, utilisant le même modèle mais qui afficherait son résultat sous forme de texte et serait commandé au clavier.
  • 8. La délégation Cette dernière pattern laisse souvent perplexes les nouveaux venus à Cocoa, pourtant sa mise en œuvre est simple à comprendre. Dans l’exemple qui suit, nous voulons contraindre les dimensions d’une fenêtre. Voici la technique à base d’héritage:
  • 9. La méthode -(void)setFrame:(NSRect)frame est surchargée dans la classe MyWindow. En utilisant le principe de la délégation, voici ce que ça donne:
  • 10. Quand la fenêtre à l’intention de changer de taille, elle appelle la méthode -(NSSize) windowWillResize:(NSWindow*)window toSize: (NSSize)proposedFrameSize de son délégué. Celui-ci a alors l’opportunité de renvoyer une taille différente de celle proposée. Voici quelques avantages de cette démarche: NSWindow est une classe complexe, et les programmeurs d’applications ne disposent pas de son code source. Ils ne connaissent pas non plus ses méthodes et variables d’instance privées. Écrire une méthode de délégation est beaucoup plus facile que de sous-classer NSWindow. On peut changer de délégué à l’exécution: plutôt que changer d’algorithme, utilisez un délégué qui implémente un algorithme différent. On peut partager un délégué entre plusieurs fenêtres. La délégation est très courante en Cocoa. Elle prend plusieurs formes: les data sources (utilisées notamment pour les NS/ UITableView) sont une forme de délégation.
  • 11. Délégué et protocole Contrairement à d’autres langages objets, Objective-C n’autorise pas l’héritage multiple, c’est à dire qu’une classe ne peut avoir qu’une classe parente. Cependant, le langage propose la notion de protocole: il s’agit d’une liste de méthodes qu’un objet doit implémenter pour être conforme (en Java, les protocoles sont appelés interfaces. On C++, on les considérerait comme des classes abstraites pures). Un protocole est un bon moyen de définir la forme d’une méthode déléguée. Pour l’exemple de NSWindow ci- dessus, Apple n’a pas défini de protocole, mais cela pourrait donner quelque chose comme: @protocol NSWindowDelegate @optional -(NSSize) windowWillResize:(NSWindow*)window toSize:(NSSize)proposedFrameSize; @end La directive @optional indique que l’implémentation de la méthode par le délégué est optionnelle. Il existe une directive @required qui indique un caractère obligatoire. Dans notre exemple, le délégué d’une fenêtre n’est pas tenu d’implémenter toutes les méthodes déléguées; le comportement par défaut est correct la plupart du temps. Dans le cas des data sources, sur Mac, il n’existe pas de protocole. Si vous oubliez d’implémenter une des méthodes nécessaires, vous verrez un message dans la console à l’exécution. Sur Cocoa Touch, Apple impose que des data sources répondent à un protocole avec plusieurs méthodes @required. L’absence d’une de ces méthodes provoquera une erreur à la compilation, ce qui est bien mieux. L’exemple du diaporama montre l’implémentation de la délégation pour une vue personnalisée, jetez-y un œil.
  • 12. Le livre Les design patterns de Cocoa Au départ, c’est pour parler du livre que j’avais invité à Cocoa Heads, alors parlons-en ! Soyons honnêtes, ce livre ne vous expliquera pas comment utiliser les design patterns dans vos programmes Cocoa. C’est avant tout un livre qui explique quels choix de conception ont été effectués dans Cocoa et pourquoi. Les deux auteurs travaillent avec Cocoa et son ancêtre NeXTStep depuis des années. Ce sont des membres fondateurs du site Stepwise, qui fut longtemps un site de référence sur la programmation Cocoa (mais qui a malheureusement fermé récemment). Ils ont écrit Cocoa Programming, le premier mode d’emploi de Cocoa vraiment accessible, à une époque où seule la documentation d’Apple existait. Ce sont vraiment des passionnés de Cocoa, et cela se sent dans la lecture; de fait, le livre est surtout une plongée dans les arcanes de Cocoa, et c’est pour cela que je le conseillerais à tout programmeur sérieux sur Mac. Le livre souffre de deux défauts bien réels. D’une part, il y a une volonté de revenir aux design patterns pour justifier le titre du livre. D’autre part, le livre aurait gagné à être amputé d’un bon tiers: il y a beaucoup de répétitions, et certains chapitres sont inutiles. C’est un défaut récurent des livres américains, lié à leur culture: il faut que le client en ait pour son argent, le livre doit donc être épais — alors que c’est de l’information que nous achetons, pas du papier ! Cela dit, pour la relecture technique, il a fallu que je le lise l’ouvrage de la couverture à la couverture, ce qui s’avère ennuyeux. Sautez les passages les moins intéressants, et je vous garantis une lecture pleine d’intérêt, qui approfondira considérablement votre connaissance de Cocoa.
  • 13. Renaud Pradenc Céroce www.ceroce.com

Notas del editor