Je fais un refactor sur certains codes.Stratégie Modèle avec chaque algorithme ayant une signature de méthode différente
Nous avons une liste d'investisseurs avec des montants affectés à chacun. Le total des montants devrait être égal à un autre total, mais parfois il y a quelques centimes de différence, donc nous utilisons différents algorithmes pour attribuer ces différences à chaque investisseur.
Le code actuel est quelque chose comme ceci:
public void Round(IList<Investors> investors, Enum algorithm, [here goes a list of many parameters]) {
// some checks and logic here - OMMITED FOR BREVITY
// pick method given algorithm Enum
if (algoritm == Enum.Algorithm1) {
SomeStaticClass.Algorithm1(investors, remainders, someParameter1, someParameter2, someParameter3, someParameter4)
} else if (algoritm == Enum.Algorithm2) {
SomeStaticClass.Algorithm2(investors, remainders, someParameter3)
}
}
jusqu'à présent, nous avons seulement deux algorithmes. Je dois mettre en œuvre le troisième. J'ai eu la possibilité de refactoriser les implémentations existantes ainsi que de faire du code générique pour faire cette fonction pour de futurs algorithmes, peut-être personnalisés pour chaque client.
Ma première pensée était "ok, c'est un modèle de stratégie". Mais le problème que je vois est que les deux algorithmes reçoivent une liste de paramètres différente (sauf pour les deux premiers). Et les futurs algorithmes peuvent également recevoir une liste de paramètres différente. La seule chose dans "commun" est la liste des investisseurs et les restes.
Comment puis-je concevoir ceci afin d'avoir une interface plus propre? Je pensais
- établissement d'une interface avec tous les paramètres possibles, et le partager entre toutes les implémentations.
- Utilisation d'un objet avec tous les paramètres possibles en tant que propriétés et utilisation de cet objet générique dans le cadre de l'interface. I aurait 3 paramètres: La liste des investisseurs, l'objet restants, et un objet "paramètres". Mais dans ce cas, j'ai un problème similaire. Instancier chaque objet et remplir les propriétés requises dépend de l'algorithme (sauf si je les ai tous définis). I devrait utiliser une usine (ou quelque chose) pour l'instancier, en utilisant tous les paramètres de l'interface, ai-je raison? Je déplacerais le problème de trop de paramètres à cette «usine» ou peu importe.
- Utilisation d'un objet dynamique au lieu d'un objet de type statique. Toujours présente les mêmes problèmes qu'avant, l'instanciation
J'ai aussi pensé à utiliser le modèle des visiteurs, mais comme je comprends, ce serait le cas si j'avais différents algorithmes pour différentes entités à utiliser, comme, une autre catégorie d'investisseurs. Donc, je ne pense pas que ce soit la bonne approche. Jusqu'ici, celui qui me convainc le plus est le second, même si je suis encore un peu réticent à ce sujet.
Des idées?
Merci
Les paramètres sont-ils tous du même type? Si oui, ils pourraient être placés dans une liste. Un seul algorithme pourrait-il itérer la liste des paramètres et faire ce qui est nécessaire? – brumScouse
Les implémentations actuelles ont des valeurs décimales, ints et enums. Il pourrait y avoir une chaîne si –
Tous les params sont-ils définis indépendamment de l'algorithme? Qu'est-ce qui détermine l'algo? Pourquoi ne pas y mettre de l'algo? Semble un niveau supplémentaire inutile – brumScouse