私は数学の問題のためのソフトウェアを作成しています。ご存知のように、数学の問題には多くの種類があります。
私のソフトウェアでは、いくつかの問題はXmlファイル(リポジトリ)から取得され、別の問題はファクトリによって生成される可能性があります(乱数、ご存知のとおり)。
たとえば、バイナリの問題を追加として作成している場合、最初のオプションを選択すると、ファイルを取得してそれらのいくつかを選択するクラスを作成できます。または、2番目のものを選択した場合、問題をランダムに生成できます。
x = random.Next(y, z);
y = random.Next(y, z);
return new BinaryProblem(x, y);
そんな感じ。
だから私は今このデザインを開発しました、私は戦略パターンを構築したと思います。
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);
}
サービスでは、サービスがファクトリであるかリポジトリであるかを知る必要があるため、IServiceをパブリックとして配置しました。これがリポジトリになる場合は、ファイルにいくつかの問題を送信します。
私はそのデザインに確信が持てません。私は冗長だと思いますが、これは最善の方法ではありません。
あなたはそれを改善するためにあなたの意見やアイデアを与えることができますか?
編集:私が最初のオプションで意味したのは:
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;
}