Article rédigé par Mohamed Zebli, élèves de la 5e promotion Fullstack – la 4e à temps complet.

On peut souvent entendre dire qu’un langage de programmation orienté object Python apporte de grands avantages de la modularité, l’abstraction, la productivité et ré-utilisabilité, la sûreté… Python en est lui même un, d’ailleurs une des raisons pour lesquelles il est aussi populaire. Mais qu’est-ce que la Programmation Orientée Objet (POO) ? Pourquoi est-elle si utile ?

VOUS AVEZ DIT POO ?

La programmation orientée objet (POO) est un paradigme au sein de la programmation informatique. Il s’agit d’une représentation des choses, un modèle cohérent – partagé à travers différents langages qui permettent son usage (Python, Java, C++).

Le but de la POO consiste à définir et faire intéragir entre eux des objets, compris ici comme tous types de structures issues d’un langage donné. Toutefois, par convenance, les objets désignent le plus souvent des variables complexes, elles-mêmes composées de variables ou de fonctions.

UN PEU D’HISTOIRE

Le paradigme de programmation qu’est la POO a été défini par les norvégiens Ole-Johan Dahl et Kristen Nygaard au début de la décennie 1960. Plus tard, leurs travaux furent repris et amendés dans les années 1970 par l’américain Alan Kay. C’est ainsi que les principes de la POO sont posés et seront précisés par la suite. Principes que voici.

LES PRINCIPES DE LA POO

Nous revenons sur ces principes par des exemples, juste en dessous !

  • Encapsulation : il s’agit de regrouper des données avec un ensemble de routines visant à les lire ou les manipuler. Chaque classe  définit des méthodes ou propriétés afin d’interagir avec les données. C’est à partir de la classe que seront créés les différents objets. Quand un des objets de la classe sera intégré dans le programme, on parlera de cet objet en tant qu’instance de la classe : l’objet est créé avec les propriétés de sa classe.
  • Abstraction : elle consiste à masquer à l’utilisateur les détails inutiles. Ce dernier peu ainsi implémenter sa propre logique davantage complexe sans pour autant avoir à prendre en compte la complexité cachée et sous-jacente.
  • Héritage : cela signifie qu’une classe B hérite de la classe A. Autrement dit, la classe B hérite des attributs et méthodes de la classe A. On peut alors appeler Les méthodes contenues dans la classe A par la classe B dès lors qu’une instance de la classe B est créée. Cela fait énormément gagner en temps.
  • Polymorphisme : il permet au développeur d’utiliser une méthode ou un attribut selon plusieurs manières, en fonction de son besoin. Une même méthode peut, par exemple, être utilisée sur des entités différentes. La méthode du même nom produira des effets différents selon son contexte d’utilisation.

PROGRAMMATION PROCÉDURAL vs POO

Avant que la POO ne soit employée, la programmation informatique se faisait au moyen de la programmation procédurale. La résolution d’un problème se faisait par une analyse descendante qui décomposait le problème en sous-problèmes jusqu’à que des actions très simples soient identifiées. Ainsi, le programme est décomposé en procédures qui interagissent entre elles afin de résoudre le problème.

Si la programmation procédurale est intuitive lorsqu’il s’agit d’apprendre la programmation, cette méthode pose un certain nombre d’inconvénients à terme. Le premier est que la plus petite modification de la structure des données du programme appelle à une modification de toutes les procédures qui interagissent avec ces données. De plus, développer un très grand programme en procédural peut s’avérer long et fastidieux.

Si la POO ne permet pas fondamentalement de faire plus de choses que la programmation procédurale, elle permet toutefois de mieux organiser son code. Elle facilite aussi le travail coopératif et la maintenance à long terme.

POURQUOI EST-CE SI UTILE EN DATA SCIENCE ?

La POO a permis, sans grand doute, de démocratiser l’accès à la Data science auprès d’un nombre non négligeable de personnes. En effet, les librairies permettent d’utiliser des méthodes et fonctions définies par d’autres.

La librairie contient des modules, qui eux-mêmes contiennent des classes. Au sein de ces classes, des méthodes sont ainsi programmées. C’est ainsi que se manifeste l’encapsulation.

Le Data scientist qui importe une librairie a directement accès à toutes les fonctions, parfois complexes, sans pour autant avoir besoin de coder lui-même leur fonctionnement intrinsèque. Grâce à l’abstraction, il peut implémenter les méthodes prédéfinies sans avoir besoin de comprendre la manière dont elles ont été construites.

Grâce au polymorphisme, il est possible d’appliquer une même méthode à des données et des contextes très différents.

Par exemple, la librairie Seaborn propose d’implémenter – sur un jeu de données – différentes représentations graphiques. Le Data scientist n’a nul besoin de connaître le code détaillé contenu dans les classes de la librairie. Seules les méthodes et la logique de leur fonctionnement lui sont utiles afin d’arriver à ses fins. Il peut ainsi obtenir une représentation graphique sur deux jeux de données différents, simplement en appliquant la méthode voulue.

C’est ainsi que diverses librairies rencontrent un certain succès et simplifient grandement un certain nombre de tâches : Numpy pour la manipulation de matrices et de tableaux multidimensionnels, Pandas pour l’analyse de données, ou encore Scikitlearn pour l’implémentation d’algorithmes d’apprentissage automatique.

Enfin, les grandes entreprises technologiques développent – à un très grand niveau d’expertise technique – leurs propres librairies, classes et méthodes. A la manière d’un secret industriel, elles garantissent à ladite entreprise de disposer par exemple de ses propres outils d’apprentissage automatique (pour la reconnaissance faciale chez Facebook, pour la recommandation de contenus chez Youtube/Google, etc.). Cela, afin de notamment disposer d’un avantage concurrentiel permis par la performance des outils et des efforts de R&D (recherche et développement) ainsi consentis.