Je ne peux pas penser à un meilleur endroit parmi les frères et sœurs SO pour poser une telle question. À l'origine, je voulais demander "Le python est-il un pur langage OO?" mais compte tenu des problèmes et de l'inconfort que ressentent les gens en essayant de définir le terme, j'ai décidé de commencer par obtenir une définition claire du terme lui-même.
Il serait plutôt juste de commencer par la correspondance du Dr Alan Kay, qui a inventé le terme (notez l'inspiration dans l'analogie biologique avec les cellules ou d'autres objets vivants).
Il existe différentes façons d'aborder la tâche:
- Donnez une analyse comparative en répertoriant les langages de programmation qui peuvent présenter (ou ne pas le faire) certaines propriétés uniques et suffisantes pour définir le terme (bien que Smalltalk, Scala,
Java, etc.) sont des exemples possibles mais IMO de cette façon ne semble ni vraiment complet ni fructueux ) - Donnez une définition formelle (ou proche d'elle, par exemple dans un style plus académique ou mathématique).
- Donnez une définition philosophique qui dépendrait totalement du contexte sémantique d'un langage concret ou d'une expérience de programmation a priori (il doit y avoir une chance d'explication réussie par la communauté).
Ma version actuelle: "Si un certain langage de programmation ( formel ) qui peut ( grammaticalement ) faire la différence entre les opérations et les opérandes ainsi que déduire du type de chaque opérande si ce type est un objet (au sens de la POO) ou non, alors nous appelons un tel langage est un langage OO tant qu'il y a au moins un type dans ce langage qui est un objet. Enfin, si tous les types de langage sont également des objets, nous définissons ce langage comme étant un langage OO pur (fort). "
J'apprécierais toute amélioration possible de celui-ci. Comme vous pouvez le voir, je viens de rendre la définition dépendante du terme "objet" (souvent entièrement référencé comme classe d'objets).
[ÉDITER]
De plus, j'utilise (heureusement bien compris) la notion de type comme dans les langages typés. La programmation de type de données ou la programmation orientée type n'est pas seulement une interprétation syntaxique (du texte du programme, c'est-à-dire comment traiter certaines valeurs des littéraux et des variables de données - quelque chose qui évolue en sécurité de type) mais peut être attribuée à la grammaire du langage et étudiée de manière formelle (en utilisant la logique mathématique) en tant que systèmes dits . Notez que l'exigence d'un système de type particulier d'avoir un type dit universel est l'une des façons de définir la pureté du langage OO (il existe des moyens de l'étendre sémantiquement).
NB
comment répondre :
- cela aide si vous spécifiez un livre ou une référence qui soutient / explique votre compréhension de la terminologie et des concepts (généralement une bonne définition couvre ou fait référence à tous les concepts dépendants sauf élémentaire).
- si possible, indiquez une catégorie en retrait de votre réponse / définition si ce n'est pas clair autrement (voir ci-dessus: 1 - par exemple de langage, 2 - logique mathématique, 3 - description technique et philosophie de programmation)
- la classification est importante (et aussi parce que le terme pure-OO est inclus dans le terme OO) tout en répondant, essayez de démêler les éléments du paradigme OO d'autres méthodologies bien connues (et en aucun cas les confondre / les chevaucher, par exemple, typiquement, des éléments de programmation modulaire peuvent être couverts / incorporé à la programmation OO): essayer de distinguer la POO de (incluant ou faisant partie de) la programmation fonctionnelle, la programmation logique (particulièrement fortement spécialisée), les types de données Abstarct (ADT), modulaire, la métaprogrammation (génériques et macro-expansion de LISP), Contrats (par exemple Eiffel), orientés aspect (AO), (la différence entre la classification déclarative et fonctionnelle ainsi que les définitions historiques de la structure de Dijkstra sont claires)
sur la difficulté de donner une définition formelle : assez étonnamment, il est très facile de donner une description mathématique de la POO sous la forme d'un certain système logique (formel) (très probablement basé sur le type) et de définir un concept après l'autre. On peut même essayer de faire quelque chose de plus pratique en appliquant ce formalisme à la vérification de la sécurité du type ou à de nouveaux aspects de conception de langage que simplement un divertissement abstraitou un exercice (également formulation de recherche de POO dans la théorie des types intuitionistes , types dépendants , indépendamment, dans les formalismes FOL comme le calcul lambda et juste en utilisant la théorie des catégories). Un point principal ici est que sans surpriseces formulations OMI sont fortement biaisées (défectueuses) par une compréhension très probablement initialement incomplète de la POO (en ingénierie informatique) et finissent par être presque inaccessibles par la suite (contribuant ainsi à peine à l'arrière du monde de la programmation - peut-être qu'un certain pourcentage trouve des applications de retour du monde formel en étant intégré dans les langues populaires ).
Alors oui, il est difficile de donner exactement une "bonne" définition, pas seulement une définition. Mais je suis certain de poser cette question ici en raison de votre expérience et de votre implication directe, les gars.
la source
Réponses:
OO, selon Alan Kay, tout est question de transmission de messages, et c'est tout. Vous verrez que des qualités telles que le polymorphisme et l'encapsulation sont en fait dérivées du passage de messages.
Maintenant, cette position est en fait très extrême, car cela signifie essentiellement que seuls Smalltalk et les langues seraient admissibles.
Je pense que vous pouvez définir OO comme la construction de votre système sur des entités qui encapsulent pleinement leur état et qui sont rendues échangeables en raison de leurs qualités polymorphes inhérentes. On pourrait donc soutenir qu'un langage purement OO garantit que ces deux qualités fondamentales sont toujours respectées. Ce qui rend les langages OO "impurs" serait des mécanismes qui permettent la création de constructions qui ne répondent pas à ces critères, comme les possibilités de:
Là encore, la pureté du langage IMHO est plus une faiblesse qu'une force. OO n'est pas une solution miracle. Aucun paradigme n'est.
la source
J'aborderais cela en le définissant comme un langage qui utilise des constructions OOP et rien d'autre (de la même manière qu'un langage FP pur utilise des fonctions pures avec des données immuables et rien d'autre).
En particulier:
functionObject.call(param1,param2)
environment.getValue("myThing")
ou mettre la variable dans un objet de classeNotez que cela laisse encore pas mal d'options ouvertes:
la source
globalVariableName
pour accéder à une variable globale est une sémantique différente d'un appel de méthode sur un objet, ce qui serait le seul moyen d'accéder à une valeur non locale en pure POO.La discussion sur les soi-disant langues OO a toujours été un peu lavée par le cerveau. C'est à dire:
Le terme conception orientée objet se résume à 3 choses:
1) est une conception de programme pure, il peut être réalisé dans n'importe quel langage de programmation. Cependant, certaines langues ont des fonctionnalités utiles telles que class / struct et des mots-clés privés.
2) est principalement la conception de programmes, mais ne peut pas être entièrement réalisée sans prise en charge de la langue, car vous avez besoin de mécanismes de langue tels que privé / statique pour vous protéger contre une utilisation accidentelle.
3) est principalement la conception du programme. Il existe généralement trois dépendances différentes: "l'objet X contient l'objet Y", "l'objet X est une sorte de Y" et "l'objet X interagit avec l'objet Y". Il existe de nombreuses fonctionnalités de langage pour aider avec ces dépendances: héritage / polymorphisme, classes de base abstraites, etc.
Maintenant, si nous regardons ce qui précède, nous pouvons voir que vous avez à peine besoin de fonctionnalités de langage pour écrire des programmes OO. Les fonctionnalités le rendent beaucoup plus facile.
Les objectifs ci-dessus ne peuvent pas être atteints en utilisant une logique en arrière boueuse: simplement parce que vous utilisez le mot-clé class, votre programme ne reçoit pas automatiquement une conception modulaire. Ce n'est pas parce que vous utilisez l'héritage que vos dépendances d'objets ont un sens. Un langage avec des fonctionnalités OO permettrait toujours des choses comme
class TheWholeBloodyProgram
ou "Animal hérite de chat".Malheureusement, le sujet d'une bonne conception de programme orienté objet est rarement mentionné dans ce genre de discussions. Les programmeurs endoctrinés ne regardent que la syntaxe et yap des choses comme par exemple "C ++ a des types de données primitifs donc votre programme C ++ n'est pas OO", puis ils partent pour écrire un programme carrément horrible dans leur propre langue préférée, sans utiliser la moindre allusion à conception du programme quoi que ce soit.
Pour répondre à la question: très peu de langues, voire aucune, prennent en charge la conception appropriée du programme OO. Il n'est pas pertinent de savoir quels langages possédant certaines fonctionnalités liées à l'OO tant que le programmeur ne sait pas ce que signifie la conception orientée objet. Un programmeur affirmant que certains langages sont orientés objet n'a probablement pas saisi le concept d'OO dans son ensemble. Demandez au futur programmeur OO comment il conçoit les programmes OO. Si la première chose qu'ils font est de commencer à crier des mots-clés de langue, alors vous pouvez sans risque supposer qu'ils ne connaissent pas la conception OO.
Il existe peut-être un outil de haut niveau UML sophistiqué bien au-dessus du code source brut, qui oblige le programmeur à écrire uniquement des programmes avec une bonne conception orientée objet, mais j'en doute. Les meilleurs outils de conception pour la programmation OO sont probablement encore le cerveau humain et le bon sens.
la source
Non, il n'y a pas de définition formelle ou même utile, et il n'y en aura jamais. Pour certaines personnes, la POO signifie «classe de base universelle» et «doit utiliser la sémantique de référence, mieux avec un garbage collector» - et vous pouvez même obtenir des chicanes sur la syntaxe, l'une des choses les moins pertinentes jamais inventées.
En fin de compte, vous devez d'abord répondre à la question "Qu'est-ce qu'un objet?". Les plus bornés insisteront pour hériter d'une classe de base universelle inutile et être inutilement alloués sur un garbage collector pour se qualifier. Mais je préfère une définition beaucoup plus utile. Le but de la POO est d'avoir certaines données et certaines fonctions que vous pouvez appeler sur ces données. Donc
Dans ce cas, même
int
qualifie. Après tout, lorsque vous écrivez du code de modèle en C ++ qui peut accepter des primitives ou des objets, il devient difficile d'argumenter que les primitives sont différentes de manière substantielle. Il n'y a rien de vraiment différent à laVector v1, v2; v1 + v2;
place deint v1, v2; v1 + v2;
(sauf la sémantique d'initialisation merdique, il faut l'admettre). En outre, cela permet aux lambdas et à de telles choses d'être des objets, car ils détiennent l'état - leurs captures - et offrent une fonction sur cet état, pour appeler le lambda.Heureusement, nous pouvons également classer les pointeurs vers des fonctions libres en tant qu'objets, car ils détiennent tous deux l'état (une adresse) et une fonction sur cet état (pour l'appeler). Donc une fonction libre devrait être autorisée - même si vous deviez dire que toutes les fonctions libres sont en fait des pointeurs de fonction globale.
la source
Vous pouvez y penser par exemple négatif. Java n'est pas un langage purement orienté objet car il existe également des types primitifs qui ne sont pas des objets. Ce sont des entiers, des doubles, des tableaux et ainsi de suite. Dans un langage objet pur, la sémantique des objets est disponible pour tout.
Il y a aussi la question de savoir dans quelle mesure le langage est fermé à la modification, même dans le cadre de l'objet. En Java, vous ne pouvez pas définir de nouvelles sous-classes pour certaines classes, telles que String ou Class.
Quelles langues sont pures? Le seul candidat qui me vient à l'esprit est smalltalk.
la source