所以我需要设计类似的东西:
我有一个电子表格,可以包含多张(可能是不同种类的)。
每张纸都说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细胞的正确结果? 我使用观察者模式来保持公式单元更新,以防其他单元格发生变化。
任何建议都会很棒
答案 0 :(得分:5)
作为一名“设计模式”意味着很少的工程师,我最近有幸与一些计算机科学家一起开展了一个项目(正在进行)。我之前已经实现了他们所谓的“观察者模式”,“工厂”,“反应堆”等所有的东西,但说实话,我发现这是一种考虑设计的无用方式。
您需要的是解决您的问题。想一想:数据流,思考执行路径,思考需要什么导致什么。
不要试图将你的问题转化为教科书解决方案,可能性是,它不太适合,你最终会得到更多的抽象层次而不是有用的,并且会产生代码几个月后回到它时很难理解。
我的两分钱,希望这有用。