Exercices récapitulatifs
La lecture de multimédia
Vous travaillez sur une application de lecteur multimédia qui peut lire différents types de médias, notamment des fichiers audio et vidéo. Actuellement, votre lecteur multimédia, représenté par la classe MediaPlayer
, possède des méthodes distinctes pour lire l’audio (playAudio()) et la vidéo (playVideo()). Ces méthodes font appel à deux classes différentes : AudioPlayer et VideoPlayer. Au fur et à mesure que votre application évolue, vous réalisez que d’autres types de médias pourraient être ajoutés à l’avenir, comme des livres audio ou des podcasts.
Tâche : Votre tâche est de refactoriser votre code pour qu’il soit prêt à gérer ces éventuelles extensions, tout en restant fonctionnel pour les types de médias existants. Vous devrez peut-être introduire de nouvelles interfaces ou classes abstraites, et modifier la manière dont MediaPlayer interagit avec les autres classes.
Note : Il peut sembler logique d’ajouter simplement de nouvelles méthodes à la classe MediaPlayer pour chaque nouveau type de média. Cela pourrait ressembler à quelque chose comme playAudiobook() ou playPodcast(). Cela pourrait être une solution rapide, mais cela rendrait la classe MediaPlayer plus difficile à gérer à long terme. Pensez à une solution plus maintenable et plus flexible. Utilisez les principes de la programmation orientée objet pour réduire le couplage entre les classes et favoriser la réutilisation du code.
from abc import ABC, abstractmethod class MediaPlayerInterface(ABC): @abstractmethod def play(self): pass class MediaPlayer(MediaPlayerInterface): def play(self): print("Playing media") class AudioPlayer(MediaPlayer): def play(self): print("Playing audio") class VideoPlayer(MediaPlayer): def play(self): print("Playing video")
Les restaurants
Vous concevez un logiciel pour une chaîne de restaurants internationale. Le logiciel doit être capable de gérer différents types de cuisines, telles que la cuisine italienne, la cuisine française, la cuisine mexicaine, etc.
Chaque type de cuisine est préparée par un type spécifique de cuisinier : un chef italien pour la cuisine italienne, un chef français pour la cuisine française, et ainsi de suite. Chaque chef a sa propre méthode de cuisson. Par exemple, le chef italien a une méthode cuisinerPlatItalien(), le chef français a une méthode cuisinerPlatFrancais(), et ainsi de suite.
Le logiciel doit être capable de gérer n’importe quel type de cuisine, en fonction du restaurant spécifique de la chaîne. Entre autres, si un utilisateur du logiciel gère un restaurant italien, le logiciel devrait faire appel au chef italien pour préparer les plats.
Tâche: vous devez concevoir les classes et interfaces nécessaires pour ce logiciel. Pensez à la façon dont vous pourriez organiser le code pour rendre le logiciel aussi flexible que possible. N’oubliez pas que la chaîne de restaurants pourrait décider d’introduire de nouveaux types de cuisine à l’avenir, donc votre design devrait facilement accueillir ces changements.
from abc import ABC, abstractmethod class Chef(ABC): @abstractmethod def cookDish(self): pass class ItalianChef(Chef): def cookDish(self): print("Cooking Italian dish") class FrenchChef(Chef): def cookDish(self): print("Cooking French dish") class Restaurant(ABC): def __init__(self): self.chef = self.getChef() def createDish(): self.chef.cookDish() @abstractmethod def getChef(self): pass class ItalianRestaurant(Restaurant): def getChef(self): return ItalianChef() class FrenchRestaurant(Restaurant): def getChef(self): return FrenchChef()
L’autopilote
Vous devez concevoir un système d’autopilote pour une entreprise de haute technologie, capable de gérer différents types de véhicules. Initialement, le système doit pouvoir gérer une voiture et un avion. Cependant, il a été conçu pour être extensible et devrait donc permettre l’ajout de nouveaux types de véhicules à l’avenir (par exemple, des bateaux, des drones, etc.) sans nécessiter de modifications majeures dans le code existant.
Tâche: Votre tâche consiste à écrire le code pour ce système pour limiter au maximum le couplage entre la classe de l’autopilote et les classes de véhicules spécifiques (Voiture, Avion, etc.). Pour ce se faire, développez un système d’autopilote qui peut interagir avec ces véhicules de manière générique, sans connaître leur type spécifique. Assurez-vous que l’ajout de nouveaux types de véhicules au système ne nécessite pas de modifications dans l’autopilote.