En passant en revue du code, j'ai remarqué qu'il était possible de le changer pour qu'il utilise des génériques. Le code (obscurci) ressemble à:
public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets)
{
var someProperty = typeOfTarget.GetProperty(possibleTargets[0]);
...
}
Ce code pourrait être remplacé par des génériques, comme ceci:
public void DoAllTheThings<T>(object[] possibleTargets[0])
{
var someProperty = type(T).getProperty(possibleTargets[0]);
...
}
En recherchant les avantages et les inconvénients de cette approche, j'ai trouvé un terme appelé abus générique . Voir:
- Protéger les non-initiés (développeurs) des génériques
- https://stackoverflow.com/questions/28203199/is-this-an-abuse-of-generics
- https://codereview.stackexchange.com/q/60695
Ma question est en deux parties:
- Y at-il des avantages à passer à des génériques comme celui-ci? (Performance? Lisibilité?)
- Qu'est-ce que l'abus de génériques? Et l'utilisation d'un générique à chaque fois qu'il y a un paramètre de type est-elle un abus ?
Réponses:
Lorsque les génériques sont correctement appliqués, ils suppriment le code au lieu de le réorganiser. Principalement, le code que les génériques sont les mieux à même de supprimer est la typographie, la réflexion et le typage dynamique. Par conséquent, l’abus des génériques pourrait être défini de manière vague comme la création d’un code générique sans réduction significative de la conversion de type, de la réflexion ou du typage dynamique par rapport à une implémentation non générique.
En ce qui concerne votre exemple, je me attends à une utilisation appropriée des médicaments génériques pour changer l'
object[]
unT[]
ou similaire, et éviterType
outype
tout à fait. Cela nécessitera peut-être une refactorisation importante ailleurs, mais si l'utilisation de génériques est appropriée dans ce cas, son utilisation devrait être plus simple lorsque vous avez terminé.la source
object[]
pourT[]
.J'utiliserais la règle «non-nonsense»: les génériques, comme toutes les autres constructions de programmation, existent pour résoudre un problème . S'il n'y a pas de problème à résoudre pour les génériques, les utiliser est un abus.
Dans le cas spécifique des génériques, ils existent généralement pour résumer les types concrets, ce qui permet aux implémentations de code pour les différents types d'être regroupées dans un modèle générique (ou quel que soit le langage utilisé par votre langage). Supposons maintenant que votre code utilise un type
Foo
. Vous pouvez remplacer ce type par un génériqueT
, mais si vous n’avez besoin que de ce codeFoo
, il n’ya tout simplement aucun autre code avec lequel vous pouvez le plier. Ainsi, il n’ya pas de problème à résoudre, le simple fait d’ajouter le générique ne servirait donc qu’à réduire la lisibilité.Par conséquent, je suggérerais d'écrire simplement le code sans utiliser de génériques, jusqu'à ce que vous voyiez la nécessité de les introduire (car vous avez besoin d'une seconde instanciation). Alors, et alors seulement, le temps est venu de refactoriser le code pour utiliser des génériques. Toute utilisation avant ce point est un abus à mes yeux.
Cela semble un peu trop pédant, alors laissez-moi vous rappeler:
Il n’ya pas de règle sans exception en programmation. Cette règle inclus.
la source
Le code semble étrange. Mais si nous l’appelons, il semble plus pratique de spécifier le type en tant que générique.
https://stackoverflow.com/questions/10955579/passing-just-a-type-as-a-parameter-in-c-sharp
Personnellement, je n'aime pas ces contorsions qui rendent le code d'appel joli. par exemple, tout ce qui est "fluent" et les méthodes d'extension.
Mais vous devez admettre qu'il a un public populaire. même Microsoft l'utiliser dans l'unité par exemple
la source
Pour moi, on dirait que vous êtes sur le bon chemin ici, mais que vous n'avez pas fini le travail.
Avez-vous envisagé de changer le
object[]
paramètreFunc<T,object>[]
pour la prochaine étape?la source