C’est la manière la plus naturelle d’imaginer un algorithme. Les séquences d’instructions s’exécutent les unes après les autres. On peut utiliser des affectations, des structures alternatives (if) et des structures répétitives (boucles). Il utilisé pour débuter dans la programmation.
Définition
Les différents paradigmes de programmation
Programmation impérative
Programmation fonctionnelle
Pour que ce soit purement du paradigme fonctionnel, il faut que tout le programme soit écrit avec des fonctions, en particulier ce paradigme interdit l’utilisation des affectations. On l'utilise dans le cadre d'une récursivité (c’est à dire une fonction qui s’appelle elle même)
Programmation orientée objet
La programmation orientée objet (POO) repose sur l’idée de créer des “moules” appelés classes permettant de créer des objets ayant des caractéristiques en commun.
Ex: classe véhicule, objets : voiture, avion, …, méthodes : actionner, modifier
C’est un paradigme qui peut se suffire à lui-même mais il est souvent imbriqué avec le paradigme impératif.
Zoom sur la programmation orientée objet
Classes et objets
Dans la POO, une classe (un "moule") est une structure qui permet de créer des objets informatiques/instanciations de la classe (qui modélisent des objets du monde réel). Elle définit les attributs et les méthodes que ses objets peuvent posséder.
- Attributs: les propriétés, les caractéristiques de l'objet
- Méthodes : les fonctions, actions, comportements que l'objet aura ou pourra effectuer.
Un objet est une instance spécifique d'une classe, et plusieurs objets peuvent être créés à partir de la même classe avec des valeurs différentes pour leurs attributs.
Création d'une classe
- Nom: commence par une majuscule par convention
- Méthode constructeur: définir les attributs associés à la classe
- Self: désigne l’objet auquel s’appliquera la méthode
Ex:
class Carte: # définition de la classe
def __init__(self, val, fam): # il s'agit de la méthode constructeur
self.valeur = val # création du premier attribut
self.famille = fam # création du deuxième attribut
- Créer un objet:
c1 = Carte("9", "Pique") # création d'un objet de la classe Carte nommé c1
print(c1) # permet d'obtenir l'adresse mémoire de l'objet c1
print(c1.valeur) # on accède à la valeur des attribut par: nom_objet.nom_attribut (opérateur d'accessibilité)
print(c1.famille)
Encapsulation
- Accesseurs: On utilise rarement l’opérateur d’accessibilité pour accéder aux attributs d'un objet. On utilisera donc plutôt des méthodes. C’est le principe de l’encapsulation. Pour obtenir la valeur d’un attribut, on utilisera une méthode des accesseurs (ou “getters”). -> getNom_attribut()
- Mutateur: Pour modifier la valeur d’un attribut, on utilisera une méthode des mutateurs (ou “setters”). -> setNom_attribut()

Agrégation
Comment combiner les classes? C’est la notion d’agrégation. Bien souvent un objet est lui même constitué de composants. Par exemple un jeu de cartes est constitué de cartes. On dit que le jeu de cartes est un objet agrégat et qu’une carte est un objet composant.


Concepts associés à la POO
- Encapsulation: Regrouper les attributs et méthodes d'un objet pour cacher son fonctionnement interne en ne proposant à l'utilisateur qu'un accès restreint et contrôlé (sous forme d'une interface via les accesseurs et les mutateurs). L'encapsulation permet donc de garantir l'intégrité des données contenues dans l'objet.
- Héritage: Permet de créer un objet à partir d'un autre objet. Ce nouvel objet va hériter des attributs et des méthodes de l'objet "père" ou "ancêtre", on pourra même modifier et ajouter d'autres propriétés au nouvel objet. Par ce moyen on peut décrire toute une hiérarchie d'objets de plus en plus spécialisé.
- Polymorphisme: Le polymorphisme est la capacité d'utiliser des objets de différentes classes par l'intermédiaire d'une même interface. Cela signifie qu'une seule méthode peut fonctionner de manière polymorphique pour traiter des objets de classes dérivées différentes. Ex: jeu d'échec où les pièces ont des façons différentes de se déplacer.