Question

Comme je l'ai lu réponses stackoverflow et questions que j'ai l'impression que OO est compartimenté à être intrinsèquement impératif.

Mais n'est pas OO juste une façon de compartimenter le code et les données dans les objets du monde réel?

Si oui, pourquoi serait-ce renoncer à d'autres paradigme de niveau inférieur pour travailler dans une telle plate-forme?

OIEau, un système de type générique à base d'objets qui est immuable par défaut serait la façon dont une première langue fonctionnelle fonctionnerait, un système de type générique à base d'objets qui est mutable par défaut serait le monde des langues impératives.

Ou suis-je manque tout à fait quelque chose?

Était-ce utile?

La solution

Non . OO et impératif sont deux concepts orthogonaux.

Par exemple:

  • Le système Common Lisp Object est un exemple de Lisp OO et peut-être le système de l'objet le plus complexe autour.
  • OCaml est un langage fonctionnel d'un système d'objet et une organisation orienté objet supportant le système de module
  • Scala est un langage fonctionnel avec un système très flexible OO
  • Haskell vous permet d'écrire du code orienté objet en utilisant le polymorphisme supérieur kinded

Il y a beaucoup de façons différentes d'être orientée objet.

Autres conseils

La plupart des langues OO sont impératives, mais vous peut les utiliser dans un style un peu fonctionnel. Certaines langues fonctionnelles sont assis au sommet d'un cadre OO (F # sur .NET étant l'exemple le plus évident) troquer une « pureté » afin d'obtenir un cadre massif à utiliser, le cas échéant.

Je pense qu'il ya un beaucoup de place pour « principalement OO » langues à faire plus pour aider la programmation dans un style fonctionnel - un meilleur support pour immuabilité étant la caractéristique la plus évidente, peut-être suivie par une meilleure inférence de type . (Au moins quand on parle de C #, ce qui est probablement l'exemple le plus significatif d'une langue traditionnelle en essayant de mettre un pied dans la porte fonctionnelle.)

Oui. orientée objet est un style de programmation qui permet au programmeur d'exprimer un programme comme un ensemble d'objets stateful agir et d'interagir (en général, au moyen de passage de messages dans typé dynamiquement langues et méthode de l'invocation en langage à typage statique), et ce, dans un ordre particulier.

État, l'action et la séquence sont des concepts de programmation procédurale et ne sont pas présents dans la programmation fonctionnelle nonmonadic (monades sont utilisés pour mettre en œuvre l'état, l'action et la séquence dans les pures langages fonctionnels Haskell, qui seraient autrement pas ces concepts).

Pour regarder d'un autre point de vue, la plupart des gens aiment à penser impérieusement (plutôt que dans récurrences ou RPN). Il en découle que la plupart des langues sera impératif.

Bien sûr, de nombreux problèmes sont beaucoup plus simples à exprimer (ou résoudre) avec une approche non impérative (par exemple les interfaces utilisateur), mais la plupart des gens ne se sentent pas vraiment à l'aise avec cette approche. Certains n'aiment pas sortir des sentiers battus tandis que d'autres ont vraiment du mal à faire le changement mental nécessaire pour aborder les problèmes de ce côté (penser à des appels de méthode et récursivité au lieu des variables et des boucles).

Je crois toujours fermement que l'orientation objet est un concept intrinsèquement impératif. Cependant, comme question récente m'a fait penser un peu plus sur les paradigmes de programmation en général, je mets ensemble une réponse plus complète, ce qui est un peu hors-sujet, mais répond d'ailleurs aussi votre question:

Les 2 paradigmes de programmation principaux sont les paradigme déclarative , où le programmeur écrit vers le bas des relations abstraites (indiquant ainsi le compilateur ce il veut), et impératif paradigme , où les algorithmes programmeur écrit vers le bas (indiquant ainsi l'ordinateur comment pour obtenir ce qu'il veut).

Les paradigmes sont une langue agnostique a priori - il est plus d'une façon sur la façon dont vous pensez et structurer votre programme. Cependant, il existe des différences dans la façon dont une langue facile en fait d'utiliser un paradigme. Sémantique et langage principal de syntaxe à un mode idiomatiques de l'écriture de code

Un exemple pour un langage déclaratif serait Prolog, un exemple pour un langage impératif serait Fortran (et réel programmeur peut écrire des programmes FORTRAN dans toutes les langues ).

A titre d'exemple pour le code qui est impératif et déclarative en même temps, envisager cette mise en œuvre de la séquence Fibonnaci en Perl6:

my @fibonacci-sequence := 0, 1, * + * ... *;

Ceci est clairement une description déclarative de la séquence. Cependant, comme * et ... sont des opérateurs valides Perl6 - Whatever étoiles peut être utilisé pour créer lambda-expressions, la séquence opérateur de créer des listes paresseux -. Il est aussi une déclaration impératif d'appeler du code d'exécution intrinsèque

Considérons d'autres paradigmes de programmation, en particulier la programmation fonctionnelle et orientée objet.

paradigme fonctionnel est en soi calcul déclarative, comme il modélise comme une relation entre les séries.

paradigme orienté objet est en soi impératif, comme il les modèles de calcul que la communication entre les objets stateful, appelé passage de message.

Certaines langues sont pures, ce qui signifie tout calcul est conforme au paradigme. Par exemple, Haskell est un langage purement fonctionnel, et Smalltalk est un langage orienté objet purement.

Cependant, cela ne signifie pas que ce resp des langages fonctionnels. langages orientés objet empêchent respectivement impératif. programmation déclarative. Dans la pratique, vous utilisez souvent des fonctions impérieusement - vous mettez dans une valeur d'entrée pour sortir une valeur de sortie. L'inverse est vrai pour la programmation orientée objet:. L'ensemble des messages d'un objet accepte déclare son interface

Certaines personnes sont en désaccord sur OO étant un concept impératif, donc voici mon raisonnement.

essentials orienté objet:

  1. objets tiennent état (par exemple des références à d'autres objets)
  2. objets reçoivent des messages (et le procédé)
  3. traitement d'un message peut entraîner
    • Messages beeing envoyés à l'objet lui-même ou d'autres objets
    • un changement dans l'état de l'objet

Cela signifie oo programmation nécessite l'état mutable détenu par l'objet (!) . Si vous simulez changement d'état en créant une série d'objets, vous enfreignez ces invariants, simple que cela.

flamebait:. Si vous n'êtes pas d'accord avec cette définition de l'orientation de l'objet, le prendre avec Alan Kay

Beaucoup de différents concepts contribuent au concept de la programmation orientée objet. Wikipedia liste mosts d'entre eux.

Je qualifierais l'essence de la POO par l'utilisation de objets avec Behaviors .

Wikipedia caractérise Objets par les trois propriétés suivantes:

  1. Identité : la propriété d'un objet qui le distingue des autres objets
  2. État : décrit les données stockées dans l'objet
  3. Comportement : décrit les méthodes dans l'interface de l'objet par lequel l'objet peut être utilisé

Beaucoup de langage orienté objet ont un concept de classes, mais en réalité, il y a aussi Prototype langues comme le JavaScript à base.

Les langages fonctionnels peuvent également utiliser des classes (par exemple des classes de type dans Haskell). Mais juste parce qu'ils ont des classes ne signifie pas qu'ils sont orienté objet ou permettre la programmation orientée objet. Pour rester avec l'exemple de Haskell: Vous n'avez même pas des objets! Il n'y a pas que l ' « identité »! Tout ce que vous pouvez faire est en train de composer des fonctions pures!

Juste parce que quelqu'un est en utilisant un terme nommé « classes », cela ne signifie pas qu'ils font l'objet de programmation orienté!

POO est sur les objets stateful avec le comportement. Bien que le comportement des objets ne pas modifier cet objet, car de nouveaux objets peuvent être créés à la place, vous perdriez complètement le besoin d'objets. Vous avez pas besoin Identités plus, parce qu'il n'a pas d'importance si les modifications apportées à un objet sont reflétés par d'autres références au même objet, car il n'y aurait pas de changements plus. Tout ce que vous avez besoin sont des valeurs (sans identité) et de modules et / ou classes pour cacher des données et l'encapsulation.

Oui , la programmation impérative est inhérente à la POO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top