Je programme en Java dans un style très orienté objet (OO). La POO me vient très intuitivement, mais jai très peu de connaissances sur les autres types de programmation.
Quest-ce que la programmation procédurale ? En quoi est-ce exactement différent de la POO? Est-ce la même chose que la programmation fonctionnelle ?
Javais lhabitude de penser que toute programmation qui nest pas « t OO est procédurale. Mais moi » Je commence à penser que ce nest pas vrai.
Commentaires
- Le partage de votre recherche aide tout le monde. Dites-nous ce que vous ‘ jai essayé et pourquoi cela ne répondait pas à vos besoins. Cela démontre que vous avez pris le temps dessayer de vous aider, cela nous évite de répéter des réponses évidentes et, surtout, cela vous aide à obtenir plus réponse spécifique et pertinente. Voir également Comment demander
- La programmation procédurale nest pas la même chose que la programmation fonctionnelle; elle ‘ est en fait essentiellement la même chose que la programmation orientée objet, moins les objets et les classes.
- La POO impérative est de la programmation procédurale, donc cest exactement ce que vous ‘ faites tout le temps …
Réponse
Wikipedia a de bonnes explications pour ces termes. Quoi quil en soit, voici le résumé:
- Programmation impérative modélise le calcul comme une séquence d instructions qui modifient létat mutable.
- La programmation procédurale est une programmation impérative qui décompose le code en sous-programmes.
- La programmation structurée est une approche plus disciplinée de la programmation procédurale qui interdit les sauts arbitraires (par exemple goto) et les changements détat global.
-
La programmation déclarative est le contraire de la programmation impérative – elle spécifie ce quil faut calculer plutôt que comment (par exemple, SQL, expressions régulières).
-
Programme fonctionnel ming modélise le calcul comme des expressions qui (peuvent) donner des valeurs. Les fonctions sont des valeurs et peuvent être transmises ou renvoyées par dautres fonctions. La mutation est découragée; toutes les variables sont immuables par défaut. En conséquence, il « est plus déclaratif quimpératif, car il met laccent 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 interdit complètement la mutation (bien que contrairement à la croyance populaire, il existe encore des mécanismes pour effets).
- 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 toutes ses entrées.)
- La programmation orientée objet met laccent sur utilisation des objets / interfaces pour atteindre labstraction et la modularité.
Leurs relations sont un peu compliquées car 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 sannoncent comme OO sont procéduraux. Pour compliquer davantage le problème:
- La plupart des gens ne savent pas la différence entre un objet et un type de données abstrait
- Les langages OOP traditionnels ne font aucune mention des ADT, fournissent un support très médiocre pour eux et présentent les objets comme la seule vraie manière.
- Personne ne dit Programmation orientée type de données abstraites (parce que « ce serait une chose stupide à faire; vous avez besoin à la fois dADT et dobjets.)
Cela amène les gens à penser que la POO est le seul moyen dabstraction, et que la programmation fonctionnelle et la POO sont en quelque sorte opposées ou sexcluent mutuellement. 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 limpératif / procédural de manière interchangeable, parfois en le contrastant avec la POO (impliquant du code sans abstraction, généralement C) et parfois en le comparant à la programmation fonctionnelle.Pour autant que je sache, le terme programmation structurée est généralement tombé en désuétude (probablement parce quà ce stade, la plupart des gens tiennent pour acquis que goto et les globaux sont considérés comme dangereux.)
Commentaires
- » interdit les sauts » est plutôt générique; qui inclut if / while / etc .. peut-être que » interdit les sauts arbitraires « ?
- @Izkata Bon point, modifié.
- Cela pourrait valoir la peine de créer un lien vers les entrées de wikipedia.
- Et que ‘ s pourquoi ‘ est appelé Object » Orienté » et pas Object Only.
- @OrangeDog Comment est-ce différent dun type de données abstrait, qui également définit un ensemble encapsulé de données et de fonctions qui peuvent agir dessus? De plus, vous pouvez avoir des objets immuables, donc dans ce cas, quel état ?
Answer
La programmation procédurale est une approche de la programmation qui est lun des éléments de base de la construction de nombreux autres langages (fonctionnels nen étant pas un).
La plupart des langages appartiennent à lensemble de la «programmation procédurale» et cest probablement lapproche de conception la plus naturelle pour la plupart des gens (si vous pensez en termes dOO, alors je dirais que vous êtes une minorité).
BASIC est procédural.
Comme dautres lont dit, il sagit dun mécanisme pour structurer les programmes de manière séquentielle.
- Je fais dabord x
- Ensuite, je fais y
- Troisièmement, je fais Z
Cela nécessite un mécanisme pour définir des «procédures» – des blocs de code nommé similaires aux méthodes OO, qui peuvent accepter zéro à de nombreux paramètres, et éventuellement renvoyer une valeur (qui serait alors généralement appelée une fonction – conduisant probablement à votre confusion avec les langages fonctionnels)
Le para digm 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 opèrent dans 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 dy 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 dune procédure donnée (déclarée localement), jusquau niveau de lélément supérieur appelant des trucs (déclarée globalement), avec des portées imbriquées entre.
Dans un langage orienté objet, vous ajouter un nouveau contexte de portée, étant celui de lobjet actuellement utilisé, qui est orthogonal à ce qui précède.
Une autre façon de penser procédural, par rapport à orienté objet, est de considérer un langage orienté objet où toutes les méthodes doivent être déclarées statiques. Le résultat est un langage procédural où les classes peuvent être utilisées pour regrouper les procédures.
Réponse
La programmation procédurale n’est certainement pas une programmation fonctionnelle.
La programmation procédurale consiste à avoir un modèle de l’ordinateur en tant que machine dans la tête et que vous pensez « s modifier les données en mémoire. Commencez par définir A
sur la valeur 3, puis ajoutez 1 et stockez-le à nouveau dans lemplacement de mémoire A
(en écrasant la valeur précédente) .
La programmation fonctionnelle dirait que A
vaut 3 et B
est A + 1
, puis laisser lordinateur déterminer 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 en premier. valeur de 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 que object peut avoir une méthode qui renvoie une valeur calculée, et même le faire paresseusement – cest la programmation orientée objet fonctionnelle. Vous pouvez également avoir un objet qui représente un « référentiel » (version abstraite dune 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 sur la façon dont cela » Cest fait. Cest essentiellement une programmation procédurale orientée objet.
Réponse
La POO nest rien quune 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 des méthodes void (anciennement connues sous le nom de procédures (sic!)) et du code comme:
doThis(); if (state is that) doSomethingElse(); doThat();
est une programmation procédurale parfaite.
Commentaires
- doThisAndThat (….) implique quune méthode fera plus dune chose qui nest 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 erronée. objectmentor.com/resources/articles/srp.pdf
- @JohnK Je sais que ce nest pas une bonne pratique. Pourtant, une commune. Surtout chez les développeurs Java, si lon peut juger par ce que lon voit tous les jours sur SO.
- @JohnK Les développeurs Java et C # adhèrent principalement au principe de responsabilité unique – service Lip?
- Les développeurs Java adhèrent principalement à la responsabilité unique? Si seulement cela était vrai dans la vraie vie …