web-dev-qa-db-fra.com

Quels sont les avantages d'un langage orienté objet «pur» par rapport à un langage orienté objet non pur?

Mon premier langage de programmation est C++. C++ est un langage de programmation multi-paradigmes. L'un des paradigmes pris en charge par C++ est la programmation orientée objet. Je veux dire que j'ai une idée générale et les avantages de OOP comme illustré en C++.

J'ai récemment commencé à créer un projet dans Android Studio. L'une des langues Android Studio prend en charge Java. Java is un langage de programmation orienté objet "pur". Pure est entre guillemets effrayants en raison de Java supportant les types de données primitifs.

Ma question est de savoir pourquoi Java go full OOP alors que C++ ne ressent pas le besoin d'aller dans cette mesure. L'approche de C++ semble plus "raisonnable" pour Cependant, je suis sûr qu'il y a des raisons spécifiques pour lesquelles Java le fait comme il le fait. Lorsque tout est un objet, tout doit être déclaré public, protégé, etc. Tout est utilisé librement.

3
FernandoH-G

Java est en effet plus orienté objet que C++:

  • Le modèle objet de Java est indépendant du modèle de mémoire sous-jacent.
  • Certaines fonctionnalités orientées objet C++ nécessitent une compréhension du modèle de mémoire sous-jacent; par exemple, pour créer/supprimer dynamiquement des objets, vous avez besoin de pointeurs ou de pointeurs intelligents et ainsi faire la différence entre l'adresse de l'objet et l'objet lui-même. De plus, en C++, vous pouvez créer du code indépendant de n'importe quelle classe.

Mais soyons provocateurs: Java n'est pas un langage orienté objet pur:

  • tout n'est pas un objet en Java: les types de base tels que int ne sont pas traités comme des objets et n'héritent pas de Object. Vous devez utiliser un wrapper de classe Integer pour y parvenir.
  • méthodes statiques peut être défini dans une classe mais n'est lié à aucun objet particulier. Cette fonctionnalité fait de Java plus un langage orienté classe qu'un langage orienté objet.

L'orientation accrue de l'objet présente deux avantages:

  • portabilité accrue (c'est-à-dire que vous vous appuyez uniquement sur un modèle d'objet abstrait).
  • cohérence des constructions du langage (tout est un objet).

Je ne sais pas s'il existe de nombreuses langues pures OO là-bas. Smalltalk serait un bon candidat. Cependant, cela nécessite un changement de paradigme, ce qui rend même certains simples code difficile à lire.

En fin de compte, OO est comme l'oxygène (O₂): à dose raisonnable, il fait de l'air frais et permet une vie complexe; en concentration pure, il prive l'air d'autres choses utiles. Cela contribue certainement à expliquer la dominance actuelle des langages multi-paradigmes.

5
Christophe

L'avantage d'une langue "pure" de tout paradigme est que vous (idéalement) n'avez pas à vous rappeler de suivre le paradigme car la langue ne vous permettra pas de faire quoi que ce soit si vous ne le faites pas.

Par exemple, Java est un langage structurel "pur". Ce qui est juste une façon élégante de dire qu'il n'a pas de goto. Au lieu de cela, vous avez while, do while, for, break et continue. None dont vous avez besoin si vous avez obtenu. Ce sont les choses que vous ne pouvez pas faire dans une langue qui le rendent "pur".

Alors qu'est-ce que c'est pour les langages orientés objet? Primitives. Si vous voulez que votre langage soit purement orienté objet, tout doit être un objet. Pas de primitives.

Si vous trouvez cela insatisfaisant, je ne vous en veux pas. La plus grande caractéristique de la POO est le passage de messages polymorphes mais le manque de primitives est ce que les langues doivent être considérées OO 'pur' .

Malheureusement, cela signifie que même les langues `` pures '' OOP ne vous forcent pas à utiliser les meilleures fonctionnalités d'OO. Elles vous obligent uniquement à utiliser le OOP = fonctionnalités qui peuvent être forcées.

6
candied_orange

Une considération clé dans la conception du langage est la complexité. Combien de fonctionnalités possède la langue? Est-ce difficile à apprendre? En réduisant le nombre de fonctionnalités, vous rendez généralement la langue plus facile à apprendre.

En suivant un seul paradigme, vous pouvez supprimer des fonctionnalités.

Ensuite, il y a la conception du programme. En tant que programmeur, vous devez réfléchir à la façon de structurer votre programme. Si votre langage de programmation vous donne beaucoup de flexibilité dans la structure, vous pouvez arriver à une meilleure conception à la fin, mais vous devez également réfléchir à plus de possibilités. Travailler dans un langage plus contraint semble souvent plus productif (et pourrait même l'être), car même si votre conception n'est pas aussi optimale que celle que vous auriez pu obtenir dans un langage plus flexible, vous y êtes arrivé plus rapidement.

En suivant un seul paradigme, vous rationalisez le processus de conception d'application.

Par conséquent, s'il y a moins de possibilités de conception d'application, si vous rencontrez une base de code inconnue, il devrait être plus facile de comprendre sa conception, car il n'y a que peu de possibilités. Cela facilite l'introduction de nouveaux programmeurs dans l'équipe de développement.

En suivant un seul paradigme, vous réduisez l'espace de conception, facilitant ainsi l'intégration de nouveaux membres de l'équipe.

2
Sebastian Redl

Dans le cas de Java et C++, C++ était basé sur C, donc tout le matériel non-OO était là gratuitement. Le supprimer aurait coûté du temps et de l'argent, et aurait fait beaucoup plus difficile de déplacer un logiciel de C vers C++.

Dans le cas de Java, ils auraient dû ajouter du travail supplémentaire dans le langage, le compilateur, la machine virtuelle, pour faire fonctionner le code non OO. JNI est une sorte de non-OO et cela n'a été ajouté que plus tard.

0
gnasher729