![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
pseudocode
D'un autre coté, la sémantique de ces opérateurs est assez évidente dans le contexte de l'arithmétique. C'est nettement mois évident si tu remplaces "BigDecimal" par "Triangle" ou "Dog".
![:aie:](https://www.developpez.net/forums/images/smilies/aie.gif)
Tu as raison, mais personnellement je ne suis pas trop d'accord avec le principe qu'il faut bannir des fonctionnalités sous prétexte qu'on peut faire des choses bizarres avec. Je préfère un langage riche dont j'utilise 50% à un langage pauvre dont j'aurai besoin de 110%
.
Je dirai que la redéfinition d'opérateur devrait le plus souvent se borner aux cas où la sémantique est justement comme tu le dis: évidente, ou tout au moins cohérente.
Cependant, j'ai aussi vu dans un mappeur objet-relationnel en C# une approche intéressante pour construire des filtres qui utilisait une syntaxe de ce genre :
1 2 3 4 5 6
|
//filtrer toutes les factures terminées de plus de 100E faites par le client Dupont
Filter filter = new Filter();
filter.addCondition( OrderFields.Price > 100.0 );
filter.addCondition( OrderFields.Status == "commited");
filter.addCondition( OrderFields.Customer == "Dupont"); |
La signature de la méthode était
void addCondition(IPredicate);
Ceci était rendu possible par le fait que la classe des objets Price, Status, Customer avait ses opérateurs <, >, ==, != redéfinis de telle façon à retourner un objet implémentant l'interface IPredicate.
C'était très commode à utiliser et très lisible, même si ça cassait la sémantique réelle des opérateurs, cependant les objets Fields ne servaient qu'à cela et l'utilisateur du code ne créait pas d'instance.
Partager