gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:23:03 28 4
gpt4 key购买 nike

我基本上必须制作一个程序来生成 PDF。 PDF 将有 3 种不同的页面类型:封面、一般页和封底。页眉包含相当多的信息,但封面的页眉和普通页的页眉只有一项不同,然而,一项需要我将其他项目的坐标向下移动。我附上了一张照片来说明我的意思。

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

我正在尝试使用“良好”的设计实践,但我不确定更有效的方法是什么。似乎我不能使用共享公共(public)元素的继承,因为我总是会得到其中一个类中不需要的东西。我考虑过只使用组合并为 header 中的每个元素创建一个类,这样就可以解决问题,但是我会有更多的类,而且它只是一个只包含一个数据成员的类高效的。因此,对于如何使它成为一个更具凝聚力和更明智的设计的任何建议,我将不胜感激。

图片不是我目前拥有的,但它表示我需要的数据似乎耦合得很笨拙,或者我可能只是把它复杂化了。

The general IDea

最佳答案

Front sheet、general sheet 和 back sheet 的共同点是它们 床单。因此,您的类层次结构的一个很好的候选者是:

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

sheet 中,您应该放置所有公共(public)元素,当然还有公共(public)行为(例如 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”关系,因此您将获得非常稳健的设计。

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

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

编辑; 在考虑了内容之后,可能值得再次回到工作表,并问问自己他们的行为到底有多少不同:

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

关于c++ - 用于生成 PDF 的类层次结构的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29021479/

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