web-dev-qa-db-fra.com

Qu'est-ce que la programmation procédurale exactement? En quoi est-il différent de la POO? Est-ce la même chose que la programmation fonctionnelle?

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

En quoi consiste exactement programmation procédurale ? En quoi est-il différent de la POO? Est-ce la même chose que programmation fonctionnelle ?

Je pensais que toute programmation qui n'est pas OO est procédurale. Mais je commence à penser que ce n'est pas vrai.

32
Aviv Cohn

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


  • La programmation déclarative est l'opposé de la programmation impérative - elle spécifie quoi calculer plutôt que comment (par exemple SQL , regex).

  • La programmation fonctionnelle modélise le calcul sous la forme expressions qui (peut) produire 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 de changements d'état nécessaire pour y parvenir.

  • La programmation purement fonctionnelle interdit complètement la mutation (bien que contrairement à la croyance populaire, il existe encore des mécanismes pour obtenir des effets secondaires) .
  • La programmation fonctionnelle totale interdit en outre les exceptions et les boucles infinies. (Une fonction totale en mathématiques est une fonction qui renvoie une valeur pour tous de ses entrées.)

Leurs relations sont un peu compliquées parce que OOP est un terme assez chargé. Vous pouvez utiliser des objets dans les langages fonctionnels et les langages procéduraux, mais les langages qui s'annoncent comme OO sont procéduraux. Pour confondre davantage le problème:

  • La plupart des gens ne connaissent pas la différence entre un objet et un type de données abstrait
  • Les langages courants [OOP ne font aucune mention des ADT, leur fournissent un support très médiocre et vantent des objets comme The One True Way.
  • Personne ne dit Programmation orientée type de données abstrait (parce que ce serait une chose idiote à faire; vous avez besoin à la fois d'ADT et d'objets.)

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

De plus, les gens tournent généralement autour de l'impératif/procédural de manière interchangeable, parfois en le contrastant avec OOP (impliquant un code sans abstraction, généralement C) et parfois en le contrastant avec la programmation fonctionnelle. Le terme programmation structurée est pour la plupart tombé en désuétude pour autant que je sache (probablement parce qu'à ce stade, la plupart des gens tiennent pour acquis que goto et les globaux sont considérés comme nuisibles.)

69
Doval

La programmation procédurale est une approche de la programmation qui est l'un des éléments de base des éléments constitutifs de nombreuses autres conceptions de langage (fonctionnel n'en étant pas un).

La plupart des langues appartiennent à l'ensemble de la "programmation procédurale" et c'est probablement l'approche de conception la plus naturelle pour la plupart des gens (si vous pensez en termes d'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 de structuration séquentielle des programmes.

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

Il nécessite un mécanisme pour définir des "procédures" - des blocs de code nommé similaires à OO, qui peuvent accepter de zéro à de nombreux paramètres et renvoyer éventuellement une valeur (qui serait alors généralement appelée fonction - conduisant probablement à votre confusion avec les langages fonctionnels)

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

Il décrit simplement que le programme sera structuré comme une série de procédures (ou fonctions) qui fonctionnent 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 (et non de fonctions) qui agissent sur ces données.

Une façon d'y penser 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 la portée d'une procédure donnée (déclarée localement), jusqu'au niveau de la chose qui appelle le plus (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 la procédure, par rapport à orientée objet, est de considérer un langage orienté objet où toutes les méthodes must doivent être déclarées comme statiques. Le résultat est un langage procédural où les classes peuvent être utilisées pour regrouper des procédures.

12
Rob Baillie

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

La programmation procédurale, c'est quand vous avez un modèle de l'ordinateur comme une machine dans votre tête et que vous pensez à la façon dont il modifie les données en mémoire. Donc, vous définissez d'abord A sur la valeur 3, puis vous ajoutez 1 et le stockez dans l'emplacement de mémoire A (en écrasant la valeur précédente).

La programmation fonctionnelle dirait que A est égal à 3 et B est A + 1, puis laisser l'ordinateur comprendre comment calculer B. Une fois que vous avez défini A, il devrait être immuable (sans changement). Fonctionnel vous permet également de faire des choses comme passer une fonction comme valeur de première classe (une fonction peut prendre une fonction comme 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 une programmation orientée objet fonctionnel. Vous pouvez également avoir un objet qui représente un "référentiel" (version abstraite d'une base de données), et vous pouvez "enregistrer" des éléments dans le référentiel et "récupérer" des éléments, et laisser cet objet gérer tous les détails de la façon dont cela est fait . Il s'agit essentiellement d'une programmation procédurale orientée objet.

5
Scott Whitlock

La POO n'est rien d'autre qu'une forme un peu raffinée de programmation procédurale, qui appartient à nouveau à la grande famille de la programmation impérative. La preuve de cette affirmation est que de nombreux programmeurs C #/Java ont tendance à "faire quelque chose" et préfèrent des méthodes comme:

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

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

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

est une programmation procédurale parfaite.

0
Ingo