Aller au contenu

Partie 1 : Interface, implémentation et programmation objet

Programme officiel (B.O.)

B.O. spécial n° 8 du 25 juillet 2019 - NSI Terminale

Contenus Capacités attendues Commentaires
Structures de données, interface et implémentation. Spécifier une structure de données par son interface. Distinguer interface et implémentation. Écrire plusieurs implémentations d'une même structure de données. L'abstraction des structures de données est un des fondements de l'informatique.
Vocabulaire de la programmation objet : classes, attributs, méthodes, objets. Écrire la définition d'une classe. Accéder aux attributs et méthodes d'une classe. On s'appuie sur la programmation objet pour implémenter les structures de données.

1. Interface vs implémentation

1.1 Structure de données abstraite

Une structure de données est une manière d'organiser des informations pour les manipuler efficacement. On la décrit par son interface : l'ensemble des opérations qu'elle propose, sans préciser comment elles sont réalisées.

L'implémentation est le choix concret de la représentation en mémoire et de l'algorithme de chaque opération.

Analogie

L'interface est comme le mode d'emploi d'un appareil (quels boutons, quelles fonctions), tandis que l'implémentation est le circuit électronique à l'intérieur. L'utilisateur n'a pas besoin de connaître le circuit pour se servir de l'appareil.

1.2 Pourquoi cette distinction ?

  • On peut changer l'implémentation sans modifier le code qui utilise la structure ;
  • Plusieurs implémentations d'une même interface peuvent avoir des performances différentes ;
  • Cela favorise la modularité et la réutilisabilité du code.

1.3 Exemple : une structure « Compteur »

Interface (ce qu'on peut faire) :

Opération Description
creer() Créer un compteur initialisé à 0
incrementer() Augmenter le compteur de 1
valeur() Lire la valeur actuelle
reinitialiser() Remettre le compteur à 0

Implémentation A (avec un entier) :

class CompteurEntier:
    def __init__(self):
        self.n = 0

    def incrementer(self):
        self.n += 1

    def valeur(self):
        return self.n

    def reinitialiser(self):
        self.n = 0

Implémentation B (avec une liste) :

class CompteurListe:
    def __init__(self):
        self.elements = []

    def incrementer(self):
        self.elements.append(1)

    def valeur(self):
        return len(self.elements)

    def reinitialiser(self):
        self.elements = []

Les deux implémentations offrent la même interface, mais diffèrent en performance et en mémoire.


2. Programmation orientée objet

2.1 Vocabulaire

Terme Définition
Classe Modèle (plan) qui définit les attributs et méthodes d'un type d'objet
Objet (instance) Exemplaire concret créé à partir d'une classe
Attribut Variable attachée à un objet (ses données)
Méthode Fonction attachée à un objet (ses comportements)
Constructeur Méthode spéciale __init__ appelée à la création de l'objet

2.2 Définir une classe

class Point:
    def __init__(self, x, y):
        self.x = x     # attribut
        self.y = y     # attribut

    def distance_origine(self):    # méthode
        return (self.x ** 2 + self.y ** 2) ** 0.5

    def translater(self, dx, dy):
        self.x += dx
        self.y += dy

    def __str__(self):
        return f"({self.x}, {self.y})"

2.3 Utiliser une classe

p = Point(3, 4)              # création d'un objet (instance)
print(p.x)                   # accès à un attribut → 3
print(p.distance_origine())  # appel de méthode → 5.0
p.translater(1, -1)
print(p)                     # → (4, 3)  grâce à __str__

2.4 Méthodes spéciales

Python permet de définir des méthodes spéciales (dites dunder methods) pour personnaliser le comportement des objets :

Méthode Rôle
__init__(self, ...) Constructeur : initialise l'objet
__str__(self) Représentation lisible (print, str())
__repr__(self) Représentation technique (console interactive)
__eq__(self, other) Comparaison ==
__len__(self) Résultat de len(objet)

2.5 Encapsulation

L'encapsulation consiste à regrouper les données (attributs) et les traitements (méthodes) dans un même objet. L'utilisateur interagit avec l'objet uniquement via ses méthodes, sans connaître la structure interne.

class CompteBancaire:
    def __init__(self, titulaire, solde=0):
        self.titulaire = titulaire
        self.solde = solde

    def deposer(self, montant):
        assert montant > 0, "Le montant doit être positif"
        self.solde += montant

    def retirer(self, montant):
        assert 0 < montant <= self.solde, "Fonds insuffisants"
        self.solde -= montant

    def __str__(self):
        return f"Compte de {self.titulaire} : {self.solde} €"

À retenir

Concept Description
Interface Ensemble des opérations offertes par une structure de données
Implémentation Réalisation concrète (comment les opérations fonctionnent)
Classe Modèle définissant attributs et méthodes
Objet Instance concrète d'une classe
Attribut Donnée attachée à un objet
Méthode Fonction attachée à un objet
Encapsulation Regroupement données + traitements dans un objet