8
votes

Java ou C ++ n'ont-ils pas de fonctionnalités OO?

Je suis intéressé à comprendre la programmation orientée objet de manière plus académique et abstraite que je le fais actuellement et que je veux savoir s'il y a des concepts orientés objet Java et C ++ échouent à mettre en œuvre.

Je réalise que l'une ni l'autre des langues n'est "pure" oo, mais je suis intéressé par ce qu'ils manquent, pas ce qu'ils ont extra.


2 commentaires

Cela vous entraînerait d'orthographier ce que vous entendez par "OO".


Je pense que le point est que op ne sait exactement ce que cela signifie et veut quelque chose d'expansion de l'esprit.


9 Réponses :


1
votes

Java n'a pas de héritage multiple, mais certains pourraient dire que cela est plus une bénédiction, car il oblige les utilisateurs à penser à une architecture correcte. Vous pouvez utiliser des interfaces et des classes abstraites pour contourner cela.

Plusieurs héritages ont été critiqués pour les problèmes suivants qu'il provoque dans certaines langues, notamment C ++:

  • ambiguïté sémantique résumée souvent Comme le Problème de diamant .
  • ne pas être capable d'hériter explicitement plusieurs fois d'une seule classe
  • ordre de la classe de changement d'héritage Sémantique

2 commentaires

@Chris DENNETT: Ce n'est tout simplement pas vrai. La mise en œuvre est un détail et vous devez savoir que vous pouvez trivialement Traduire n'importe quel ooa / oood utilisant tout héritage multiple fou de très proprement dans Java (comme Vous pouvez faire dans la langue qui n'a même pas le concept d'héritage de mise en œuvre) en utilisant plusieurs héritages d'interface. Vous êtes probablement confondu avec la "réutilisation du code" que vous pouvez faire de manière triviale à l'aide de la délégation. 200kloc java codebase ici où nous utilisons exactement zéro héritage héritier de la mise en œuvre du temps ... et où nous utilisons plusieurs héritages partout .


OK, WizardOfodds, Java manque à la délégation de l'interface. Si vous souhaitez que certaines catégories déléguent l'interface I pour s'opposer à O, vous devez créer manuellement toutes les méthodes de I qui n'appellez-vous pas trivalement les mêmes méthodes de O.



0
votes

Java et C ++ permettent la programmation procédurale. Qui peut être considéré comme un moins pour certaines personnes.


1 commentaires

En fait, je discuterais que la plupart des codes Java / C ++ sont procéduraux, avec un placage OO sur celui-ci.



1
votes

Java: les types primitifs ne sont pas des objets.


7 commentaires

Ce n'est pas une caractéristique qui manque, c'est une idiosyncrasie design linguistique.


Eh bien, certaines personnes (moi) appellent des bugs manquantes fonctionnalités :)


Vous ne pouvez pas écrire classe myint: public int en C ++. Pas si vous voulez que cela compile, de toute façon.


Vous pouvez y penser comme une hiérarchie multirootée si vous le souhaitez. :)


Au moins depuis Java 1.5, il y a de l'autoboxotage permettant d'intervaller facilement des grandes prises avec des objets entiers. Je suis cependant d'accord que cela empêche Java d'être, dans le sens le plus strict, une langue entièrement orientée objet


@TUOMAS PELKONEN: Tu ne veux pas dire que les insectes sont des fonctionnalités non documentées ?


@Eddie parfois des fonctionnalités non documentées ou parfois non immentées.



15
votes

les mots d'Alan Kay , l'inventeur Le terme "orientation objet":

oop to me signifie seulement la messagerie locale Rétention et protection et cachette de processus d'état et extrême la contraction tardive de toutes choses. Ça peut être fait dans Smalltalk et à Lisp. Là sont peut-être d'autres systèmes dans lesquels C'est possible, mais je ne suis pas au courant de eux.

C ++ échoue évidemment le critère "extrême de liaison tardif" et Java et C ++ échouent au critère "Messagerie", en raison de leur structure de classe / méthode rigide. Si je comprends bien, le concept de Kay considère les méthodes avec un nom spécifique et une signature un moyen pratique d'implémenter des gestionnaires de messages, mais en aucun cas le seul.

Autres déclarations intéressantes du même courriel:

Je n'ai pas aimé la façon dont Simula I ou SIMULA 67 L'héritage a-t-il [...] alors je décidé de quitter l'héritage en tant que Caractéristique intégrée jusqu'à ce que je l'ai compris mieux.

et

Le terme "polymorphisme" a été imposé beaucoup plus tard (je pense par Peter Wegner) Et ce n'est pas tout à fait valable, car il vient vraiment de la nomenclature des fonctions, et je voulais beaucoup plus que des fonctions.


13 commentaires

Java ne échoue-t-il pas également à l'ancien critère?


Quelles autres langues aujourd'hui diriez-vous de satisfaire les critères «extrêmes contraignants tardants»? Toujours seulement SmallTalk et Lisp?


FWFD: Je pense que Ruby serait qualifié de ce compte.


@FrustratedwithFormsDesigner: JavaScript, Ruby par exemple.


Je ne suis pas complètement sûr de ce qu'il veut dire avec ce terme. La reliure de Java est très tardive (les classes sont chargées quand elles sont d'abord référencées), bien que je suppose que l'on pouvait voir cela aussi trop tôt puisqu'il corrige la signature de classe avant qu'elle ne soit réellement utilisée (liens avec l'aspect "Messagerie"). Des langages vraiment dynamiques comme Python, Groovy ou Ruby sont probablement qualifiés.


@FWFD: Avec ce critère, l'objectif-c devrait également compter.


@GF: Objective-C passe ce test?


Un mot important ici est "toutes" choses. Dans SmallTalk-71, par exemple, la syntaxe était en retard. Dans les versions ultérieures de la langue, SmallTalk est devenu beaucoup plus statique, c'est pourquoi Alan Kay voulait recommencer avec une approche complètement nouvelle. En fait, SmallTalk-76 et à l'heure avancée n'étaient plus conçus par lui, et ils n'embodrent pas complètement sa vision de OOP et ne font ni les successeurs, comme Ruby. La langue sur laquelle il travaille actuellement est beaucoup plus lié et dynamique que SmallTalk ou Lisp, où même la définition de «retardée» elle-même est limitée.


@ Jörg w mittag: sonne un peu cool. Quel est le nom de cette langue?


@FWFD: Avec l'OBJC, vous pouvez choisir de manière dynamique quels messages répondent à, transmettre la chaîne d'héritage ou les transmettre à des objets complètement différents - donc à moins que je manque quelque chose, oui.


@FrustratedwithFormsDesigner: Je ne pense pas que cela ait un nom. Vous pouvez trouver des informations sur l'institut de recherche que Alan Kay a fondé: vpri.org aussi, comme Smalltalk, il n'est pas juste que une langue, c'est un système informatique personnel, composé d'un système d'exploitation, de pilotes, d'une interface utilisateur graphique, d'une langue, d'un compilateur, d'une suite de bureau, d'une édition de bureau, de la mise en réseau, de ... et de la chose incroyable: tout cela dans moins de 20 mille lignes de code. Regardez les journaux sur le site Web VPRI ou une des vidéos sur le Web.


Quelle est la complexité "informatique personnelle": SoftwareEngineering.vazexqi.com/2009/10/22/... Ted Talk" Alan Kay partage une idée puissante sur les idées ": Ted.com/Talks/alan_kay_shares_a_powerfe_idea_about_ideas.ht ml Comment faire tout simplement et ce que l'expérience informatique personnelle pourrait être programmée: irbeceminars.intel-research.net/alankay.wmv


Les gens ne reçoivent pas juste comment Oo SmallTalk était. Dans SmallTalk, l'équivalent de nouveau foo () est foo nouveau . Mais ce n'est pas vraiment, en fait, dans Smalltalk, c'est un message envoyé à l'objet Singleton FOO, qui est un objet de classe. Dans SmallTalk, si est un message envoyé à un objet. Java et C # Dites Tout est un objet ... SmallTalk signifie it.



2
votes

Il existe une autre façon de penser à la programmation orientée objet qui diffère du système de classe en Java et C ++. La programmation basée sur les prototypes est utilisée par JavaScript. Si vous voulez regarder la gamme complète de styles OOP, il est probable que la peine de regarder: HTTP : //fr.wikipedia.org/wiki/prototype-based_programming


0 commentaires

3
votes

Les deux font une distinction entre les primitives et les objets, donc ni purement orientés objet.


1 commentaires

@Jrl: Cela n'est en aucun cas "manque de fonctionnalité" et la question indique notamment que l'affiche sait que C ++ et Java ne sont pas pure des langues OO.



8
votes

Sur le dessus de ma tête, je dirais:


0 commentaires

0
votes

Les langues les plus interprétées répondent aux exigences tardives. Dans PerL, vous pouvez extraire du code d'une table de base de données, la jeter dans l'interpréteur, puis instancier des objets de la nouvelle classe que vous venez d'introduire dans le programme.

Est-ce que Python répond pleinement à la définition de OOP de Kay? Je n'ai pas fait assez de travail à Python pour être sûr. Je soupçonne pas, car Python a des «types natifs» qui ne sont pas des objets.


2 commentaires

Quels "types indigènes" parlez-vous? Je ne suis pas lancé dans Python qui n'est pas un objet.


Je me suis trompé. Depuis le tutoriel de DiveintThon.org: "2.4.2. Qu'est-ce qu'un objet? Tout dans Python est un objet, et presque tout a des attributs et des méthodes." Je pensais probablement à des variables régulières, qui n'ont pas d'attributs par défaut. Ils sont toujours des objets. Yay python.



1
votes

La fonctionnalité la plus importante de la programmation orientée objet est l'encapsulation. Cacher les détails de la mise en œuvre est évidemment crucial pour écrire du code maintenu.

en C ++, puisque vous avez des pointeurs non contrôlés, il est possible qu'un objet mal écrit de faire littéralement quelque chose à un autre. Cela signifie que l'encapsulation est cassée et que les bugs sont difficiles à trouver.

Java n'a pas ce problème, mais il manque de const-ness de base. Ce n'est pas strictement une caractéristique théorique axée sur les objets, mais pouvoir déclarer qu'une méthode est en lecture seule ou qu'un objet est en lecture seule, est un activateur de fiabilité fantastique en C ++ qui n'est pas en Java.

Enfin, le mécanisme de modèle de Java est une imitation pâle de C ++. Ne pas pouvoir paramétrer les cours est une énorme perte pour Java.

Parce que Java ne prend pas en charge les pointeurs sur des méthodes et que la réflexion est trop lente, elle force l'utilisation de nombreux petits objets lorsqu'un pointeur de fonction ferait. Certains peuvent considérer qu'une bonne chose.


0 commentaires