Programation orientée Objet - Avancée

Ludovic Deneuville, Rémi Pépin

Plan

  1. Notions avancées de POO
    • Rappels
    • Classes abstraites
    • Bridge pattern
  2. Génie logiciel
    • Définition
    • Single responsibility principle
    • Design patterns

Quelques rappels

Les trois principes de l’objet :

  • Encapsulation : un objet va contenir des attributs et des méthodes.
  • Héritage : un objet peut hériter des attributs et méthodes d’une autre classe pour les redéfinir. Il peut également ajouter d’autres attributs/méthodes.
  • Polymorphisme : une méthode peut être associée à un code différent en fonction des paramètres passés ou de l’objet auquel elle appartient.

Un exemple pour illustrer cela

Application de traitements automatiques des données :

  • Plusieurs sources de données : enquêtes, webscraping, fichiers administratifs, …
  • Plusieurs formats de données : csv, xml, json, … (on en reparlera)
  • Plusieurs algorithmes de traitement : statistique exploratoire, régression, “machine learning”, …

Exemple de diagramme de classe

Un exemple avec de l’héritage

Les classes abstraites

Classe Abstraite : classe dont l’implémentation n’est pas complète et qui n’est pas instantiable. Permet de passer un contrat. Les classes filles vont devoir implémenter ce qu’il manque.

Avantages :

  • Nous savons ce que les classes filles doivent faire 👍
  • Nous pouvons générer du code 🙏
  • Limite le risque d’erreur !! 👌

Par exemple

Et en Python ?

  • Pas de gestion native des classes abstraites 😱
  • Module Abstract Base Classes (abc) pour résoudre le problème 🦾
  • Déjà inclus dans votre distribution Python 😌
    • Step 1 : Importer le module 🧳
    • Step 2 : Hériter de ABC 👨‍👩‍👧‍👦
    • Step 3 : Définir les méthodes abstraites 📝
    • Step 4 : ???
    • Step 5 : Profit 💰💰

Et si on ajoutait les formats de données ?

Actuellement, 3 formats de données dans notre application :

  • CSV : Comma Separated Values (tabulaire)
  • XML : eXtended Markup Language (format à balise)
  • JSON : JavaScript Object Notation (format clef-valeur)

Par exemple

Voyez-vous un problème ?

La puissance de la POO

  • Actuellement 4 * 3 classes “concrètes” à définir 😱
  • La lecture du format est dépendante de la source 😵

MAIS

  • On peut externaliser ce traitement ! 😌
  • Relation d’agrégation 🤯

Le bridge pattern

Work smart, not hard

  • Composition + héritage : 9 classes 😎
  • Héritage : 17 classes 😫
  • On peut facilement ajouter des types et des formats 🥳

Pattern Bridge

Découpage d’une grosse classe en un groupe de petites classes avec leur propre hiérarchie qu’il faut ensuite assembler.

Pour résumer

  • Utiliser la puissance de la POO 💣
  • Préférer les objets spécifiques (héritage) au if/elif/else 🐱‍🏍
  • Les classes abstraites sont des plans pour les futures classes 👷‍♀️👷‍♂️
  • La POO permet de créer des codes plus lisibles, évolutifs et maintenables 👑

Le génie logiciel

C’est quoi le génie logiciel ?

  • Un constat : coder bêtement ne permet pas de faire une application de qualité.
  • Mais empiler des briques bêtement ne permet pas de faire une maison, même si on a un plan.
  • Besoin de planifier, de documenter, de tester…

Pourquoi c’est important : parallèle avec la construction d’une maison

Pourquoi c’est important : parallèle avec la construction d’une maison

  • Vous avez le plan de construction d’une maison (fourni par l’architecte)
  • Mais implémenter ce plan demande des connaissances techniques
  • Besoin de refaire des schémas pour des zones précises (arches, escaliers, …)
  • Ce n’est pas du temps perdu !

Faire du code de qualité c’est comme faire de l’artisanat de précision, cela demande outils, expérience et méthodes.

Quelques principes de base

  • Décomposition d’un programme en modules simples cohérents
  • Les modules exposent des méthodes utilisables/surchageables par d’autres modules mais restent protégés aux modifications non prévues
  • Chaque module doit être une boîte noire pour les autres
  • Si on garde les mêmes entrées/sorties, on peut changer un module sans risque
  • Privilégier abstractions + héritage plutôt que if/elif/else

Un mantra

Important

Faible couplage, forte cohérence

  • Faible couplage inter-classes : modifier une classe doit impacter les autres le moins possible.
  • Forte cohérence intra-classe : chaque classe doit être un ensemble cohérent d’attributs et de méthodes.

Faible couplage, forte cohérence : pourquoi le respecter ?

  • Travail en groupe 🦸‍♀️🧙‍♂️👨‍💼👩‍🔬
  • Lisibilité du code 📖
  • Débogages 🐞

Limiter les risques d’erreur quand on modifie le code (éviter l’assiette de spaghetti) 🍝

Retour sur le bridge pattern

Retour sur le bridge pattern

  • La partie “Source” gère les traitements liés à la source.
  • La partie “Fichier” gère la lecture de fichier.
  • Seules les entrées/sorties comptent.
  • On peut ajouter une partie “Traitement” pour des traitements supplémentaires.
  • Pas de if/elif/else inutiles.

Chaque partie de notre code s’occupe d’une seule chose

Les design patterns : définition

“En informatique, et plus particulièrement en développement logiciel, un patron de conception (souvent appelé design pattern) est un arrangement caractéristique de modules, reconnu comme bonne pratique en réponse à un problème de conception d’un logiciel. Il décrit une solution standard, utilisable dans la conception de différents logiciels.”
Source

Les design patterns : in a nutshell

  • Bonnes pratiques
  • Solutions standards à des problèmes de conception
  • Solutions robustes
  • Indépendants de la technologie
  • Indépendants du métier

Est un outil qui est là pour vous aider

Les design patterns : exemple

Problème récurent :

  • Créer des objets complexes qui sont une composition de caractéristiques indépendantes
  • Dit autrement : découpler l’abstraction de son implémentation pour qu’elles puissent varier indépendamment

Les design patterns : exemple

Pour résumer

  • Faire une application complexe demande un code complexe 🧩
  • Sans phase de conception on va dans le mur 🧱
  • Il existe des solutions prêtes à l’emploi à des problèmes courants 🧰

Important

Faible couplage, forte cohérence