gpt4 book ai didi

c# - 如何改进这个设计(模式)?

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:27 24 4
gpt4 key购买 nike

我正在开发一个解决数学问题的软件。如您所知,数学问题有很多种。

在我的软件中,一些问题是从 Xml 文件(存储库)中获取的,而另一些问题可以由工厂生成(随机数,你知道的)。

例如,如果我正在创建二进制问题作为加法,如果我选择第一个选项,我可以有一个类来获取 thre 文件并选择其中的一些。或者,如果我选择第二个,我可以随机生成问题:

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),因为我需要知道该服务是工厂还是存储库。如果这将是一个存储库,我会向该文件提交一些问题。

我不相信这个设计。我想我是多余的,这不是最好的方法。

您能提出改进的意见或想法吗?

编辑:我对第一个选项的意思是:

    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;
}

最佳答案

我不确定为什么你有两个独立的接口(interface),IProblemServiceIService;在我看来,他们似乎在做同样的事情。

我会将随机问题的生成(“工厂”部分)与实际返回问题的类(“存储库”部分)分开:

public interface IProblemRepository {
IEnumerable<Problem> LoadProblems();
}

public class XmlProblemRepository : IProblemRepository {
...
}

public class InMemoryProblemRepository : IProblemRepository {
private readonly IEnumerable<Problem> problems;

public InMemoryProblemRepository(IEnumerable<Problem> problems) {
this.problems = problems;
}

public IEnumerable<Problem> LoadProblems() {
return problems;
}
}

public class RandomProblemFactory {
public IEnumerable<Problem> GenerateProblems(int count) {
...
}
}

然后您可以从 XML 文件加载:

repository = new XmlProblemRepository("problems.xml");

或者您可以使用工厂生成问题并从内存存储库中获取它们:

factory = new RandomProblemFactory();
problems = factory.GenerateProblems(10);
repository = new InMemoryProblemRepository(problems);

关于c# - 如何改进这个设计(模式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11406275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com