Je crée un logiciel pour les problèmes de maths. Comme vous le savez, il existe plusieurs types de problèmes mathématiques.Comment améliorer cette conception (motif)?
Dans mon logiciel, certains problèmes proviennent d'un fichier XML (référentiel) et d'autres peuvent être générés par une usine (nombres aléatoires, vous le savez). Par exemple, si je crée des problèmes binaires en tant qu'additions, si je choisis la première option, je peux avoir une classe où obtenir trois fichiers et en choisir quelques-uns. Ou si je choisis le second, je peux générer les problèmes comme aléatoires:
x = random.Next(y, z);
y = random.Next(y, z);
return new BinaryProblem(x, y);
Quelque chose comme ça.
J'ai donc développé ce design en ce moment, je suppose que j'ai construit un modèle de stratégie.
public interface IProblemService
{
IEnumerable<Problem> GetProblems();
}
public class ProblemService : IProblemService
{
private readonly IService service;
public ProblemService(IService service)
{
this.service = service;
}
public IService Service
{
get { return service; }
}
public IEnumerable<Problem> GetProblems()
{
return this.service.GetProblems();
}
}
/* =====================================================*/
CONCRETE CLASSES
public interface IService
{
IEnumerable<Problem> GetProblems();
}
// When I want to generate random problems
public abstract class FactoryService : IService
{
public IEnumerable<Problem> GetProblems();
public abstract Generate();
}
// When I want to get problems through a XML file
public class RepositoryService : IService
{
public abstract IEnumerable<Problem> GetProblems();
void Submit(IEnumerable<Problem> problems);
}
Dans le service que je mis IService en public parce que, je dois savoir si le service est une usine ou un dépôt. Dans le cas où ce sera un référentiel, je soumettrais quelques problèmes au fichier.
Je ne suis pas convaincu de la conception. Je suppose que je suis redondant et ce n'est pas la meilleure façon de le faire. Pouvez-vous donner votre avis ou des idées pour l'améliorer?
EDIT: Ce que je voulais dire la première option est la suivante:
public IEnumerable<Problem> GetProblems()
{
if (model == null)
{
model = new List<Problem>();
// Dummy Data.
model.Add(new SimplifyProblem() { Id = "1", Expression = "8 ÷ 2 x 5 ÷ 10", Result1 = 2 });
model.Add(new SimplifyProblem() { Id = "2", Expression = "20 ÷ 2 x 5 - 2", Result1 = 48 });
model.Add(new SimplifyProblem() { Id = "3", Expression = "15 ÷ 5 + 3", Result1 = 6 });
model.Add(new SimplifyProblem() { Id = "4", Expression = "6 + 4² ÷ 8 - 2", Result1 = 6 });
model.Add(new SimplifyProblem() { Id = "5", Expression = "8 + 2 x 4", Result1 = 40 });
model.Add(new SimplifyProblem() { Id = "6", Expression = "8 + 4 x (5 - 3)", Result1 = 16 });
model.Add(new SimplifyProblem() { Id = "7", Expression = "8 - 3 + 5", Result1 = 10 });
// ...
}
return model;
}
Qu'en est-il considérer problème spécifique (dépôt), un cas particulier de problème aléatoire? Le problème aléatoire nécessite également une description en plus de la partie du nombre aléatoire, non? – nhahtdh
Oui, c'est, comme une configuration .. Je ommite que –
Ce que je voulais dire, c'est que, vous pouvez mettre le problème à travers un "pipeline": premier fetch de XML, puis générer un problème aléatoire. Ensuite, vous n'avez pas besoin de 2 classes pour étendre l'interface IService. – nhahtdh