Quand utilisons-nous réellement la programmation orientée objet? [fermé]


35

J'écris un programme en Python, qui manipule essentiellement des chaînes, et je me demandais si je devais le faire en utilisant les principes de la programmation orientée objet ou non. Le client m'a dit qu'il ne se souciait pas du code, il voulait juste que la chose soit faite .

Je sais que le code orienté objet n'est pas, par définition, plus propre, et inversement, le code non-OO n'est pas, par définition, de mauvaise qualité. La question que je pose est peut-être plus ou moins basée sur l'opinion, mais il y a peut-être certaines règles que je ne connais pas.

Quelques informations supplémentaires sur ce qui doit être fait:

  • analyser un .csvfichier et traiter les données sur la base d'un fichier de configuration (les colonnes peuvent être différentes - comme le nombre de colonnes ou les données qu'elles contiennent)
  • utiliser les données traitées ci-dessus pour créer une nouvelle donnée formatée personnalisée (ou plusieurs fichiers en fonction de certaines des valeurs ci-dessus)
  • utilisez les dernières données formatées pour créer un fichier XML.
  • diviser le fichier XML en plusieurs fichiers en XMLfonction de leur contenu
  • l'application doit être basée sur CLI
  • il y a bien sûr d'autres choses telles que: la journalisation de certains événements, l'analyse d'arguments CLI, etc.

Maintenant, ce n’est pas du tout une application volumineuse / dure, et c’est aussi presque fini, mais pendant tout le processus de développement, je me demandais si cela devait être fait en utilisant ou non la POO.

Ma question serait donc la suivante: comment savez-vous / décidez-vous quand utiliser la POO dans une application?


12
Re: "Le client ... ne se soucie pas du code, il veut juste que la chose soit faite." OK, alors fais la chose. Mais quelle est la complexité de cette chose? Dans quelle mesure comprenez-vous vraiment les exigences? Quelle est la probabilité que le client vous demande un jour de changer la chose? Parfois , un hack rapide et sale est tout ce que vous avez besoin, mais plus le temps et l' énergie que vous allez investir dedans, plus il est probable que certaines approche structurée pour résoudre le problème (par exemple, la conception OO) vous sera bénéfique.
Salomon Slow

5
N'utilisez pas "EDIT" ou d'autres noms similaires dans vos messages. Chaque publication Stack Exchange a un historique détaillé que tout le monde peut consulter. Des informations telles que "Je n'ai pas demandé ce qu'était la POO" sont plus appropriées dans un commentaire de toute façon, pas votre question.
Robert Harvey

@ RobertHarvey ok, compris. Je ferai ça la prochaine fois.
Grajdeanu Alex.

Réponses:


60

Python est un langage multi-paradigme, ce qui signifie que vous pouvez choisir le paradigme le plus approprié à la tâche. Certaines langues comme Java sont à paradigme unique OO, ce qui signifie que vous aurez mal à la tête si vous essayez d’utiliser un autre paradigme. Les affiches disant "toujours utiliser OO" viennent probablement d'un contexte dans une telle langue. Mais heureusement vous avez le choix!

Je remarque que votre programme est une application CLI qui lit certaines entrées (fichiers csv et config) et génère des sorties (fichiers xml), mais n’est pas interactif et n’a donc pas d’interface utilisateur graphique ou d’API. Un tel programme s’exprime naturellement comme une fonction d’entrée en sortie, qui délègue à d’autres fonctions des sous-tâches.

D'autre part, OO concerne l'encapsulation de l'état mutable et est donc plus approprié pour les applications interactives, les interfaces utilisateur graphiques et les API exposant l'état mutable. Ce n'est pas un hasard si OO a été développé en parallèle avec les premières interfaces graphiques.

OO a un autre avantage en ce que le polymorphisme vous permet une architecture à couplage plus lâche, où différentes implémentations de la même interface peuvent être facilement substituées. Combiné à l'injection de dépendance, cela peut permettre le chargement de dépendances et d'autres éléments intéressants en fonction de la configuration. Ceci est surtout approprié pour les très grandes applications. Pour un programme de la taille de ce que vous décrivez, il en coûterait beaucoup trop de frais généraux sans bénéfice apparent.

Outre les fonctions qui lisent et écrivent les fichiers, le gros de votre logique peut être écrit sous forme de fonctions sans effets secondaires qui prennent une entrée et retournent une autre sortie. C'est éminemment facile à tester, beaucoup plus simple que de tester des unités OO où vous devez simuler des dépendances et autres.

Conclusion: je propose un ensemble de fonctions divisées en modules d'organisation, mais aucun objet.


8
Enfin une réponse bien équilibrée qui ne fait pas que chanter les louanges de la POO :-)
cmaster

1
C'est le genre de réponse que j'attendais. Pourrait élargir un peu votre réponse? Il a l'air génial jusqu'à présent.
Grajdeanu Alex.

3
@ Dex'ter: que toi. Quel type d'informations supplémentaires recherchez-vous?
JacquesB

3
J'ajouterais à cela que la programmation fonctionnelle pourrait être un paradigme à lire.
Andrew dit Réintégrer Monica

1
@ Bergi: Oui, c'est l'avantage d'un langage multi-paradigme. Vous pouvez utiliser des bibliothèques OO sans avoir à écrire votre propre programme dans un style OO.
JacquesB

15

Considérons un bouton sur une interface graphique. Il a l'état (c'est la taille, la couleur, la position, l'étiquette, etc.). Des choses peuvent lui arriver (c'est cliqué, il faut redessiner, etc.). Dans de telles situations, la modélisation en tant qu'objet a du sens. En tant qu'objet, il peut contenir son état, un ensemble d'actions pouvant être effectuées sur celui-ci (méthodes) et informer les autres parties de l'application que des événements lui ont été causés.

La POO est un excellent outil pour gérer les interfaces graphiques et autres situations dans lesquelles des parties du système ont un état volatile.

D'autres situations, telles que celle que vous décrivez, dans laquelle les données sont lues à partir d'une source, traitées et écrites dans une destination sont bien gérées par une approche différente: la programmation déclarative (ou fonction). Le code déclaratif pour le traitement des données tend à être à la fois plus facile à lire et plus court que les solutions POO.

Tout comme un marteau et une scie sont des outils puissants utilisés correctement, de même que les techniques de programmation orientée objet et déclaratives. Vous pourriez probablement enfoncer un clou dans un morceau de bois avec le manche d'une scie. De même, vous pouvez casser un morceau de bois en deux avec un marteau. De même, vous pouvez créer une interface graphique avec uniquement des fonctions et traiter des données avec des objets. Lorsque les outils sont utilisés correctement, les résultats sont plus nets et plus simples.

La règle générale que j'utilise est que, si j'ai beaucoup d'états ou si j'ai besoin d'une interaction de l'utilisateur, j'utilise des objets. sinon j'utilise (pur et d'ordre supérieur, si possible) des fonctions.


6

La programmation orientée objet ajoute quatre nouveaux outils à votre arsenal:

  1. Encapsulation
  2. Abstraction
  3. Héritage
  4. Polymorphisme

Vous utiliseriez la programmation orientée objet dans votre application lorsqu'elle est devenue suffisamment grande et complexe pour bénéficier de ces outils.


18
L'abstraction et le polymorphisme sont des outils fournis par de nombreuses "orientations" de programmation. La POO offre en fait une forme d'encapsulation plus faible que les autres approches, car l'héritage encourage les conceptions d'abstraction qui fuient. La seule chose que la programmation orientée objet ajoute réellement à la boîte à outils est l'héritage, ce qui est largement considéré comme une mauvaise chose.
David Arno

4
@DavidArno: En gros, vous dites "N'utilisez jamais de POO".
Robert Harvey

6
Cela découle d'une journée éprouvante au travail à examiner le code des autres peuples. Une mise en œuvre procédurale simple d'un programme est souvent préférable à une mise en œuvre avec une mauvaise compréhension de la conception de l'outil d'exploitation. L'architecture OO peut être très puissante, mais doit être utilisée comme une épice dans la cuisine, avec des connaissances expertes et juste ce qu'il faut. Abuser de la conception OO est à peu près aussi commun que de demander du ketchup dans un mauvais restaurant.
Phill

6
Aucun des quatre outils (encapsulation, abstraction, héritage, polymorphisme) n'est spécifique à la POO. Peut-être devriez-vous expliquer en quoi la POO est différente des autres paradigmes liés à ces dimensions.
Giorgio

4
@gardenhead, votre étrange impression de supériorité ne fait rien pour votre position. Peut-être devriez-vous poser une question intitulée «Pourquoi les langues les plus employables sont-elles souvent OO? Mieux encore, Ctrl + F et tapez «GUI».
Gusdor

1

Cette question me semble un peu confuse. Si vous écrivez en Python, vous utiliserez sûrement des objets. Lorsque vous ouvrez un fichier, il retourne un objet. Lorsque vous donnez un résultat, il retourne un objet itérateur. Chaque fonction que vous créez est un objet. Remettre en cause la valeur de OO dans les applications Python semble pour le moins étrange.

Sur la base des commentaires ici, oui, Python prend en charge les paradigmes fonctionnels, mais il est principalement basé sur les objets. Le langage lui-même et les bibliothèques intégrées sont orientés autour des objets. Oui, il prend en charge le lambda (tout comme Java et tout autre nombre de langues généralement décrites comme étant OO), mais il est volontairement simpliste par rapport à un vrai langage fonctionnel.

Peut-être que ces distinctions entre la conception OO et la conception fonctionnelle deviennent obsolètes. Si je crée prends une fonction polymorphe sur un objet conçu par OO et passe un pointeur sur cette fonction sur un objet en tant que paramètre pour une fonction de style fonctionnel *, s'agit-il de OO ou est-il fonctionnel? Je pense que ce sont les deux et aussi une approche très efficace pour résoudre les problèmes.

Je pense que la vraie question est «quand faut-il commencer à concevoir ses propres classes plutôt que de créer un module avec des fonctions? Je pense que la bonne réponse à cela est: quand cela aide à simplifier la solution. Je donnerais la même réponse de base pour n'importe quel langage orienté objet.

* la redondance est intentionnelle: je ne veux pas être accusé ici de supposer que les objets sont OO ou que les fonctions sont fonctionnelles.


5
Oui, les objets ne sont pas égaux à la POO. il y a une différence entre avoir un objet et structurer votre architecture autour des objets et de leurs interactions. un peu comme si tu fais une fonction qui ne veut pas dire que tu fais de la programmation fonctionnelle.
Sara

vous pouvez très facilement considérer un objet Python / JavaScript comme un enregistrement, ce qui est assez fonctionnel. Les langages fonctionnels ont des objets. La clé est dans le deuxième mot: orienté. Les langages POO sont complètement orientés sur l'utilisation d'objets, alors que d'autres langages les considèrent simplement comme une autre partie de votre boîte à outils.
Dan Pantry

0

L'un des principaux avantages de la programmation orientée objet est qu'au lieu de raisonner sur le déroulement d'un programme, vous commencez à raisonner sur un état.

Bien souvent, je vois l'objet, je vois les méthodes, mais ce que je vois aussi, c'est que le moteur du code est le flux plutôt que l'état.

Et une fois que vous vous interrogez sur l'état, il est facile de créer un bon code POO car dès que votre code devient trop complexe, vous remarquez que vous ne pouvez plus raisonner à propos de votre état et que vous savez qu'il est nécessaire de refactoriser.

Prenons votre exemple: vous souhaitez analyser un fichier csv. D'où vient-il: un fichier sur disque. Vous le chargez et le mettez en mémoire et analysez-le. Maintenant, votre client arrive: hé, je veux aussi analyser les fichiers du Web. Vous êtes donc content parce que vous avez créé une interface agréable pour le chargement de votre fichier et que vous ne devez créer que le code qui le récupère sur le Web et le reste de votre programme reste exactement le même.

Et la bonne chose est: vous pouvez tester pour cela.


3
Votre exemple avec la lecture d’un fichier à partir d’un disque ou la lecture d’un fichier sur le Web peut également être mis en œuvre avec différentes fonctions. Vous n'avez pas besoin de OO pour cela.
JacquesB

0

En termes simples:

  • Vous pouvez utiliser OOP ou non-OOP dans tout type de projet que vous souhaitez.
  • La POO n'est pas la panacée, mais elle aide à gérer la complexité.
  • Cela va au-delà de la modularité, il s'agit de compartimenter. Pensez aux différents compartiments dont dispose un navire pour conserver sa flottabilité si la coque est endommagée.
  • La POO est un moyen de gérer les dépendances, il est donc plus facile de localiser les bogues puisqu'il n'existe qu'un ensemble défini de moyens permettant aux différents composants d'un programme de communiquer.
  • Dans un programme, beaucoup de choses fonctionnent: variables, constantes, méthodes, fichiers, paramètres, fonctions, modules, etc. Ils peuvent interagir les uns avec les autres d'une manière parfois imprévisible. La POO est un ensemble de principes qui réduisent le nombre de façons dont les choses peuvent interagir les unes avec les autres. Vous n'êtes pas obligé d'utiliser la POO pour le faire, mais cela aide.

Cela dit, il y a d'autres facteurs à prendre en compte:

  • Vos programmeurs sont-ils compétents en POO / OOD?
  • Vos programmeurs maîtrisent-ils un langage POO?
  • Pensez-vous que le logiciel va devenir complexe avec le temps?
  • Envisagez-vous de redimensionner ou de réutiliser le code à l'avenir?
  • Pensez-vous que votre "design" peut devenir un atout? Par exemple, pourrez-vous en tirer parti pour croître ou comme base pour des projets futurs?

Ne vous méprenez pas: vous pouvez réaliser tout cela sans utiliser la POO, mais avec la POO, ce sera plus facile.

Mais...

Si votre équipe n'est pas compétente en POO / OOD et n'a aucune expertise dans ce domaine, utilisez les ressources que vous avez.


-2

Ma question serait donc la suivante: comment savez-vous / décidez-vous quand utiliser la POO dans une application?

Toujours l'utiliser. Une fois que vous en aurez l'habitude, vous l'utiliserez pour tout. C'est un excellent moyen de garantir une bonne abstraction entre les capacités et leur utilisation, ce qui constitue un avantage important pour la maintenance. Nous l'utilisons, par exemple, pour

  • Les petits objets de structure de données, car ils sont souvent polymorphes, par exemple, et la structure de données intermédiaire après l'analyse syntaxique comporte souvent plusieurs petites entités, qui ont un comportement commun mais sont également spécialisées. C’est un excellent cas d’utilisation pour une classe ou une interface de base commune, avec des implémentations et des comportements spécialisés, c’est-à-dire une hiérarchie de classes (polymorphisme).

  • l'enregistrement, par exemple, car il est facile de remplacer un autre enregistreur

  • éléments volumineux de la structure du programme, parce que vous créez plusieurs concurrents, et peut-être tirer parti des processeurs multi-cpu. Par exemple, un serveur Web peut facilement utiliser plusieurs gestionnaires de demandes simultanés, en raison d'objets.

Comme je le disais plus tôt, cela facilite la refactorisation et la réutilisation, ce qui favorise une bonne abstraction, ce qui facilite la maintenance. La POO devrait être adoptée et utilisée tout le temps. Une bonne programmation POO évite les méthodes statiques et / ou les données statiques et utilise des objets pour tout.


6
Je n'ai pas eu de vote négatif (même si j'en étais proche), mais je pense que c'est la raison des votes négatifs que vous avez eu: "Utilisez toujours ceci, car c'est génial" est rarement un bon conseil. Il y a toujours des exceptions. Aucun outil ne vient sans inconvénients, et la programmation orientée objet ne fait pas exception. Dites aux gens que c'est bon, dites aux gens en quoi cela est bon, dites aux gens pourquoi c'est bon, dites aux gens d'éviter les alternatives s'ils le peuvent, mais ne dites jamais aux gens de ne pas penser aux alternatives.
cmaster

@ cmaster, ça va si les gens votent, c'est leur choix, et je l'ai fait aussi. Sur le sujet, je pense toujours que c'est la bonne réponse pour la personne qui pose la question; À mon humble avis, le PO doit intervenir jusqu'au bout et utiliser la POO, au lieu d'essayer de décider quand utiliser la POO et, à l'occasion, de choisir de créer un cours, sans avoir à écrire de code de procédure.
Erik Eidt

2
@ cmaster Je peux apprécier le conseil d'Erik. Aussi souvent que le type de réponse «ça dépend» peut constituer la solution politiquement correcte, voyons les choses en face, OO est devenu pratiquement la base de référence pour les environnements de programmation qui la prennent en charge. Donc, ne nous leurrons pas, vous pouvez difficilement vous tromper avec OO. Le script décrit est, bien que linéaire, assez complexe pour que les objets vous apportent certains avantages.
Martin Maat

2
@ErikEidt "le PO doit sauter à fond et utiliser la POO" Vous pouvez le paraphraser ainsi: "Le PO doit cesser de penser au meilleur moyen de résoudre le problème du client et simplement suivre le cheminement unique vers l'illumination." Malheureusement, j'ai dû faire face à beaucoup de soi-disant professionnels de l' informatique qui font suivre cette méthodologie de conception de logiciels. Dilbert obligatoire: dilbert.com/strip/1996-02-27
alephzero

1
Aussi facile que cela puisse être évacué comme "encore un autre fanatique insensé de la POO", je pense qu'il y a quelque chose à dire pour aller à 100% dans quelque chose qui l'intériorise et l'absorbe vraiment. non pas pour que vous puissiez l’utiliser tous les jours pendant le reste de votre vie, mais pour EN APPRENDRE réellement les forces et les faiblesses et ne vous contentez pas de lire à leur sujet. Je recommanderais à peu près tout le monde de passer quelques mois à la programmation OOP hardcore, à la FP inconditionnelle (quelques mois) et à quelques mois de procédure C, etc. Il suffit d'entrer et de se salir avec.
Sara

-2

La programmation orientée objet fournit des outils pour créer un cadre. Ces outils sont l’encapsulation, l’abstraction, l’héritage et le polymorphisme. Ces idées vous aideront à diviser votre programme en deux parties.

How to - C’est la partie travail du cadre de votre code, dans laquelle vous créez une sorte d’abstraction, décidez du fonctionnement de vos blocs en général et de la manière dont il interagit avec d’autres blocs.

Quoi faire - Cette partie est l'endroit où les blocs effectuent le travail proprement dit. Ici, les classes sont dérivées des classes de base créées dans la section "Comment procéder".

On peut grandement bénéficier de OOPS

  1. si vous pouvez réutiliser un cadre existant et que vous n’avez qu’à implémenter des détails spécifiques dans la section "que faire".
  2. La fonctionnalité mise en œuvre pour le projet actuel est générique / couramment utilisée. D'autres projets / projets futurs peuvent tirer parti du cadre créé pendant le développement du projet en cours.
  3. Décomposer des projets énormes en modèles connus pour résoudre un gros problème.
  4. Utilisez OOPS, même pour un petit projet, pour prendre l'habitude de l'utiliser et soyez prêt lorsque 1 à 3 types de problèmes surviennent

Vous dites donc que vous devriez toujours utiliser la programmation orientée objet, quelle que soit la tâche à résoudre?
JacquesB

Non :), il existe de nombreux padigrammes de programmes et certains se prêtent mieux à la résolution d'un problème particulier que d'autres. OOPS n'est certes pas la meilleure solution pour tous, mais OOPS est assez populaire. Il faudra du temps et de la pratique pour créer de bonnes classes et structures dans OOPS. Par conséquent, si vous souhaitez utiliser OOPS efficacement, commencez mieux avec des projets plus petits. Une fois que vous le maîtrisez, c'est entièrement à vous. Je considère les concepts OOPS comme un outil permettant principalement de créer un cadre.
Rahul Menon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.