设计用于生成PDF的类层次结构

时间:2015-03-12 22:27:46

标签: c++ oop pdf class-design

我基本上必须制作一个能够生成PDF的程序。 PDF将有3种不同的页面类型:封面纸,普通纸和最后封面纸。标题包含大量信息,但封面页和一般页的标题仅相差1个项目,但是,一个项目要求我在坐标中向下移动其他项目。我附上一张照片来说明我的意思。

此类实际服务的唯一目的是保持值以表示将用作目标的矩形,以便在pdf中打印文本。因此,除了构造函数之外,它们实际上不需要任何功能,只需从常量文件中初始化值。

我正在尝试使用“好”的设计实践,但我不确定什么是更有效的方法。我似乎不能使用共享共同元素的继承,因为我总是会在其中一个类中找到我不需要的东西。我想过只使用合成并为标题中的每个元素创建一个类,这样可以解决问题,但是我会有更多的类,它只是一个只保留一个看起来不像的数据成员的类高效。 所以我很欣赏任何有关如何使其成为更具凝聚力和理智的设计的建议。

图片不是我目前所拥有的,但它表示我需要的数据似乎是笨拙地耦合或者我可能只是使这个过于复杂。

The general IDea

1 个答案:

答案 0 :(得分:1)

前片,普通片和背片的共同之处在于它们 ARE 片材。因此,您的类层次结构的良好候选者将是:

class sheet {  .... }; 
class front_sheet : public sheet { ...}; 
class back_sheet : public sheet { ...}; 
class general_sheet : public sheet { ...}; 

sheet中,您应该放置所有常见元素,当然还有常见行为(例如print()save()get_size(),...)。

应该有一个成员函数来计算页面中元素的位置。由于规则取决于页面的类型,它将是sheet()的虚函数,并且正面和背面可以覆盖默认函数。此方法将帮助您轻松管理不同页面的不同布局。

class sheet { 
public: 
    virtual void get_position (int item_no, int& x, int&y) { x=5; y=14*item_no; } 
    ...
}; 

class back_sheet : public sheet { 
public: 
    void get_position (int item_no, int& x, int&y) { x=5; y = (item==5 ? 14:0); } 
    ...
}; 

由于继承确实对应于“is-a”关系,因此您将获得非常强大的设计。

但是,您应该考虑表单的内容。我在这里看到两个主要方向:

  • 您可以管理容器中的项目(例如向量):在循环中组织输出更容易,而不是为每个项目复制粘贴类似的代码行
  • 您应该问问自己这些项目是否可以包含子项目(例如,某个区域可能包含多个子区域,例如带有方框和方框的打印布局)。在这种情况下,我建议使用 composite pattern

编辑; 在考虑了内容之后,可能值得重新回到表格中,并问自己他们的行为有多么不同:

  • 他们在生命周期中是否有不同的行为(获取PDF生成数据的不同方式或动态使用布局?在这种情况下,类层次结构是可以的。
  • 或者,在采用了如上所述的动态结构之后,结果是唯一的区别在于您创建/构建它们的方式?在这种情况下,值得考虑的是毕竟只保留一个工作表类,但使用prototype patternbuilder pattern有三个构造“引擎”。然而,这将是您的应用程序架构的重大转变。