J'ai un problème pour lequel j'ai déjà essayé d'obtenir de l'aide, mais je n'ai pas réussi à le résoudre à l'époque. J'essaie donc de simplifier le problème maintenant pour voir si je peux obtenir une aide plus concrète, car cela me rend fou
En fait, j'ai une version fonctionnelle (plus complexe) de cette application, qui est un calculateur de coût de projet. Mais comme j'essaie en même temps d'apprendre à mieux concevoir mes applications, j'aimerais avoir des commentaires sur la façon dont je pourrais améliorer cette conception. En fait, j'aimerais surtout avoir des commentaires sur les conditionnelles qui (ici) se répètent à deux endroits. Les suggestions que j'ai reçues auparavant étaient d'utiliser le modèle de stratégie ou le modèle d'usine. Je connais aussi le livre de Martin Fowler qui suggère de refaire du conditionnel avec du polymorphisme. Je comprends ce principe dans son exemple le plus simple. Mais comment puis-je faire l'une ou l'autre de ces choses ici (si elles conviennent) ? De la façon dont je vois les choses, le calcul dépend de deux conditions : 1. De quel type de service s'agit-il, rédaction ou analyse ? 2. Le projet est-il petit, moyen ou grand ? (Veuillez noter qu'il peut y avoir d'autres paramètres, tout aussi différents, tels que "les produits sont-ils nouveaux ou existent-ils déjà ?") Il devrait donc être possible d'ajouter de tels paramètres, mais j'ai essayé de garder l'exemple simple avec seulement deux paramètres afin d'obtenir une aide concrète).
Ainsi, le remaniement avec polymorphisme impliquerait la création d'un certain nombre de sous-classes, que j'ai déjà pour la première condition (type de service), et devrais-je vraiment créer d'autres sous-classes pour la deuxième condition également (taille) ? Qu'est-ce que cela donnerait, AnalysisSmall, AnalysisMedium, AnalysisLarge, WritingSmall, etc ??? Non, je sais que ce n'est pas bon, mais je ne vois pas comment travailler avec ce modèle.
Je vois le même problème pour les suggestions d'utilisation du modèle de stratégie (et le modèle de fabrique tel que je le vois ne serait qu'une aide pour réaliser le polymorphisme ci-dessus). Donc s'il vous plaît, si quelqu'un a des suggestions concrètes sur la meilleure façon de concevoir ces classes, je vous en serais vraiment reconnaissant ! Veuillez également considérer si j'ai choisi les objets correctement ou s'ils ont besoin d'être redessinés. (Les réponses du type "vous devriez considérer le modèle d'usine" ne seront évidemment pas utiles...) J'ai déjà emprunté cette voie et je ne sais pas exactement comment faire dans ce cas).
Voir aussi,
Anders
Le code (très simplifié, ne vous préoccupez pas du fait que j'utilise des chaînes au lieu d'enums, que je n'utilise pas de fichier de configuration pour les données etc, cela sera fait comme nécessaire dans l'application réelle une fois que j'aurai maîtrisé ces problèmes de conception) :
public abstract class Service
{
protected Dictionary<string, int> _hours;
protected const int SMALL = 2;
protected const int MEDIUM = 8;
public int NumberOfProducts { get; set; }
public abstract int GetHours();
}
public class Writing : Service
{
public Writing(int numberOfProducts)
{
NumberOfProducts = numberOfProducts;
_hours = new Dictionary<string, int> { { "small", 125 }, { "medium", 100 }, { "large", 60 } };
}
public override int GetHours()
{
if (NumberOfProducts <= SMALL)
return _hours["small"] * NumberOfProducts;
if (NumberOfProducts <= MEDIUM)
return (_hours["small"] * SMALL) + (_hours["medium"] * (NumberOfProducts - SMALL));
return (_hours["small"] * SMALL) + (_hours["medium"] * (MEDIUM - SMALL))
+ (_hours["large"] * (NumberOfProducts - MEDIUM));
}
}
public class Analysis : Service
{
public Analysis(int numberOfProducts)
{
NumberOfProducts = numberOfProducts;
_hours = new Dictionary<string, int> { { "small", 56 }, { "medium", 104 }, { "large", 200 } };
}
public override int GetHours()
{
if (NumberOfProducts <= SMALL)
return _hours["small"];
if (NumberOfProducts <= MEDIUM)
return _hours["medium"];
return _hours["large"];
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
List<int> quantities = new List<int>();
for (int i = 0; i < 100; i++)
{
quantities.Add(i);
}
comboBoxNumberOfProducts.DataSource = quantities;
}
private void comboBoxNumberOfProducts_SelectedIndexChanged(object sender, EventArgs e)
{
Service writing = new Writing((int) comboBoxNumberOfProducts.SelectedItem);
Service analysis = new Analysis((int) comboBoxNumberOfProducts.SelectedItem);
labelWriterHours.Text = writing.GetHours().ToString();
labelAnalysisHours.Text = analysis.GetHours().ToString();
}
}