设计问题 - 观察者,工厂,组成等

时间:2010-01-03 13:01:18

标签: c++ design-patterns class oop

所以我需要设计类似的东西:

我有一个电子表格,可以包含多张(可能是不同种类的)。

每张纸都说1A-9Z细胞。

在每个单元格中我可以有一个上面的: 串, 数, 公式 - 这意味着单元格得到像+, - ,/,*等...和单元格数字的操作, 在单元格中我有操作的结果。

我需要设计类,所以将来我可以添加其他类型的单元格(除了字符串/数字/公式)并在公式中添加不同类型的操作 - 所有操作都很简单。

你将如何设计它?

我虽然喜欢这样的事情:

class SpreadSheet
{
  private:

  vector<Isheet> sheets;

  public:

  write(Isheet sheet,int CellNum,ICell value);
  GetValue(Isheet sheet,int CellNum,ICell value);
  AddSheet(ISheet sheet);

 };


  class Isheet
  {
    vector<ICell> cells; // can i do something like that ? cause ICell is a template      
  };

 template<class T>
 class ICell
 {

   Vector<Iobserver> observers;

   public:
    T GetValue() {return m_value;};
    SetValue(T val) {m_value=val;};
    AddObserver(Iobserver obs);
    NotifyAll();
    GetPos() {return m_pos;};


   private:
    T m_value;
    int m_pos;

   };


  class CInt : public ICell<int>
 {

 };

 class CString : public ICell<std:string>
 {

 };

 class CFormula : public ICell<int>, Iobserver
 {

 };


 class Iobserver
 {
    Update(int pos);
 };

无论如何,我真的不确定我应该在哪里创建单元格混凝土类(CInt,Cstring,CFormula),我应该使用某种工厂吗?在哪里放工厂?在ISheet中? 而我主要担心的是,我应该在哪里计算出CFormula细胞的正确结果? 我使用观察者模式来保持公式单元更新,以防其他单元格发生变化。

任何建议都会很棒

1 个答案:

答案 0 :(得分:5)

作为一名“设计模式”意味着很少的工程师,我最近有幸与一些计算机科学家一起开展了一个项目(正在进行)。我之前已经实现了他们所谓的“观察者模式”,“工厂”,“反应堆”等所有的东西,但说实话,我发现这是一种考虑设计的无用方式。

您需要的是解决您的问题。想一想:数据流,思考执行路径,思考需要什么导致什么。

不要试图将你的问题转化为教科书解决方案,可能性是,它不太适合,你最终会得到更多的抽象层次而不是有用的,并且会产生代码几个月后回到它时很难理解。

我的两分钱,希望这有用。