Pour quels problèmes la programmation orientée objet n'est-elle pas un bon choix? [fermé]


19

Un peu inspiré par cette question: pour quels problèmes courants la programmation fonctionnelle ne convient-elle pas? - mais néanmoins une question que j'ai toujours voulu, mais que j'avais trop peur de poser.

J'ai été dans ... eh bien, appelons cela le développement de logiciels d'ingénierie pratiquement toute ma vie, et pendant tout ce temps, bien que OO ait toujours été là (enfin, la plupart du temps), je n'ai jamais eu besoin d'utiliser "ses voies", ni d'apprendre ce paradigme. Nous avons toujours utilisé des structures de programme, des routines / fonctions / modules plutôt simples et bien que cela soit contraire aux meilleures pratiques d'aujourd'hui, la gestion de ces programmes (programmes jusqu'à environ 300k LOC, rien de trop gros) n'a jamais été difficile, encore moins impossible.

Je voulais donc vous demander, quels seraient les problèmes de sorta pour lesquels le paradigme orienté objet ne serait pas un bon choix? Par rapport à la programmation procédurale?


Réponses:


8

La programmation orientée objet est une programmation procédurale. Ce qui rend OO orienté objet est, comme le mentionne Robert Harvey dans un commentaire, que OO résume les données d'une manière particulière (à savoir: regrouper les fonctions qui opèrent sur une structure avec cette structure).

William Cook explique bien la différence entre les objets et les types de données abstraits.

Donc, au risque de paraître facile, je dirais que les objets ne conviennent pas lorsque vous devez étendre facilement le (nombre) d'opérations qui s'exécutent sur vos données, et vous n'avez pas besoin d'avoir différentes implémentations de votre Les données. Cela dit, il y a des choses que vous pouvez faire pour rapprocher les deux.


5

La principale valeur d'OO est qu'elle permet le découplage entre les composants de votre système, ce qui facilite l'écriture de code DRY et l'adaptation aux types de changements spécifiques que vous prévoyez dans votre conception. Le coût est qu'il ajoute des couches d'indirection, ce qui peut rendre le code plus difficile à raisonner, moins efficace et plus difficile à modifier de manière imprévue (les manières qui ne sont pas facilitées par le découplage fourni par votre conception). C'est donc une perte de temps pour tout sous-problème où vous n'avez pas besoin du découplage qu'il propose. Plus précisément, c'est une perte de temps si vous pouvez facilement écrire du code DRY sans lui et ne prévoyez pas de changements d'exigences spécifiques qui bénéficieraient du fort découplage qu'OO fournit.


3
Le découplage est un bon effet secondaire de la programmation OO bien fait, mais je dirais que le principal avantage de la programmation OO est l'encapsulation organisationnelle des fonctionnalités.
Robert Harvey

1
@Robert Harvey: J'ai un point de vue différent sur la même réalité: pour moi, l'encapsulation organisationnelle des fonctionnalités est le moyen d'obtenir le découplage qui à son tour permet la réutilisation.
mouviciel

@Robert Harvey: Le couplage et la cohésion sont deux façons de voir essentiellement la même chose, qui est une sorte de localité où vous pouvez comprendre quelque chose sans avoir besoin de trop en comprendre.
David Thornley

Je pense qu'une partie du désaccord est que, à mon humble avis, l'utilisation d'OO signifie que vous utilisez largement le polymorphisme et l'héritage, au moins des interfaces. Par ma définition d'OO, par exemple, des structures C # ou D, ou en utilisant uniquement des classes finales / scellées et aucune interface ne serait considérée comme du sucre syntaxique plus quelques attributs de contrôle d'accès, pas de vrais OO.
dsimcha

3

concurrence: le mécanisme de verrouillage semble assez problématique; seuls de très bons développeurs sont mis à contribution sur la partie threading des projets

extension: ne sais pas à quel point les langues OO actuelles sont extensibles. sachez que Java est mauvais. à cet effet, les DSL (langages spécifiques au domaine) doivent être implémentés en tant que cadres. Clojure d'autre part (c'est fonctionnel), a des macros.


+1 pour l'argument de verrouillage - la preuve semble être que la logique de verrouillage sur les objets mutables devient d'une complexité ingérable au-delà d'un certain point dans les langages OO
mikera

+1 pour avoir mentionné la simultanéité. Un concept similaire aux objets mais prenant en charge la concurrence simultanée est celui d'un acteur. Les acteurs sont des entités simultanées qui communiquent en échangeant des messages asynchrones.
Giorgio

Idem sur la simultanéité; J'ai fait la déclaration que OO, en vous encourageant à identifier / maintenir des unités d' état discrètes , encourage en fait les problèmes de concurrence.
user1172763

0

La plupart des programmeurs, avertis ou non, utilisent des concepts comme l'abstraction, la dissimulation d'informations et les interfaces dans leur code. Les langages OO facilitent simplement cela car ces concepts sont déjà intégrés. Vous n'avez pas à les inventer vous-même.

Un algorithme de base comme qsort()utilise des abstractions pour comparer des objets arbitraires. fread()utilise une interface pour résumer les détails du flux, etc.

De ce point de vue, j'ai du mal à trouver un problème particulier qui serait mieux résolu avec une approche non OO.


0

Je pense que lorsque vous créez des systèmes qui combinent d'autres systèmes via des API Web (repos, xmlprc, plain curl / wget), vous pouvez écrire des wrappers OO mais c'est clairement juste une commodité. Si le service Web à utiliser est simple et qu'il ne s'agit que d'une ou deux lignes, alors OO est trop. Si d'un autre côté vous finissez par avoir à emballer une API web complexe (comme Amazon AWS par exemple), alors c'est bien d'avoir une bibliothèque d'encapsuleur (comme boto en python pour AWS).

Pensées?


0

Les langages orientés objet PURE ne conviennent pas dans de nombreux cas. Parce qu'il y a certains critères à remplir pour être un langage orienté objet pur. Voir-
/programming/250062/what-is-meant-by-the-term-true-object-orientation/250098#250098

Mais les langages de programmation les plus utilisés sont multi-paradigmes. Ils intègrent de nombreuses fonctionnalités non OO pour rencontrer différents types de problèmes de programmation et de développement. C ++, C #, Java ou Ruby ont tous des fonctionnalités non OO. Ainsi, ils peuvent faire face à des problèmes que pure-OO n'est pas bon.


0

La programmation orientée objet peut être utilisée pour modéliser votre domaine. Les classes peuvent être utilisées pour représenter l'état et le comportement des entités, agrégats, collaborations, services au sein de votre modèle de domaine. De plus, les invocations de méthodes et les protocoles entre les objets peuvent modéliser les relations dynamiques entre les entités.

J'ai trouvé que c'était un moyen utile de produire un modèle DRY qui peut représenter proprement les règles et le comportement de votre application d'une manière qui est découplée des problèmes techniques (tels que l'utilisation d'une base de données ou d'une file d'attente de messages, ou le c'est une application web). Un bon livre sur le sujet est Domain Driven Design

Une chose importante à noter ici, c'est que les «entités» que j'ai mentionnées ci-dessus n'ont pas à se mapper sur des objets du monde réel! Ils peuvent représenter des parties abstraites du domaine de votre application.

Donc, si c'est ce à quoi la programmation orientée objet est bonne; ce qui n'est pas bon? Eh bien, tout ce dont le modèle de domaine ne peut pas être exprimé correctement en tant qu'objets. Par exemple, certains programmes mathématiques, (statistiques, logiques, etc.) ou techniques (par exemple un compilateur) sont mieux exprimables dans différents styles. J'ai constaté que pour les applications de flux de travail d'entreprise, une combinaison de techniques OO et DSL personnalisées était très efficace pour nous permettre de modéliser les types de relations et d'événements qui se produisent dans le processus métier. Pour la vérification de programme et la vérification de preuve automatisée, une approche fonctionnelle est souvent utilisée, car ses fonctions pures permettent un raisonnement mathématique plus direct.

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.