Bonjour,
Suite à la présentation de Loïc Joly aux Tech Days 2015, j'ai une interrogation sur les User Defined Literals.
Bien que je trouve la fonctionnalité très utile, je me demande s'il n'y a pas un risque de collision/ambiguïté. Que se passe-t-il si deux bibliothèques tierces définissent le même literal ?
S'il y a bien un risque, alors il devrait exister des règles de bonnes pratique ? Par exemple de ne pas exposer ce genre de literals dans une bibliothèque, ou utiliser un prefix/suffix (ce qui donnerait des literals très long perdant ainsi leurs intérêts).
En fait la fonctionnalité et ses défaut me font penser aux méthodes d'extensions de C#.
Pour ceux qui ne savent pas ce que c'est, voici un exemple :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public static class MyExtentions { public static int Count(this IEnumerable<string> lst) { int i = 0; foreach(string s in lst) ++i; return i; } } // Du coup je peux écrire ça, alors que "Count" n'est pas un membre de IEnumerable<string>. IEnumerable<string> myList = ...; int c = myList.Count();
Cette fonctionnalité pose deux problème :
- Que se passe-t-il si une évolution du framework (ou de la bibliothèque fournissant le type) ajoute une méthode "Count" sur le type ?
- Que se passe-t-il si une bibliothèque fournit des méthodes d'extensions identiques ? (Ce qui est d'ailleurs le cas dans l'exemple donné, puisque c'est que fait LinQ)
Pour répondre à ces problèmes on recommande de ne pas utiliser les méthodes d'extensions, ou, si on ne veut pas s'en passer, de leurs donner un nom évitant toute collision, avec des préfix/suffixes par exemple.
Du coup, est-ce que les user defined literals ont le même genre de problèmes ? Et auquel cas, est-ce qu'il y a des règles/recommandations pour éviter ces problèmes ?
Partager