Les User Defined Literals
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:
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 ?