Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
ISP : Ségrégation des interfaces
Le principe de segregation des interfaces (ISP) dit : ne force pas les classes a implémenter des méthodes qu'elles n'utilisent pas.
Imagine une grosse interface Machine avec imprimer(), scanner(), envoyer_fax(). Si tu as une simple imprimante, elle est forcee d'implémenter scanner() et envoyer_fax() meme si elle ne sait pas faire ca. C'est absurde.
La solution : plusieurs petites interfaces au lieu d'une grosse.
En Python, on utilise les classes abstraites (ABC) pour definir des interfaces :
from abc import ABC, abstractmethod
class Imprimable(ABC): @abstractmethod def imprimer(self): pass
Une classe qui herite d'un ABC est OBLIGEE d'implémenter les méthodes abstraites. Sinon, Python refuse de l'instancier.
Crée des interfaces fines : - Imprimable (ABC) avec imprimer() abstraite - Scannable (ABC) avec scanner() abstraite - Faxable (ABC) avec envoyer_fax() abstraite
Puis : - Imprimante(Imprimable) : imprimer() retourne 'Impression en cours' - Scanner(Scannable) : scanner() retourne 'Scan en cours' - ImprimanteMultifonction(Imprimable, Scannable, Faxable) : implémente les trois
Exemple : Imprimante().imprimer() # 'Impression en cours' ImprimanteMultifonction().envoyer_fax() # 'MFP: Fax envoye'
Tests (3/4)
Imprimante
assert Imprimante().imprimer() == 'Impression en cours'
Scanner
assert Scanner().scanner() == 'Scan en cours'
Multifonction
m = ImprimanteMultifonction()
assert 'Impression' in m.imprimer()
assert 'Scan' in m.scanner()
assert 'Fax' in m.envoyer_fax()
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
from abc import ABC, abstractmethod
class Imprimable(ABC):
@abstractmethod
def imprimer(self):
pass
class Scannable(ABC):
@abstractmethod
def scanner(self):
pass
class Faxable(ABC):
@abstractmethod
def envoyer_fax(self):
pass
class Imprimante(Imprimable):
def imprimer(self):
return 'Impression en cours'
class Scanner(Scannable):
def scanner(self):
return 'Scan en cours'
class ImprimanteMultifonction(Imprimable, Scannable, Faxable):
def imprimer(self):
return 'MFP: Impression en cours'
def scanner(self):
return 'MFP: Scan en cours'
def envoyer_fax(self):
return 'MFP: Fax envoyé'