Imaginez une situation où nous utilisons une bibliothèque qui vous permet de créer des Circle
objets, où vous pouvez spécifier le rayon et le centre du cercle pour le définir. Cependant, pour une raison quelconque, il prend également un flavour
paramètre requis . Maintenant, disons que j'ai vraiment besoin d'utiliser Circle
dans ma propre application, mais pour les besoins de mon application, je peux définir la saveur à Flavours.Cardboard
chaque fois.
Pour "résoudre" cela, je crée ma propre Circle
classe dans un espace de noms différent, qui ne prend radius
et center
comme paramètres, mais a un convertisseur implicite à la Circle
classe de la bibliothèque externe qui crée juste un Circle(this.radius, this.center, Flavours.Cardboard)
objet. Donc, partout où j'ai besoin de l'autre type de Circle
, je laisse la conversion automatique avoir lieu.
Quelles sont les conséquences de la création d'une telle classe? Y a-t-il de meilleures solutions? Cela ferait-il une différence si mon application était une API construite au-dessus de cette bibliothèque externe, destinée à être utilisée par d'autres programmeurs?
la source
MakeCircle
fonction ?makePlayer
où elle-même n'accepte que les accords pour placer le joueur, mais les délègue à un constructeur beaucoup plus complexe.Réponses:
Bien que ce ne soit pas toujours mauvais, il est assez rare que les conversions implicites soient votre meilleure option.
Il y a des problèmes.
En général, il existe de meilleures solutions.
Personnellement, je trouve que le n ° 2 est le plus simple à mettre en œuvre et le moins contraignant pour la conception. Les autres peuvent être bien, compte tenu de la situation et de ce que vous essayez de faire avec ces cours.
La conversion implicite est un dernier recours et ne semble vraiment valoir le coup que lorsque j'ai des foncteurs de style C ++ que j'essaie de créer - des objets de stratégie que je convertis implicitement en types délégués.
la source
Étant donné le scénario que vous décrivez, vous pouvez penser à cela en termes d'application de fonctions partielles.
Un constructeur est une fonction (au moins en théorie; en C #, vous pouvez créer une "fonction d'usine" qui appelle le constructeur):
pour une application partielle, les éléments suivants suffiront:
Vous pouvez maintenant obtenir votre constructeur qui ne nécessite que 2 paramètres:
Alors maintenant, vous avez une fonction d'usine avec vos paramètres souhaités
BTW, c'est clairement équivalent à l'option 2 ci-dessus, juste d'un point de vue plus fonctionnel.
la source