244 votes

POO vs programmation fonctionnelle vs programmation procédurale

Quelles sont les différences entre ces paradigmes de programmation, et sont-ils mieux adaptés à des problèmes particuliers ou certains cas d'utilisation en favorisent-ils un par rapport aux autres ?

Exemples d'architecture appréciés !

0 votes

Ce n'est pas une réponse complète, mais j'ai écrit un peu sur la façon dont le style "fonctionnel" affecte/contraste le style "OO" (dans le contexte de F#) ici : lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!511.entry

0 votes

Vous pourriez envisager de lire ça ! Il y a beaucoup d'exemples pour savoir quand utiliser quelle fourmi, quelles sont les principales différences, les avantages et les inconvénients, etc.

138voto

greyfade Points 14358

Elles sont toutes bonnes à leur manière - Ce sont simplement des approches différentes des mêmes problèmes.

Dans un style purement procédural, les données ont tendance à être fortement découplées des fonctions qui les exploitent.

Dans un style orienté objet, les données ont tendance à porter en elles une collection de fonctions.

Dans un style fonctionnel, les données et les fonctions ont tendance à avoir plus en commun les unes avec les autres (comme dans Lisp et Scheme) tout en offrant plus de flexibilité en termes d'utilisation des fonctions. Les algorithmes tendent également à être définis en termes de récursion et de composition plutôt que de boucles et d'itération.

Bien entendu, la langue elle-même n'influe que sur le style à privilégier. Même dans un langage purement fonctionnel comme Haskell, vous pouvez écrire dans un style procédural (bien que cela soit fortement déconseillé), et même dans un langage procédural comme C, vous pouvez programmer dans un style orienté objet (comme dans les API GTK+ et EFL).

Pour être clair, l'"avantage" de chaque paradigme réside simplement dans la modélisation de vos algorithmes et structures de données. Si, par exemple, votre algorithme implique des listes et des arbres, un algorithme fonctionnel peut être le plus judicieux. Ou, si, par exemple, vos données sont hautement structurées, il peut être plus logique de les composer sous forme d'objets si c'est le paradigme natif de votre langage - ou, elles pourraient tout aussi bien être écrites comme une abstraction fonctionnelle de monades, qui est le paradigme natif de langages comme Haskell ou ML.

Le choix de l'un ou l'autre est simplement ce qui a le plus de sens pour votre projet et les abstractions que votre langage supporte.

6 votes

Ce que vous avez dit, ne semble pas refléter ce que vous avez écrit. Vous dites qu'il n'y a pas de "pour et de contre", puis vous dites que ce sont des approches différentes. Pourquoi quelqu'un choisirait-il une approche plutôt qu'une autre, en fonction d'une situation donnée ? Les forces et les faiblesses, les avantages et les inconvénients, peu importe comment vous les appelez, ils existent ! Je ne dis pas que l'une est intrinsèquement meilleure, et vous non plus. Je crois que c'est ce que vous essayiez vraiment de dire, à moins que vous ne croyiez vraiment qu'une approche choisie n'a pas de points positifs et négatifs, par rapport à une autre approche.

1 votes

@TechZilla : Je reconnais que ma formulation était mauvaise, mais ce que je voulais dire, c'est qu'il n'y a pas vraiment de liste de fonctionnalités que vous pouvez pointer du doigt et dire que le langage X est meilleur que Y sans préciser que le langage X est mieux adapté à l'écriture de l'algorithme U et que le langage Y pourrait être mieux adapté à l'écriture de l'algorithme V, alors que les deux peuvent facilement être mis en œuvre dans l'un ou l'autre langage.

2 votes

La différence entre procédural et fonctionnel n'est pas claire pour moi. J'apprends Scheme/Rackett à l'université, mais je ne vois vraiment pas la grande différence entre ce langage et le C ou le PHP procédural. Pourriez-vous me donner un exemple ?

26voto

Je pense que les bibliothèques, outils, exemples et communautés disponibles l'emportent complètement sur le paradigme de nos jours. Par exemple, ML (ou autre) pourrait être le nec plus ultra de la programmation polyvalente. langue mais si tu ne peux pas obtenir de bonnes bibliothèques pour ce que tu fais, tu es foutu.

Par exemple, si vous créez un jeu vidéo, il y a plus d'exemples de code et de kits SDK en C++, ce qui est probablement préférable. Pour une petite application Web, il existe d'excellents frameworks Python, PHP et Ruby qui vous permettront de démarrer très rapidement. Java est un excellent choix pour les projets plus importants en raison de la vérification au moment de la compilation et des bibliothèques et plates-formes d'entreprise.

Autrefois, les bibliothèques standard des différents langages étaient plutôt petites et faciles à reproduire - C, C++, Assembler, ML, LISP, etc. étaient livrés avec les bases, mais avaient tendance à se dégonfler quand il s'agissait de standardiser des choses comme les communications réseau, le cryptage, les graphiques, les formats de fichiers de données (y compris XML), même les structures de données de base comme les arbres équilibrés et les tables de hachage étaient laissées de côté !

Les langages modernes tels que Python, PHP, Ruby et Java sont désormais dotés d'une bibliothèque standard bien plus décente et de nombreuses bibliothèques tierces de qualité que vous pouvez facilement utiliser, en grande partie grâce à l'adoption d'espaces de noms pour éviter que les bibliothèques ne se heurtent les unes aux autres, et de la collecte de déchets pour normaliser les schémas de gestion de la mémoire des bibliothèques.

23voto

hasenj Points 36139

Ces paradigmes ne doivent pas nécessairement s'exclure mutuellement. Si vous regardez python, il supporte les fonctions et les classes, mais en même temps, tout est un objet, y compris les fonctions. Vous pouvez mélanger et faire correspondre le style fonctionnel/oop/procédural dans un seul morceau de code.

Ce que je veux dire, c'est que dans les langages fonctionnels (du moins en Haskell, le seul que j'ai étudié), il n'y a pas d'instructions ! les fonctions ne peuvent contenir qu'une seule expression ! MAIS, les fonctions sont des citoyens de première classe, vous pouvez les passer comme paramètres, ainsi qu'un tas d'autres capacités. Elles peuvent faire des choses puissantes avec peu de lignes de code.

Dans un langage procédural comme le C, la seule façon de faire circuler des fonctions est d'utiliser des pointeurs de fonction, ce qui ne permet pas de réaliser de nombreuses tâches puissantes.

En python, une fonction est un citoyen de première classe, mais elle peut contenir un nombre arbitraire d'instructions. Vous pouvez donc avoir une fonction qui contient du code procédural, mais vous pouvez le faire circuler comme dans les langages fonctionnels.

Il en va de même pour les OOP. Un langage comme Java ne vous permet pas d'écrire des procédures/fonctions en dehors d'une classe. La seule façon de faire circuler une fonction est de l'envelopper dans un objet qui implémente cette fonction, puis de faire circuler cet objet.

En Python, vous n'avez pas cette restriction.

0 votes

Je crois que vous vouliez dire "ces paradigmes n'ont pas à être mutuellement exclusifs". Les 3 d'entre eux sont orthogonaux dans le sens où, idéalement, vous pourriez en utiliser un, deux ou les trois dans un seul programme (si votre langage le permet).

0 votes

Oui, je pense que "mutuellement exclusif" est un meilleur terme pour ça ! Merci.

14voto

panschk Points 705

Pour les interfaces graphiques, je dirais que le paradigme orienté objet est très bien adapté. La fenêtre est un objet, les boîtes de texte sont des objets, et le bouton "OK" en est un aussi. D'un autre côté, des choses comme le traitement des chaînes de caractères peuvent être faites avec beaucoup moins de frais généraux et donc plus facilement avec un paradigme procédural simple.

Je ne pense pas non plus que ce soit une question de langue. Vous pouvez écrire du fonctionnel, du procédural ou de l'orienté objet dans presque tous les langages populaires, bien que cela puisse représenter un effort supplémentaire dans certains.

18 votes

J'ai envie de décoter pour avoir perpétué l'idée fausse que "Objet = widget GUI", mais je vais m'abstenir. La POO fonctionne aussi bien pour représenter des concepts abstraits, comme "UserAccount" ou "PendingSale", que pour des éléments d'interface visibles comme "Window" et "Button".

6 votes

J'ai écrit qu'une fenêtre peut être un objet. Comment en tirez-vous la conclusion que tout objet est une fenêtre ? C'était juste un exemple. Bien sûr, la POO peut être utilisée tout aussi bien pour modéliser des entités abstraites et leurs relations. Quoi qu'il en soit, merci de ne pas me descendre. Je n'ai pas beaucoup de points de toute façon :D

6 votes

-1. La POO n'a rien à voir avec les interfaces graphiques. Idéalement, la meilleure méthode pour concevoir des interfaces graphiques est d'utiliser un fichier texte externe (par exemple HTML). Alors que des choses comme le traitement des chaînes de caractères sont en fait bien mieux faites avec des objets. (pensez aux chaînes de caractères en C) !

6voto

TimothyC Points 543

Pour répondre à votre question, nous avons besoin de deux éléments :

  1. Compréhension des caractéristiques des différents styles/modèles d'architecture.
  2. Compréhension des caractéristiques des différents paradigmes de programmation.

Une liste des styles/modèles d'architecture logicielle est présentée sur le site Web de la Commission européenne. article sur l'architecture logicielle sur Wikipeida. Et vous pouvez faire des recherches sur eux facilement sur le web.

En bref et en général, le procédural est bon pour un modèle qui suit une procédure, le POO est bon pour la conception, et le fonctionnel est bon pour la programmation de haut niveau.

Je pense que vous devriez essayer de lire l'histoire de chaque paradigme et voir pourquoi les gens le créent et vous pourrez les comprendre facilement.

Après avoir compris les deux, vous pouvez relier les éléments des styles/modèles d'architecture aux paradigmes de programmation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X