Les classes sont le pilier de la programmation orientée objet . La POO est très concernée par l'organisation du code, la réutilisabilité et l'encapsulation.
Tout d'abord, une clause de non-responsabilité: la POO est en partie en contraste avec la programmation fonctionnelle , qui est un paradigme différent beaucoup utilisé en Python. Tous ceux qui programment en Python (ou sûrement la plupart des langages) n'utilisent pas la POO. Vous pouvez faire beaucoup de choses dans Java 8 qui ne sont pas très orientées objet. Si vous ne voulez pas utiliser la POO, alors ne le faites pas. Si vous n'écrivez que des scripts uniques pour traiter des données que vous n'utiliserez plus jamais, continuez à écrire comme vous êtes.
Cependant, il existe de nombreuses raisons d'utiliser la POO.
Certaines raisons:
Organisation: la POO définit des moyens bien connus et standard de décrire et de définir à la fois les données et la procédure dans le code. Les données et la procédure peuvent être stockées à différents niveaux de définition (dans différentes classes), et il existe des manières standard de parler de ces définitions. Autrement dit, si vous utilisez la POO de manière standard, cela vous aidera plus tard, ainsi que les autres, à comprendre, modifier et utiliser votre code. De plus, au lieu d'utiliser un mécanisme de stockage de données complexe et arbitraire (dictés de dictés ou listes ou dictionnaires ou listes de dictés d'ensembles, ou autre), vous pouvez nommer des éléments de structures de données et s'y référer facilement.
État: la POO vous aide à définir et à suivre l'état. Par exemple, dans un exemple classique, si vous créez un programme qui traite des étudiants (par exemple, un programme de qualité), vous pouvez conserver toutes les informations dont vous avez besoin à leur sujet au même endroit (nom, âge, sexe, niveau scolaire, cours, notes, enseignants, pairs, régime alimentaire, besoins spéciaux, etc.), et ces données sont conservées tant que l'objet est vivant et est facilement accessible.
Encapsulation : Avec l'encapsulation, la procédure et les données sont stockées ensemble. Les méthodes (un terme POO pour les fonctions) sont définies juste à côté des données sur lesquelles elles opèrent et produisent. Dans un langage comme Java qui permet le contrôle d'accès , ou en Python, selon la façon dont vous décrivez votre API publique, cela signifie que les méthodes et les données peuvent être cachées à l'utilisateur. Cela signifie que si vous avez besoin ou souhaitez modifier le code, vous pouvez faire ce que vous voulez pour l'implémentation du code, mais gardez les API publiques identiques.
Héritage : l'héritage vous permet de définir les données et la procédure en un seul endroit (dans une classe), puis de remplacer ou d'étendre cette fonctionnalité ultérieurement. Par exemple, en Python, je vois souvent des gens créer des sous-classes dudict
classe afin d'ajouter des fonctionnalités supplémentaires. Un changement courant remplace la méthode qui lève une exception lorsqu'une clé est demandée à un dictionnaire qui n'existe pas pour donner une valeur par défaut basée sur une clé inconnue. Cela vous permet d'étendre votre propre code maintenant ou plus tard, d'autoriser d'autres personnes à étendre votre code et d'étendre le code d'autres personnes.
Réutilisabilité: toutes ces raisons et d'autres permettent une plus grande réutilisabilité du code. Le code orienté objet vous permet d'écrire du code solide (testé) une fois, puis de le réutiliser encore et encore. Si vous avez besoin de modifier quelque chose pour votre cas d'utilisation spécifique, vous pouvez hériter d'une classe existante et écraser le comportement existant. Si vous avez besoin de changer quelque chose, vous pouvez tout changer tout en conservant les signatures de méthode publique existantes, et personne n'est le plus sage (espérons-le).
Encore une fois, il y a plusieurs raisons de ne pas utiliser la POO, et vous n'en avez pas besoin. Mais heureusement avec un langage comme Python, vous pouvez en utiliser un peu ou beaucoup, c'est à vous de décider.
Un exemple de cas d'utilisation étudiant (aucune garantie sur la qualité du code, juste un exemple):
Orienté objet
class Student(object):
def __init__(self, name, age, gender, level, grades=None):
self.name = name
self.age = age
self.gender = gender
self.level = level
self.grades = grades or {}
def setGrade(self, course, grade):
self.grades[course] = grade
def getGrade(self, course):
return self.grades[course]
def getGPA(self):
return sum(self.grades.values())/len(self.grades)
# Define some students
john = Student("John", 12, "male", 6, {"math":3.3})
jane = Student("Jane", 12, "female", 6, {"math":3.5})
# Now we can get to the grades easily
print(john.getGPA())
print(jane.getGPA())
Dict standard
def calculateGPA(gradeDict):
return sum(gradeDict.values())/len(gradeDict)
students = {}
# We can set the keys to variables so we might minimize typos
name, age, gender, level, grades = "name", "age", "gender", "level", "grades"
john, jane = "john", "jane"
math = "math"
students[john] = {}
students[john][age] = 12
students[john][gender] = "male"
students[john][level] = 6
students[john][grades] = {math:3.3}
students[jane] = {}
students[jane][age] = 12
students[jane][gender] = "female"
students[jane][level] = 6
students[jane][grades] = {math:3.5}
# At this point, we need to remember who the students are and where the grades are stored. Not a huge deal, but avoided by OOP.
print(calculateGPA(students[john][grades]))
print(calculateGPA(students[jane][grades]))