🧩 OOP#

À propos de cette page

Une rapide introduction au monde de la programmation orientée objet avec les langages Java et C#.

Qu’est ce que l’OOP ?#

Il existe des tas de manières de programmer, des styles et des formes que l’on donne au code.

Il s’agit des paradigmes de programmation: procédurale, fonctionnelle, orientée flux, par contrat, etc.

La programmation orientée objet ou POO (OOP) est:

  • Un point de vue,

  • Un outil,

  • Un paradigme,

  • Utilisé en C#, C++, Java, Ruby, Python, …

Il s’agit d’une traduction du monde réel vers un paradigme défini.

Monde réel

Procédural

Objet

Nessie est un Diplodocus et il a 12 ans.

string name = "Nessie";
string specie = "Diplodocus";
int age = 12;

ShowDinoInformation(name, specie, age);
class Dinosaur {
   +name: string
   +specie: string
   +age: int

   +roar(): string
   +sayHello(): string
}

En procédural, on observe la création de variables pour chaque dinosaure. Il s’agit d’une part de redondance de code et d’autre part d’un lien sémantique entre les variables et les traitements non explicite.

Des objets#

Qu’est ce qu’un objet ?

Un objet est un truc, un machin ou encore un bidule. Sa définition est floue, pour résumer un object peut être n’importe quoi que vous décidiez de coder,

« Ce truc possède telle donnée, et fait telle chose avec »

Important

Définir une classe permet de décrire à quoi ressemble notre objet:

  • Quels sont ses attributs (sa mémoire),

  • Quels sont ses méthodes (son comportement).

https://www.plantuml.com/plantuml/svg/NO-n2W9134Jx_OgKYc0Xs5XT8NALlo1nDvxBxIQIv0eH_zs5ipXkkhpCC4ndZkfJBP0oY-6ajqh-b6J18XQ2m_uORCpyGiKATupZe39nYb94mHNPselO5wv43voANuJzYfMWRwaGOa4pEFzhu1EWQSVDS09ppJpCn5uKyuhXq41k9VEfWhhPhcBuxgaKMV1l21rnQkj-

Exemple de diagramme UML d’une classe dinosaure#

Des packages#

Note

Un package permet de regrouper des classes en ensembles appelés packages, leurs utilisations facilite la modularité, et impose une organisation à notre code.

https://www.plantuml.com/plantuml/svg/TL51QWCn3Bpx5JgsXFOGw2Md54h9fRta0KMrLMFYjHR96qXB_rvbSP8DtGYVPaOp8xpMYbA7BaD8XHK7-UZHxp2IKu-POFduv7INIe-27NmQ5uM74Znd5gY2HOsYKYUgG5yuvFhAfRvZHx2nBUUQBxoHyZSd3p_EWOtFg0elBTvGQFDGR7a5MYMLU46r9vzcSFDUGR8YPsWXZ79t_q-wK3niA6UUuoADfMzGsp7y1laSH-ROuHBLxAQtc6RFALo9cl7rSNF2OyZfr2d_wvozDPLWl_a7

La portée/Visibilitée#

Il s’agit d’un mécanisme à la base de la OOP. Il permet d’indiquer l’accessibilité de nos attributs/méthodes, et par conséquencet de « cacher » des détails d’implémentations.

  • public Accessible de partout

  • protected Accessible à l’intérieur de la classe et des classes dérivées

  • private Accessible uniquement à l’intérieur de la classe

https://www.plantuml.com/plantuml/svg/NO-n2i9038RtUugCIj51S77g8DB9LoZnBfQZrrn9SeA8x-wX3jLi-Vul_AHLGx4o9GYHisAHVfPuGoEd7XF1RhjtEaQUKN222_fna5mu-9ooW0coreZO5bQWAvPafynsnecWgrVE-OIgSFpMmCD1dGrNuG1g4ddu49t9np-6GmMnbhpNHZBAQlsZD8htZbBA2_vqhYKEzRiN

Les Getter et Setter#

Ils permettent respectivement d’accéder et de modifier la valeur d’un attribut. Il convient de créer un couple get/set par attribut que l’on souhaite exposer. Leurs utilisations permet d’ajouter un comportement préalable.

https://www.plantuml.com/plantuml/svg/RL51QWCn3Bpx5JgsXFOGwAMd54h9gPS-8AYsOaoySf2qWH3wzsetcv0iyKLuPZmpmYir5Ekx2gbmK-nbaycCPAFZ21gn4YnVtuBk2kzHi8DVZBiihUSKMsq29iZg5B7Tg19jiQ_srTY-iIDO-wiGOaLL-9p2u1J0pmkxu1tKf70-8xgdM6OOPWUAXupNXJIKf-SxoKBnkAPQsnptfOOI3-2VCUW1yP57TCWxMqyMjrsTFxIIheB9xBxyN3GONrQvS7yXh8YJVyG_

Les méthodes statiques en OOP#

La conception objet préconise d’utiliser des instances, toutefois il existe des cas où une instance de classe est inutile.

Le mot clé static permet à une méthode de s’éxécuter sans avoir à instancier la classe, l’appel se fait via le nom de la classe au lieu du nom de l’instance.

https://www.plantuml.com/plantuml/svg/JOyz2W9138NxEKLAHR4GRAmiH1J4AqXs9gw3ivaboHQoU7U3VnX2YfVlXPUD6eeDNO6KkIeESdR5SZntPDUQWaOi1Cl5AkWjSu-27JGORwtKWLEifGgO8AklYEsFIdJ1eTYkifsm8zYxAuJU9xO41sw9OGm1l691LJXYKmMjojrr-DHiVETvH24qsdvIJjXFha5DChTp-E5VMdkA-GTCr_0rliX72DuRukIVFm4=

En général, une classe possédant des méthodes statiques n’est pas conçue pour être instanciée, mais cela ne signifie pas qu’une classe possédant une méthode statique ne doit jamais être instanciée.

Attention

Une méthode statique ne peut pas utiliser des variables d’instance qui sont par définition non statiques.

Les attributs statiques en OOP#

Un attribut statique est partagée par toutes les instance de la classe.

Les attributs statiques sont initialisés lorsque la classe est chargée. Les règles utilisées pour l’initialisation d’un attribut statique sont les mêmes que pour les attributs non statiques.

Indication

  • Un attribut déclaré final ne change de plus de valeur une fois initialisé.

  • Un attribut static est utilisable sans instancier la classe.
    • Un attribut est visible « partout » si public.

Par conséquent, un attribut public static final est une constante. Par convention son nom est en majuscule.

L’héritage en OOP#

Il s’agit d’une méthode de conception qui consiste à extraire les caractéristiques communes, et à les placer dans une classe plus abstraite, puis à en faire hériter les classes filles.

https://www.plantuml.com/plantuml/svg/TP91Jm8n48Nl_HLpr10yc7WX7Z0nXWiUnBiPkkFQqEriEbqZ8l_TOLsWIEcXc_Hx--RDj5D965FNUAXSOC4koji7HPUm9YCMFS7jpPsHbGijHcnWYNPLH-v2PTbpX1GnY28AALDLz8wTJqySqZCs13FzovXMT_M5EGb_ixEmCSQ0BboA-jW4rgC8F0vHbCEmna5j9g0o5-hZwKRZ9sUtqf9r1QxL9k0qsk5e51dZrVMPT2Iudf7tN68rzMrSG8k--0NuKFTab-5OQh3BUrBD9xlgH3GOdpPN4kwAx5lD-VQlx_rKMyyLsqvsSp_3YqHrF_MUd-7NjLvq60Glz5NKH6SfOk8si-Y_Xnkz_ncFyoG5cWKfqFyvIf8i1XYDCALGwHF_1G==

Lors de la conception, il faut placer le code commun dans une classe mère. On dit que la classe fille hérite ou étend la classe mère. Les classes filles héritent les méthodes et les attributs de la classe mère.

Note

Une classe fille peut si nécessaire:

  • ajouter des attributs/méthodes qui lui sont propres,

  • redéfinir les méthodes qu’elle hérite de la classe mère.

Il reste une seule implémentation de chaque méthode à maintenir et il est possible de redéfinir une méthode dans la classe fille.

https://www.plantuml.com/plantuml/svg/bLF1JW8n4BttA-Qe8NWmyK8yO68C5ps8TpAquzhGxMpQBX6HVtTO5oXQ4kXXTzFttinxi-qu9WofhHqOwpbY6-BiWu9DMD6Cb_9bI4MDZk3svax5XVKD1gnXZdfH1MwzqUmuG0heeq3aKyOoz8wjIq_iqmlM11DHATN8K-h3CqN-OgjXhPG2MJYFKaSdq0vZXCVUak3Ghw6NCYCGclNLONSjCPBLczYGjWLSket0YhNzrY0mXglhVzH1nDM4dECILb4NumGqxPgV01-g3jbwEBJgo-MPXBDaQuv8VU7ZS2NYjiakQevlVdFlfjeuDgpRcCsrD8uZrJHHrVsCosHlApaNlXU-qkT5sc0r1KpSdD6oU-yFpFttS9W7BQ1Pe0BwrtU9aja39HR6v8tSf1y=

Visibilité et Héritage

Les niveaux de visibilité affectent différement l’héritage des attributs/méthodes,

  • les membres publics sont toujours accessible,

  • les membres privées ne le sont plus,

  • les membres protégées sont accessible dans la classe et les classes filles.

Quand utiliser l’héritage ?

Quand une classe est une spécialisation d’une autre, quand plusieurs classes auront le même comportement de base ou encore quand une classe réussit le test du EST-UN.

Les avantages de l’héritage sont :

  • Éviter la duplication de code,

  • Simplifier la maintenance et l’évolution du code,

  • Garantir que les classes filles possédent un comportement spécifique,

  • Toute classe fille d’une classe mère est substituable là ou le type de la classe mère est attendu, c’est le polymorphisme.

Ls interfaces en OOP#

Une classe est un ensemble nom et données couplé à des opérations. Souvent on utilise uniquement une classe pour les services rendus par celle-ci i.e. à son interface.

Note

Une interface est un comportement commun entre différentes classes sans lien d’héritage.

Une interface contient uniquement des signatures de méthodes, de propriétés. Une interface contient des définitions pour un groupe de fonctionnalités connexes qu’une classe peut implémenter.

https://www.plantuml.com/plantuml/svg/JOun2q8n38Jt_8gCYk0Wk3YzINHnyUqIsxn7QPfAcaxYVxUJUDjntnqtDIVpNWIJEjj2WHyaLHbQ864yx8_GSj8N6HLyKiYhrQunLAc6RgHjHAp-HqLUg8kVg_gD2kDbj01--tYTIJ8RlW67TZxSPdl2krlI5Ju04siSbxu=

Par convention les noms d’interfaces commencent par un I. Toute classe qui implémente une interface doit contenir une définition pour chaque méthode définit au sein de l’interface;

Avertissement

L’interface ne définit pas la méthode ! Elle ne fournit que la signature.

https://www.plantuml.com/plantuml/svg/NP0n2y9038Nt_8gCYj11S1471v6wkEWkwJKjfTUSv58SjF_TKwbOi-NBUoyXssYardSU6p7MYXnVdASOEK9qv1cNsGfYsyYLb3eioBMrXbvA5tnGD2M9QSHYFwgIA-gzxOFOaJh6FBa0lXlmS2RVik8TCDN2KZURh_5asaWD0m2yRy0y54LZIJQCP7SZhIP0gGwIo0kDkPj7betcAVp8_zWh4s3BKgP7F04=

Important

Les membres d’une interface sont automatiquement publics, non statiques. Pour implémenter un membre d’interface, le membre correspondant de la classe doit être public, non statique et porter le même nom et la même signature.

Quand une classe implémente une interface, elle doit fournir une implémentation pour l’ensemble des membres définit au sein de l’interface.

Attention

L’interface n’offre aucune fonctionnalité dont une classe peut hériter à la manière de l’héritage.

Toutefois si une classe mère implémente une interface, alors les classes filles bénéficient de cette implémentation.

Pour aller plus loin, vous pouvez consulter les deux chapitres suivants traitant des langages Java et C#.