Bienvenue à la deuxième partie de cette série d'introduction sur Objective-C. Après avoir passé la semaine dernière à passer en revue les principes fondamentaux du langage C sur lequel repose Objective-C, cette semaine nous allons nous concentrer sur ce qui fait d’Objective-C un si bon langage pour le développement de logiciels. Plus précisément, nous discuterons des principes fondamentaux de la programmation orientée objet et montrerons comment créer une classe et envoyer des messages aux objets dans Objective-C..
Pourquoi avons-nous Objective-C? Pourquoi ne pas simplement utiliser le langage C sous-jacent? La raison pour laquelle nous avons Objective-C est de nous donner un terrain de jeu orienté objet dans lequel construire nos applications. La POO est un paradigme de programmation qui permet aux développeurs de penser à la conception de logiciels en termes d'objets et d'attributs au lieu de variables et de fonctions. Plus spécifiquement, OOP tente d'obtenir l'abstraction, l'encapsulation, la modularité, le polymorphisme et l'héritage des données. Le sujet de la programmation orientée objet peut facilement remplir un livre (ou une série de travaux dirigés) tout seul. Je vous présenterai donc les principes de base à titre d'exemple..
Imaginez que vous avez une voiture. Vous pouvez considérer votre voiture comme un objet. Il existe de nombreuses autres voitures dans le monde et vous pourriez même en posséder plus d'une. Votre voiture a diverses propriétés: marque, modèle, couleur, type de moteur, etc. En termes de programmation orientée objet, nous appellerions le concept abstrait de voiture une «classe» et la voiture individuelle pour laquelle vous possédez un objet ou une instance (objet instancié) de la classe. Quand une nouvelle voiture est fabriquée, une nouvelle instance de la classe de voiture est instanciée (ou créée) et possède son propre ensemble de propriétés..
Encore un peu flou? Une autre grande analogie est celle du cookie et du emporte-pièce. La classe est le cookie cutter, et l'objet est le cookie.
Alors, pourquoi penser en termes d'objets? L’une des meilleures raisons est que votre cerveau conceptualise naturellement la vie dans le monde réel et qu’il est très avantageux d’être en mesure d’abstraire le développement logiciel dans des termes similaires..
Les classes (et donc les objets) sont constituées de méthodes et d'attributs. Si vous venez d'un autre langage de programmation, vous serez peut-être plus familier en associant des méthodes à des fonctions et des attributs à des variables. Nous discuterons chacun à son tour.
Nous avons donc un "exemple" de voiture, maintenant que faisons-nous avec? Eh bien, nous le conduisons et le remplissons d’essence, entre autres. Conduire et faire le plein d’essence s’applique uniquement aux voitures que nous utilisons. En d’autres termes, lorsque nous remplissons une voiture ou conduisons une voiture, nous n’avons d’impact que sur un cas, et non sur toutes les voitures du monde. Par conséquent, le fait de remplir l'instance de voiture est considéré comme un méthode d'instance. C'est quelque chose que nous faisons à notre instance et seulement notre instance.
D'autre part, si nous demandons à la classe de voiture d'origine combien de couleurs de voiture sont disponibles, il s'agit d'une méthode de classe car nous ne parlons plus seulement de la voiture que nous conduisons, mais de toutes les voitures en général..
Beaucoup de ces principes deviennent plus clairs avec l'utilisation, regardons donc un peu de syntaxe.
En Objective-C, nous appelons les méthodes d'objet en transmettant des messages. Lorsque nous voulons savoir combien d’essence il ya dans notre cas de voiture, nous envoyons un message à notre cas et le message est la méthode que nous voulons appliquer. Par programme, cela ressemble à ceci:
[message du destinataire];
Les crochets indiquent que nous envoyons un message. Le premier paramètre est qui doit recevoir ce message et le second paramètre est ce que le message est réellement. Enfin, nous terminons par un point-virgule comme dans la plupart des langages de programmation.
Donc, avec notre exemple précédent en tête, voici comment nous pourrions interagir avec notre exemple de voiture pour ajouter de l'essence au réservoir;
[dansCar addGas];
L'exemple ci-dessus suppose que nous avons instancié une instance de la classe Car et que nous l'avons nommée «dansCar». Nous transmettons ensuite le message «addGas» à l'objet «dansCar», ce qui équivaut à appeler une fonction. Dans une autre langue, cette ligne pourrait ressembler à:
dansCar.addGas ();
Supposons que notre voiture ait un réservoir d'essence stocké sous forme de pourcentage. Par exemple, si le réservoir d'essence est à 50%, il est à moitié plein et s'il est à 100%, cela signifie qu'il est plein à ras bord. Maintenant, si nous voulons savoir combien d’essence il y a dans le réservoir, nous ne prenons pas directement cette information d’un attribut. Au lieu de cela, nous utiliserions une méthode d'accès pour accéder à la variable interne pour nous. De même, lorsque nous voulons remplir le réservoir, nous ne donnons pas simplement un nouveau pourcentage à l'attribut d'essence, nous utilisons un outil de définition pour mettre à jour l'attribut pour nous. Ce processus est appelé encapsulation de données..
Ce que nous entendons par encapsulation de données est que les données sont contenues (pour ainsi dire) par des méthodes, ce qui signifie que pour y accéder, nous devons utiliser des méthodes. Certains d'entre vous qui ont programmé dans d'autres langues et n'ont pas entendu parler de l'encapsulation de données se demandent peut-être pourquoi nous procédons ainsi. La réponse est qu’en encapsulant des données, il existe un bon coussin entre le développeur d’une classe et l’utilisateur d’une classe. Comme les méthodes de classe gèrent et maintiennent les attributs au sein de la classe, elles peuvent plus facilement maintenir l'intégrité des données. Un autre avantage majeur est que, lorsqu'un développeur distribue sa classe, ceux qui l'utilisent n'ont pas à se soucier de son contenu. Un développeur peut mettre à jour une méthode pour la rendre plus rapide ou plus efficace, mais cette mise à jour est transparente pour l'utilisateur de la classe car il / elle utilise toujours la même méthode sans modifier son code..
Cela nous amène gentiment à la section suivante que nous allons examiner, à savoir comment Objective-C sépare l'interface de la mise en œuvre..
Lorsque vous créez ou travaillez avec une classe simple dans Objective-C, vous verrez que celle-ci contient par défaut deux fichiers. Le premier est le fichier d’implémentation qui se termine par un suffixe .m et le fichier d’interface, qui se termine par un suffixe .h.
#importation@interface Car: NSObject // C'est ici que les attributs vont float fillLevel; // C'est ici que les méthodes vont - (void) addGas; @fin
Tout d'abord, nous importons Cocoa.h, une bibliothèque standard avec beaucoup de code réutilisable que nous pouvons utiliser dans notre application..
Ensuite, nous déclarons qu'il s'agit de l'interface de la voiture, mais nous intégrons également NSObject dans cette déclaration. Ajouter «: NSObject» signifie que la classe Car hérite de la classe NSObject. Nous parlerons davantage de l'héritage dans un futur tutoriel.
Notre variable d'instance «fillLevel» est déclarée suivante et nous spécifions qu'elle est du type de données «float» afin que nous puissions facilement représenter un pourcentage.
La ligne suivante déclare notre méthode “addGas”. Le «-» indique qu'il s'agit d'une méthode d'instance et non d'une méthode de classe. La partie «(void)» signifie que la méthode ne renverra rien à la fin de l'exécution. Si la classe devait renvoyer un entier, il serait remplacé par «(int)» et il en serait de même pour tout autre type de données. Enfin, nous finalisons la déclaration de la méthode avec un point-virgule.
#import "Car.h" @implementation Car - (void) addGas // le code va ici pour ajouter du gaz @end
La mise en œuvre dans ce cas contient la méthode pour ajouter du gaz dans le réservoir. Nous importons également Car.h, qui est le fichier d'interface. Là où notre méthode addGas est installée, nous pourrions ajouter beaucoup plus de méthodes, mais le but actuel est simplement de vous faire comprendre le fonctionnement des classes plutôt que de créer une classe à part entière..
La prochaine fois, nous approfondirons les méthodes et utiliserons les variables avec les méthodes (ainsi que les bases de la gestion des variables dans Objective-C). Ce didacticiel n'était pas trop long, car il est souvent difficile pour les nouveaux développeurs de comprendre pourquoi nous séparons les classes dans plusieurs fichiers. Si vous vous sentez confus, veuillez relire ce qui précède ou poser des questions dans la section commentaires ci-dessous. Les cours reviendront constamment dans cette série et il est important que vous compreniez comment ils fonctionnent.
Étant donné que cette partie de la série était assez théorique, vous ne pouvez pas trop en faire pour vous entraîner. Cependant, je vous recommande cette semaine de vous inscrire au site Web du développeur d’Apple, car c’est une référence inestimable. Une fois que vous avez terminé, explorez certaines de leurs classes téléchargeables et téléchargez-en quelques-unes simples. Vous n'avez pas besoin de comprendre tout le code, il suffit de regarder comment les classes sont formées et séparées entre les fichiers.