Catégories, extensions et sécurité

Documents pareils
Programmation MacOSX / ios

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

TP1 : Initiation à Java et Eclipse

Serveur d Applications Web : WebObjects

Manipulation 4 : Application de «Change».

Cours 1: Java et les objets

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Programmer en JAVA. par Tama

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Classes et Objets en Ocaml.

Premiers Pas en Programmation Objet : les Classes et les Objets

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

FAIRE UN PAIEMENT TIPI

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Les chaînes de caractères

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Tp 1 correction. Structures de données (IF2)

F. Barthélemy. 17 mai 2005

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Généralités sur le Langage Java et éléments syntaxiques.

COURS WINDEV NUMERO 3

Auto-évaluation Programmation en Java

INITIATION AU LANGAGE JAVA

A.-M. Cubat PMB - Import de lecteurs - Généralités Page 1 Source :

Génie Logiciel avec Ada. 4 février 2013

Initiation à JAVA et à la programmation objet.

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Conventions d écriture et outils de mise au point

Installation de Windows 2012 Serveur

Une introduction à Java

Chapitre VI- La validation de la composition.

as Architecture des Systèmes d Information

12 Tableaux croisés dynamiques

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Chapitre 2. Classes et objets

Java Licence Professionnelle CISII,

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

UE Programmation Impérative Licence 2ème Année

COTISANT AU RÉGIME GUIDE D ACCÈS AU COMPTE

Solutions du chapitre 4

Utilisation d objets : String et ArrayList

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Cours d initiation à la programmation en C++ Johann Cuenin

Langage Java. Classe de première SI

Définition des Webservices Ordre de paiement par . Version 1.0

Quelques éléments de compilation en C et makefiles

Plateforme PAYZEN. Définition de Web-services

Héritage presque multiple en Java (1/2)

N importe qui possédant un code MS valide peut initier la rencontre. Néanmoins, il serait préférable de laisser cette

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Création d objet imbriqué sous PowerShell.

Programmation Orientée Objet

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

alg - Classes, instances, objets [oo] Exercices résolus

14.1. Paiements et achats en ligne

Le langage C. Séance n 4

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

C++ - Classes, instances, objets [oo] Exercices résolus

La mémoire. Un ordinateur. L'octet. Le bit

< Atelier 1 /> Démarrer une application web

2- Relation entre Writer et Calc dans le mailing

Bernard HAMM, Évelyne LAVOISIER

Education Delivery Intelligent Tool

Programmation par composants (1/3) Programmation par composants (2/3)

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Créer et partager des fichiers

Traduction des Langages : Le Compilateur Micro Java

Guide à l intention des parents sur ConnectSafely.org

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

4. Groupement d objets

Alfstore workflow framework Spécification technique

Bases de programmation. Cours 5. Structurer les données

TD/TP PAC - Programmation n 3

MIS 102 Initiation à l Informatique

Un ordonnanceur stupide

Créer votre propre modèle

2 Grad Info Soir Langage C++ Juin Projet BANQUE

I. Introduction aux fonctions : les fonctions standards

Cours de Systèmes d Exploitation

FEN FICHE EMPLOIS NUISANCES

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Programmation avec des objets : Cours 7. Menu du jour

1. Ouvrir Internet Explorer Faire défiler une page Naviguer dans un site Internet Changer d adresse Internet (URL) 2

Création d'un questionnaire (sondage)

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Optimisation des s pour les supports mobiles. Améliorez vos taux de clics sans augmenter votre charge de travail.

Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et

Algorithmique et Programmation, IMA

PROJET 1 : BASE DE DONNÉES REPARTIES

Remote Method Invocation Les classes implémentant Serializable

Description des pratiques à adopter pour la mise à jour du layout en utilisant le gestionnaire de conception de Sharepoint 2013

e-masspost User Guide

Notice d utilisation du Kiosque Famille

GUIDE MEMBRE ESPACE COLLABORATIF. Février 2012

Transcription:

11 Catégories, extensions et sécurité Au sommaire de ce chapitre Catégories Extensions Contrôle des accès aux variables d instance Contrôle des accès aux méthodes Espaces de noms Sécurité Appeler des fonctions C depuis Objective-C Au Chapitre 6, vous avez appris à définir et allouer des classes, et à initialiser et copier des instances. Cependant, la vie ne se résume pas à la simple création d objets. Ce chapitre montre comment ajouter une méthode à une classe existante, comment masquer l existence de méthodes aux curieux et comment limiter l accès aux variables d instance d un objet. Il passe également en revue les notions de sécurité dans Objective-C.

246 Objective-C 2.0 Catégories Grâce aux catégories, vous pouvez ajouter des méthodes à une classe existante sans créer une sous-classe et sans avoir accès au code source de la classe. L utilisation d une catégorie pour étendre le comportement d une classe constitue une solution beaucoup plus légère que la création d une sous-classe. À titre d illustration, supposez que vous vouliez convertir la chaîne de caractères "Luttons tous pour la sauver" en "LuttonsTousPourLaSauver". Une telle chaîne, dans laquelle la première lettre de chaque mot de la chaîne d origine est mise en majuscule et tous les mots sont collés (les espaces sont supprimées), est une chaîne CamelCase. (Ce nom vient de l analogie visuelle avec les creux et les bosses du dos d un chameau.) Info Les noms des classes Objective-C qui respectent les conventions en vigueur sont sous cette forme CamelCase. Les noms des méthodes en emploient généralement une variante dans laquelle la première lettre du premier mot est en minuscule. Vous commencez par consulter la documentation de la classe NSString pour savoir si elle n offre pas déjà une méthode camelcase pour effectuer cette conversion. Malheureusement, ce n est pas le cas. En général, vous pensez alors ajouter une méthode camelcase en créant une sous-classe de NSString. Cette solution est toutefois mauvaise pour deux raisons : Nous l avons expliqué au Chapitre 9, NSString est un regroupement de classes. Bien que possible, la création d une sous-classe d un regroupement de classes est une entreprise loin d être triviale qui exige de sérieuses réflexions pour être menée à bien. Si vous ajoutez la méthode camelcase à l aide d une sous-classe, toutes les chaînes que vous souhaitez convertir en chaînes CamelCase doivent être des instances de cette sousclasse, non des objets NSString. Cette contrainte peut se révéler un véritable fardeau si les chaînes sont fournies par d autres classes. En effet, la plupart des classes qui manipulent des chaînes de caractères retournent des objets NSString simples. En fin de compte, la création d une sous-classe est une approche peu adaptée à cette tâche. A contrario, l utilisation d une catégorie révèle toute sa simplicité. Vous devez simplement déclarer la méthode dans une section @interface et fournir son code dans une section @implementation. Le moteur d exécution se charge d ajouter votre méthode de catégorie à la classe. Ensuite, la méthode de catégorie se comporte exactement comme si elle avait été implémentée dans la classe par le programmeur d origine. Voici un exemple de définition d une méthode de catégorie pour NSString. Le fichier d entête correspondant est comparable à celui d une classe normale (voir Exemple 11.1).

Chapitre 11 Catégories, extensions et sécurité 247 Exemple 11.1 : Le fichier d en-tête NSString+CamelCase.h #import <Foundation/Foundation.h> @interface NSString (CamelCase) -(NSString*) chainecamelcase; @end Le fichier d en-tête de la catégorie doit importer celui de la classe étendue. Dans cet exemple, le fichier d en-tête de la classe NSString est importé par Foundation/Foundation.h. La ligne @interface comprend le nom de la classe à laquelle la méthode est ajoutée (NSString) et le nom de la catégorie (CamelCase). Ce dernier est arbitraire (vous auriez pu choisir MajusculeInitiale ou tout autre nom). L exemple suit la convention de nommage en vigueur pour les fichiers de catégorie : NomDeLaClasse+NomDeLaCatégorie.h. Info À la différence des sous-classes, les catégories ne peuvent pas ajouter des variables à une classe. Le fichier d en-tête reflète cette contrainte : il ne contient aucune section de définition des variables d instance. Examinons à présent la mise en œuvre de la catégorie. Le fichier d implémentation (voir Exemple 11.2) ressemble fortement au fichier d implémentation d une classe normale. Il commence par importer le fichier d en-tête correspondant. Le code d implémentation de la méthode se trouve entre les directives @implementation et @end. La seule différence réside dans la ligne @implementation, qui inclut le nom de la catégorie entre parenthèses après le nom de la classe. Exemple 11.2 : Le fichier d implémentation NSString+CamelCase.m 1 #import NSString+CamelCase.h 2 3 @implementation NSString (CamelCase) 4 5 -(NSString*) chainecamelcase 6 7 NSString* chaineavecmajuscule = [self capitalizedstring]; 8 9 NSArray* composantes = 10 [chaineavecmajuscule componentsseparatedbycharactersinset: 11 [NSCharacterSet whitespacecharacterset]]; 12

248 Objective-C 2.0 13 NSString* resultat = @ ; 14 15 16 for ( NSString* mot in composantes ) 17 18 resultat = [resultat stringbyappendingstring: mot]; 19 20 21 return resultat; 22 23 @end Étudions à présent le code de l Exemple 11.2 : La ligne 7 invoque la méthode capitalizedstring de la classe NSString de manière à obtenir une nouvelle chaîne de caractères dans laquelle la première lettre de chaque mot de la chaîne d origine est en majuscule et toutes les autres lettres en minuscules. Vous remarquerez que, à l instar de n importe quelle autre méthode, une méthode de catégorie peut utiliser self pour faire référence au destinataire sur lequel elle a été invoquée. Une méthode de catégorie dispose également du même accès aux variables d instance de la classe qu une méthode normale. La ligne 9 obtient un tableau qui contient chaque mot de la nouvelle chaîne de caractères. La boucle qui débute à la ligne 16 concatène chacun des mots pour former une seule chaîne sans espaces. La ligne 21 retourne le résultat final. Puisque la chaîne renvoyée par stringbyappendingstring: est déjà à libération automatique, la chaîne résultante peut être retournée directement. Vous pouvez à présent invoquer la méthode de catégorie sur n importe quel objet NSString : #import NSString+CamelCase.h NSString* chaine = @ Luttons tous pour la sauver ; NSLog( @ %@, chaine ); chaine = [chaine chainecamelcase]; NSLog( @ %@, chaine ); Si vous exécutez le fragment de code précédent, vous obtenez le résultat suivant : Luttons tous pour la sauver LuttonsTousPourLaSauver

Chapitre 11 Catégories, extensions et sécurité 249 Redéfinir des méthodes avec des catégories Une catégorie peut également servir à redéfinir une méthode déjà existante dans une classe : Cette opération présente quelques subtilités et dangers. À moins d être parfaitement certain du comportement de la méthode dans toutes les situations, vous risquez de remettre en cause le fonctionnement du code. Lorsque vous utilisez une catégorie pour redéfinir une méthode, la nouvelle version remplace l originelle. La méthode de catégorie ne peut en aucun cas appeler la méthode d origine. Toutefois, si la méthode d origine redéfinissait elle-même une méthode de la super-classe, la méthode de catégorie peut toujours appeler l implémentation par la super-classe en utilisant super. Pour une classe donnée, vous pouvez définir autant de catégories que vous le souhaitez, à condition qu elles aient chacune un nom différent. Vous ne pouvez pas employer une méthode de catégorie pour redéfinir une autre méthode de catégorie. Si vous déclarez des méthodes de même nom dans des catégories différentes, le compilateur et l éditeur de liens ne génèrent aucune erreur, mais la version de la méthode invoquée dépend de l ordre de chargement des catégories. Catégorie ou sous-classe À chaque tâche son outil, mais quel est l outil véritablement approprié? Puisque chaque tâche est différente de l autre, je n ai pas de réponse définitive. Toutefois, voici quelques points à prendre en considération : La simplicité prévaut. Si une méthode de catégorie peut permettre de réaliser la tâche, utilisez-la. Plus la chaîne d héritage d une classe s allonge, plus la maintenance du code risque d être difficile. La création d une sous-classe d une classe implémentée sous forme d un regroupement de classes, comme NSString, demande un travail important. Si vous le pouvez, utilisez une catégorie. Les catégories ont une visibilité plus grande. Lorsqu une méthode est ajoutée à une classe par une catégorie, elle peut être utilisée avec n importe quelle instance de cette classe ou d une de ses sous-classes. La méthode de catégorie est ainsi plus largement disponible. Si vous pensez ajouter une catégorie à NSObject, arrêtez-vous et réfléchissez à votre conception. Une telle catégorie est rarement une bonne idée car elle affecte tous les objets du programme. La redéfinition avec une catégorie présente des risques. Soyez particulièrement attentif lorsque vous utilisez une catégorie pour redéfinir une méthode existante d une classe. Vous devez parfaitement comprendre le fonctionnement de la méthode d origine et ses utilisations avant de la remplacer.

250 Objective-C 2.0 L ajout de variables d instance exige une sous-classe. Si l extension d une classe comprend des variables d instance, vous devez créer une sous-classe. Parfois, vous n avez d autre choix que de créer une sous-classe. Si vous devez étendre la même classe de différentes manières en différents endroits du programme, vous n aurez probablement pas d autre choix que de créer une sous-classe. Certaines classes imposent la création de sous-classes. Certaines classes sont partiellement ou intégralement abstraites et exigent la création de sous-classes pour les rendre opérationnelles. NSView en est un exemple. Pour réaliser des affichages personnalisés ou pour répondre aux mouvements de la souris, vous devez créer une sous-classe de NSView. Essayez la composition. Vous pouvez également étendre une classe par composition. En utilisant la composition, qui est en réalité un design pattern non une caractéristique du langage, vous créez une classe totalement nouvelle dont l une des variables d instance fait référence à une instance de la classe étendue. Les messages qui peuvent être traités par la classe d origine lui sont passés au travers de la variable d instance. Les messages qui invoquent les nouvelles fonctionnalités sont traités par la classe englobante. Cette liste est longue, mais tous les points tournent autour de la même idée : avant d écrire du code, vous devez réfléchir. Autres usages des catégories Voici d autres usages des catégories : Une classe volumineuse peut offrir des méthodes par centaines et comprendre des milliers de lignes de code d implémentation. Pour un exemple extrême, examinez le fichier d en-tête de la classe NSWindow d AppKit (/System/Library/Frameworks/AppKit. framework/headers/nswindow.h). Les catégories permettent de découper une telle classe en plusieurs fichiers de taille plus raisonnable. Les variables d instance et les méthodes de base vont dans des fichiers d interface et d implémentation normaux. Les autres méthodes, regroupées judicieusement, sont placées dans différents fichiers de catégorie. Cela permet à plusieurs programmeurs de travailler simultanément sur la même classe. Les catégories peuvent également servir à déterminer les méthodes de la classe qui sont présentées à ses utilisateurs. Pour cela, il suffit de diviser les méthodes de la classe en deux groupes, publiques et privées. Les variables d instance de la classe et les déclarations des méthodes publiques sont placées dans un fichier d en-tête normal. Les méthodes qui forment l interface privée de la classe vont dans un fichier de catégorie. Il suffit ensuite de distribuer aux utilisateurs potentiels de la classe uniquement le fichier d en-tête public. Toutefois, n oubliez pas que cette solution masque simplement des

Chapitre 11 Catégories, extensions et sécurité 251 informations. Si quelqu un fouine un peu et découvre le nom d une méthode privée, rien ne peut l empêcher de l invoquer. Enfin, les fichiers d en-tête d une catégorie, sans les fichiers d implémentation correspondants, peuvent servir à déclarer des protocoles informels (voir Chapitre 13). Le fichier d en-tête de catégorie permet d indiquer au compilateur les méthodes définies dans le protocole et implémentées par les classes qui l adoptent. Les méthodes de catégorie sont des citoyens de première classe Les méthodes définies dans une catégorie ont les mêmes droits et privilèges que les méthodes définies dans l interface de la classe. En réalité, à l exécution, il n existe aucune différence entre les deux. Elles disposent d un accès total à toutes les variables d instance de la classe et elles sont héritées par les sous-classes de la classe. Extensions Supposez que vous écriviez une classe que d autres programmeurs utiliseront. Vous souhaitez que certaines méthodes soient réservées à votre usage interne. Si vous les déclarez dans le fichier d en-tête de la classe, elles sont visibles à quiconque utilise votre classe. Les extensions vous permettent de déclarer des méthodes avec une visibilité privée en ajoutant une section interface dans le fichier d implémentation de la classe. Les extensions étendent la déclaration d interface dans le fichier.m. Les extensions sont souvent employées pour définir un mutateur interne pour une variable d instance qui doit rester publiquement en lecture seule. L Exemple 11.3 dévoile le fichier d en-tête d une telle classe. Il déclare un accesseur pour la variable d instance boolenlectureseule, mais ne déclare aucun mutateur. De cette manière, la variable boolenlecture- Seule est effectivement en lecture seule (tout au moins pour ceux qui s abstiennent de fouiner ; voir Section "Sécurité"). Exemple 11.3 : Le fichier d en-tête ClasseAvecExtension.h @interface ClasseAvecExtension : NSObject BOOL boolenlectureseule; - (BOOL) boolenlectureseule; @end

252 Objective-C 2.0 Les extensions sont comparables aux déclarations de catégories, mais elles n ont pas de nom. Une extension est ajoutée dans le fichier d implémentation de la classe, avant la directive @implementation (voir Exemple 11.4). Notez que les parenthèses vides de la ligne @interface sont obligatoires. Exemple 11.4 : Le fichier d implémentation ClasseAvecExtension.m #import ClasseAvecExtension.h @interface ClasseAvecExtension () - (void) setboolenlectureseule: (BOOL) nouvellevaleur; @end @implementation ClasseAvecExtension - (BOOL) boolenlectureseule return boolenlectureseule; - (void) setboolenlectureseule:(bool) nouvellevaleur boolenlectureseule = nouvellevaleur; - (id) init if (self = [super init] ) [self setboolenlectureseule: YES]; return self; @end Une extension peut être assimilée à une catégorie anonyme, mais voici deux différences : Le code d implémentation des méthodes d une extension doit se trouver dans la section @implementation du même fichier.

Chapitre 11 Catégories, extensions et sécurité 253 Contrairement à une catégorie, le compilateur procède à des contrôles. Si vous déclarez une méthode dans une extension en oubliant de l implémenter, vous recevez un avertissement. Contrôle des accès aux variables d instance Objective-C dispose de trois directives pour contrôler l accès aux variables d instance d un objet : @private. La variable d instance est accessible uniquement depuis les méthodes de la classe qui l a déclarée. Les accès depuis une sous-classe génèrent une erreur. @protected. La variable d instance est accessible depuis les méthodes de la classe qui l a déclarée et depuis celles des sous-classes. @public. La variable d instance est accessible depuis n importe quel endroit, même dans le code qui se trouve hors de la classe qui l a déclarée ou de ses sous-classes. La directive @public permet non seulement d accéder à la variable d instance depuis les méthodes de la classe de déclaration ou de ses sous-classes, mais également de traiter un pointeur sur une instance de la classe comme un pointeur sur une structure C. Vous pouvez accéder à la variable d instance de la manière suivante : instance->variable d instance; Accès direct aux variables d instance Je viens d expliquer que vous pouvez accéder directement aux variables d instance, mais laissez-moi préciser immédiatement que ces accès doivent être bannis. En accédant aux éléments internes d une classe, l encapsulation n est plus respectée alors qu elle représente l un des principes fondateurs de la programmation orientée objet. Si l implémentation de la classe vient à être modifiée, votre code peut ne plus fonctionner. Les directives se trouvent avant les variables d instance qu elles précisent, dans la section interface de la classe. Une directive reste en vigueur jusqu à son remplacement par une directive différente. En l absence d autre directive, la visibilité par défaut correspond à @protected (voir Exemple 11.5).