Qu'est-ce que la programmation procédurale? En quoi est-ce différent de la programmation orientée objet? Est-ce la même chose que la programmation fonctionnelle?

32

Je programme en Java dans un style très orienté objet (OO). La programmation orientée objet me vient très intuitivement, mais j'ai très peu de connaissances sur les autres types de programmation.

Qu'est-ce que la programmation procédurale ? En quoi est-ce différent de la programmation orientée objet? Est-ce la même chose que la programmation fonctionnelle ?

J'avais l'habitude de penser que toute programmation qui n'est pas OO est procédurale. Mais je commence à penser que ce n'est pas vrai.

Aviv Cohn
la source
9
Partager vos recherches aide tout le monde. Dites-nous ce que vous avez essayé et pourquoi il ne répondait pas à vos besoins. Cela montre que vous avez pris le temps d'essayer de vous aider, que cela nous évite de répéter des réponses évidentes et, surtout, que cela vous aide à obtenir une réponse plus précise et plus pertinente. Voir aussi Comment poser des questions
Gnat
2
La programmation procédurale n'est pas la même chose que la programmation fonctionnelle; c'est en fait essentiellement la même chose que la programmation orientée objet, moins les objets et les classes.
Mason Wheeler
1
OOP impératif est en fait la programmation procédurale, donc c'est exactement ce que vous faites tout le temps ...
Ingo

Réponses:

68

Wikipedia a de bonnes explications pour ces termes. Quoi qu'il en soit, voici le résumé:


  • La programmation déclarative est le contraire de la programmation impérative - elle spécifie ce qu'il faut calculer plutôt que comment (par exemple, SQL, regex).

  • Les modèles de programmation fonctionnelle sont calculés comme des expressions pouvant (éventuellement) générer des valeurs. Les fonctions sont des valeurs et peuvent être transmises ou renvoyées par d'autres fonctions. La mutation est découragée; toutes les variables sont immuables par défaut. En conséquence, il est plus déclaratif qu'impératif, car il met l'accent sur ce qui est calculé plutôt que sur la séquence des changements d'état nécessaires pour y parvenir.

  • La programmation purement fonctionnelle n'autorise pas la mutation (bien que contrairement à la croyance populaire, il existe encore des mécanismes pour obtenir des effets secondaires).
  • De plus, la programmation fonctionnelle totale interdit les exceptions et les boucles infinies. (Une fonction totale en mathématiques est une fonction qui renvoie une valeur pour toutes ses entrées.)

Leurs relations sont un peu compliquées parce que la POO est un terme assez chargé. Vous pouvez utiliser des objets à la fois dans les langages fonctionnels et dans les langages procéduraux, mais les langages qui se présentent comme étant OO sont procéduraux. Pour confondre davantage la question:

  • La plupart des gens ne savent pas la différence entre un objet et un type de données abstrait
  • Les langages traditionnels de la programmation orientée objet ne font aucune mention des TDA, leur fournissent un support très médiocre et vantent les objets comme une seule et même voie.
  • Personne ne dit programmation orientée type de données abstraites (parce que ce serait une chose stupide à faire; vous avez besoin à la fois de tables ADT et d'objets.)

Cela amène les gens à penser que la programmation orientée objet est le seul moyen d'abstraction, et que la programmation fonctionnelle et la programmation orientée objet sont en quelque sorte opposées ou mutuellement exclusives. Beaucoup de gens pensent également que tous les langages fonctionnels sont purs et interdisent les mutations.

De plus, les gens jonglent généralement entre impératif et procédure de manière interchangeable, contrastant parfois avec la POO (impliquant un code sans abstraction, généralement C) et parfois avec la programmation fonctionnelle. Le terme de programmation structurée est pour la plupart devenu hors d'usage (probablement parce que, à ce stade, la plupart des gens considèrent comme allant de soi que goto et les globals sont considérés comme nuisibles.)

Doval
la source
3
"interdit les sauts" est plutôt générique; cela inclut si / tant que / etc .. peut-être "interdit les sauts arbitraires"?
Izkata
@ Izkata Bon point, changé.
Doval
1
Cela vaut peut-être la peine de créer un lien vers les entrées wikipedia.
haylem
Et c'est pourquoi cela s'appelle Object "Oriented" et non Object Only.
JeffO
1
@OrangeDog En quoi est-ce différent d'un type de données abstrait, qui définit également un ensemble encapsulé de données et de fonctions pouvant agir sur celui-ci? De plus, vous pouvez avoir des objets immuables, alors dans quel cas, dans quel état ?
Doval
12

La programmation procédurale est une approche de la programmation qui constitue l’un des éléments de base des nombreux composants de langage (la fonctionnalité n’en est pas une).

La plupart des langues appartiennent à l'ensemble de la "programmation procédurale" et il s'agit probablement de l'approche de conception la plus naturelle pour la plupart des gens (si vous pensez en termes de OO, alors je dirais que vous êtes en minorité).

BASIC est procédural.

Comme d'autres l'ont dit, il s'agit d'un mécanisme permettant de structurer les programmes de manière séquentielle.

  • D'abord je fais x
  • Deuxièmement je fais y
  • Troisièmement je fais Z

Cela nécessite un mécanisme de définition de "procédures" - des blocs de code nommé similaires aux méthodes OO, pouvant accepter zéro à plusieurs paramètres et éventuellement renvoyer une valeur (qui serait alors généralement appelée une fonction - ce qui peut entraîner votre confusion avec les langages fonctionnels )

Le paradigme ne dicte pas ce que vous ferez, ni la manière dont les choses circulent.

Il décrit simplement que le programme sera structuré comme une série de procédures (ou fonctions) fonctionnant de manière séquentielle. Les données sont ensuite définies indépendamment des procédures.

Cela diffère de la programmation orientée objet, qui structure le programme autour de collections de données et de méthodes (non de fonctions) qui agissent sur ces données.

Une façon de penser à cela est en termes de portée des données.

Dans un langage procédural, la portée est assez simple. Une variable peut être dans l'étendue d'une procédure donnée (déclarée localement), jusqu'au niveau des commandes appelant en haut (déclarée globalement), avec des étendues imbriquées entre.

Dans un langage orienté objet, vous ajoutez un nouveau contexte de portée, celui de l'objet actuellement utilisé, qui est orthogonal à ce qui précède.

Une autre façon de penser procédurale, par rapport à orientée objet, consiste à considérer un langage orienté objet où toutes les méthodes doivent être déclarées comme statiques. Le résultat est un langage procédural dans lequel les classes peuvent être utilisées pour regrouper des procédures.

Rob Baillie
la source
5

Programmation procédurale n'est certainement pas une programmation fonctionnelle.

La programmation procédurale se produit lorsque vous avez dans votre tête un modèle de l'ordinateur en tant que machine et que vous réfléchissez à la façon dont il modifie les données en mémoire. Donc, d'abord, vous réglez Ala valeur 3, puis vous ajoutez 1 et stockez-le dans l'emplacement de la mémoireA nouveau (en remplaçant la valeur précédente).

La programmation fonctionnelle serait de dire A3 et Best A + 1, et de laisser ensuite l’ordinateur déterminer comment calculer B. Une fois que vous avez défini, Ail devrait être immuable (non changeant). Functional vous permet également de faire des choses comme passer une fonction en tant que valeur de première classe (une fonction peut prendre une fonction en tant qu'argument).

La programmation orientée objet combine souvent les deux et est en quelque sorte orthogonale aux deux. Vous pouvez utiliser la programmation fonctionnelle et renvoyer un objet immuable, et cet objet peut avoir une méthode qui renvoie une valeur calculée, et même le faire paresseusement - c'est de la programmation orientée objet fonctionnelle. Vous pouvez également avoir un objet qui représente un "référentiel" (version abstraite d'une base de données), vous pouvez "enregistrer" des éléments dans le référentiel et "les récupérer", et laisser cet objet gérer tous les détails de la procédure. . C'est essentiellement la programmation procédurale orientée objet.

Scott Whitlock
la source
0

La POO n'est rien d'autre qu'une forme légèrement raffinée de programmation procédurale, qui appartient encore à la grande famille de la programmation impérative. La preuve en est que beaucoup de programmeurs C # / Java ont tendance à "faire quelque chose" et préfèrent des méthodes telles que:

void doThisAndThat(....) { ... do something ... }

Donc, un programme qui consiste en un tas de méthodes void (anciennement appelées procédures (sic!)) Et un code comme:

doThis();
if (state is that) doSomethingElse();
doThat();

est une programmation procédurale parfaite.

Ingo
la source
doThisAndThat (....) implique qu'une méthode fera plus d'une chose qui n'est pas en général une bonne pratique. Les développeurs Java et C # adhèrent principalement au principe de responsabilité unique. Je pense que votre analogie est imparfaite. objectmentor.com/resources/articles/srp.pdf
JohnK
@JohnK Je sais que ce n'est pas une bonne pratique. Pourtant, un commun. Surtout chez les développeurs Java, si on peut en juger par ce que l'on voit tous les jours sur SO.
Ingo
@JohnK Les développeurs Java et C # adhèrent pour la plupart au principe de responsabilité unique : le service Lip?
Ingo
Les développeurs Java adhèrent principalement à la responsabilité unique? Si seulement c'était vrai dans la vie réelle ...
Sridhar Sarnobat