2012-07-10 68 views
2

我創造的數學問題的軟件。如你所知,數學問題有很多種。如何改進這種設計(模式)?

在我的軟件,一些問題是從一個XML文件(庫)得到,並且可以由工廠產生anothers(隨機數,你懂的)。

例如,如果我創建二進制問題補充,如果我選擇了第一個選項,我可以有一個類從哪裏得到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,因爲我需要知道服務是工廠還是存儲庫。在這種情況下,我會向文件提交一些問題。

我不相信這個設計。我想我是多餘的,這不是最好的辦法。

你可以給你opinnion或想法,以改善它?

編輯: 我的第一個選項的意思是:

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

如何考慮的具體問題(資料庫)的特殊情況下,隨機問題?隨機問題除了隨機數部分還需要描述,對嗎? – nhahtdh 2012-07-10 03:49:10

+0

是的,它就像一個配置..我省略了 – 2012-07-10 03:53:59

+0

我的意思是說,你可以通過一個「管道」來解決問題:首先從XML中獲取數據,然後生成隨機問題。那麼你不需要擴展IService接口的2個類。 – nhahtdh 2012-07-10 03:56:41

回答

1

我不知道爲什麼你有兩個單獨的接口,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); 
+0

無論如何,我已經添加了一些關於存儲庫選項的信息(第一個) – 2012-07-10 04:04:07

+0

請注意,我對「存儲庫」的使用有所不同。 'IProblemRepository'更像你最初的'IProblemService'。 – casablanca 2012-07-10 04:05:59

+0

我喜歡這個想法,我計劃將這個想法存儲在一個容器中,而我幾乎可以用這個設計來實現這個想法。我也可以完成..另外,我聲明瞭像XmlProblemRep ..和FactoryPro這樣的抽象類..抽象方法。 – 2012-07-10 04:30:28

0

它看起來像你想要有不同的問題來源(Xml文件,數據庫,內存),並使你的代碼持久化無知。如果是的話,我就不會實現工廠類IService接口。只保留工廠用於隨機生成問題。我想補充Submit到接口:

public interface IService 
{ 
    IEnumerable<Problem> GetProblems(); 
    void Submit(IEnumerable<Problem>); 
} 

XmlRepositoryService類將獲得/數據保存從/ XML文件:

public class XmlRepositoryService : IService 
{ 
    public IEnumerable<Problem> GetProblems() 
    { 
     //get the problems from the Xml file 
    } 

    public void Submit(IEnumerable<Problem> problems) 
    { 
     //save problems to the xml file 
    } 
} 

在內存中的存儲庫類將存儲的問題的列表:

public class MemoryRepositoryService : IService 
{ 
    private List<Problem> problemList = new List<Problem>(); 

    public IEnumerable<Problem> GetProblems() 
    { 
     return problemList; 
    } 

    public void Submit(IEnumerable<Problem> problems) 
    { 
     problemList.AddRange(problems.ToList()); 
    } 
} 

ProblemFactory類將只具有GenerateRandom方法:

public class ProblemFactory 
{ 
    public static Problem GenerateRandom() 
    { 
    var x = random.Next(y, z); 
    var y = random.Next(y, z); 

    return new BinaryProblem(x, y); 
    } 
} 

要使用它,只是實例化一個repository類,產生一個問題,它添加到列表中,並提交清單到倉庫:

var problems = new List<Problems>(); 
var problem = ProblemFactory.GenerateRandom(); 
problems.Add(problem); 
var repository = new MemoryRepositoryService(); //or XmlRepositoryService 
repository.Submit(problems);