153 votes

Ce qui rend la Scala ' surcharge de « bon », mais C++ d’opérateur s ' s « mauvais » ?

La surcharge d'opérateur en C++ est considéré par beaucoup comme Une Mauvaise Chose(tm), et une erreur de ne pas être répétée dans de nouveaux langages. Certes, il est un élément qui a chuté lors de la conception de Java.

Maintenant que j'ai commencé à lire sur la Scala, je trouve qu'il a ce qui ressemble beaucoup à la surcharge d'opérateur (même si, techniquement, il n'a pas la surcharge d'opérateur car il n'a pas les opérateurs, seules les fonctions). Cependant, il ne semble pas être qualitativement différente de la surcharge d'opérateur en C++, où je me rappelle que les opérateurs sont définis comme des fonctions spéciales.

Donc ma question est ce qui rend l'idée de définir le "+" en Scala une meilleure idée de ce qu'il était en C++?

240voto

James Iry Points 14192

C++ hérite true blue opérateurs de C. je veux dire Par là que le "+" en 6 + 4 est très spécial. Vous ne pouvez pas, par exemple, d'avoir un pointeur vers cette fonction.

Scala en revanche ne pas avoir opérateurs de cette façon. Il a juste une grande flexibilité dans la définition des noms de méthode, plus un peu de construit dans l'ordre de priorité pour les non-mot symboles. Donc, techniquement, Scala n'a pas la surcharge d'opérateur.

Tout ce que vous voulez l'appeler, la surcharge d'opérateur n'est pas mauvais en soi, même en C++. Le problème est quand les mauvais programmeurs en abuser. Mais franchement, je suis d'avis que la prise de distance des programmeurs capacité de l'abus de la surcharge d'opérateur ne prend pas en mettre une goutte dans le seau de la fixation de toutes les choses que les programmeurs peuvent les abus. La vraie réponse est de mentorat. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html

Néanmoins, il existe des différences entre le C++de la surcharge d'opérateur et de la Scala, à la méthode flexible de nommage qui, à mon humble avis, faire de la Scala à la fois moins toxicomanogènes et plus toxicomanogènes.

En C++, la seule manière d'aller au-fix de la notation est de l'utilisation des opérateurs. Sinon, vous devez utiliser l'objet.message(argument) ou un pointeur->message vocal(argument) ou la fonction(argument1, argument2). Donc, si vous voulez un certain DSLish style à votre code puis, il y a de la pression à utiliser des opérateurs.

En Scala, vous pouvez obtenir la notation infixe avec n'importe quel message envoyer. "l'objet du message, l'argument est parfaitement ok, ce qui signifie que vous n'avez pas besoin d'utiliser des symboles verbaux juste pour obtenir la notation infixe.

C++ surcharge d'opérateur est limitée essentiellement à la C les opérateurs. Combiné avec la limitation que seuls les opérateurs peuvent être utilisés infix qui met la pression sur les gens pour essayer de la carte un large éventail de sans rapport avec les concepts sur un nombre relativement restreint de symboles "+" et ">>"

Scala permet une vaste gamme de validité de la non-parole des symboles comme des noms de méthode. Par exemple, j'ai intégré Prolog-ish LIS où vous pouvez écrire

female('jane)!         // jane is female
parent('jane,'john)!   // jane is john's parent
parent('jane, 'wendy)! // jane is wendy's parent

mother('Mother, 'Child) :- parent('Mother, 'Child) & female('Mother) //'// a mother of a child is the child's parent and is female

mother('X, 'john)?  // find john's mother
mother('jane, 'X)?  // find's all of jane's children

L' :-, !, ?, et et symboles sont définis comme les méthodes ordinaires. En C++ seulement et serait valide donc une tentative de carte ce LIS en C++ aurait besoin d'un peu de symboles déjà évoquer des concepts très différents.

Bien sûr, cela ouvre également la Scala à un autre type d'abus. En Scala, vous pouvez nommer une méthode $!&^% si vous le souhaitez.

Pour d'autres langues, comme Scala, sont flexibles dans l'utilisation de la non-parole de la fonction et de la méthode des noms de voir Smalltalk où, comme Scala, tous les "opérateur" est juste une autre méthode et Haskell qui permet au programmeur de définir la priorité et la fixité de manière flexible des fonctions nommées.

41voto

Faisal Vali Points 10048

La surcharge d'opérateur n'a jamais été universellement pensé pour être une mauvaise idée en C++, seulement les abus de la surcharge d'opérateur a été pensé pour être une mauvaise idée. On n'a pas vraiment besoin de la surcharge d'opérateur dans une langue, car ils peuvent être simulés avec plus détaillé des appels de fonction, de toute façon. En évitant la surcharge d'opérateur en Java fait de la mise en œuvre et spécification de Java un peu plus simple, et il a obligé les programmeurs de ne pas abuser des opérateurs. Il y a eu un débat dans la communauté de Java sur l'introduction de la surcharge d'opérateur.

Les avantages et les inconvénients de la surcharge d'opérateur en Scala sont les mêmes qu'en C++, vous pouvez écrire plus de code naturel si vous utilisez la surcharge d'opérateur de façon appropriée et la plus énigmatique, d'obfuscation de code si vous ne le faites pas.

Pour info: les Opérateurs ne sont pas définis comme des fonctions spéciales en C++, ils se comportent comme n'importe quelle autre fonction, bien qu'il existe quelques différences dans la recherche d'un nom, si ils ont besoin d'être membre de fonctions, et le fait qu'ils peuvent être appelés de deux façons: 1) l'opérateur de la syntaxe, et 2) de l'opérateur-la fonction de l'id de la syntaxe.

18voto

jmanning2k Points 3354

Cet article - "L'Héritage Positif de C++ et de Java" - répond à votre question directement.

"C++ dispose à la fois de l'allocation de pile et le tas de l'allocation et vous devez surcharger vos opérateurs de gérer toutes les situations et ne pas provoquer des fuites de mémoire. Difficile, en effet. Java, cependant, a un stockage unique mécanisme d'allocation et d'un ramasse-miettes, ce qui rend la surcharge d'opérateur trivial" ...

Java tort (selon l'auteur) omis de surcharge d'opérateur parce que c'était compliqué en C++, mais il a oublié pourquoi (ou ne s'est pas rendu compte qu'il ne s'applique pas à Java).

Heureusement, un langage de haut niveau comme la Scala de donner aux développeurs options, bien que toujours en cours d'exécution sur la même JVM.

9voto

dan04 Points 33306

Il n’y a rien de mal avec la surcharge d’opérateur. En fait, il y a quelque chose de mal à pas avoir de surcharge d’opérateur pour les types numériques. (Jetez un oeil à un code de Java qui utilise BigInteger et BigDecimal.)

C++ a une tradition d’abuser de la fonction, cependant. Un exemple souvent cité est que les opérateurs de décalage de bits sont surchargées pour effectuer e/s.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X