假设没有公共代码,将公共代码移动到基类是不错的做法?

时间:2015-09-28 21:17:50

标签: c++ oop architecture code-reuse

我需要打印定期报告和批量报告。我正在使用podofo库。我计划为每个报告使用单独的类,但每个类将需要下面的一些常用函数(现在在另一个项目的一个类中)。

int CPdfBatchReport::CalculateMaxRowsInEmptyPage(void)
{
    int rows = MaxPageHeight / PDF_TABLE_STANDARD_ROW_HEIGHT;

    // because the first will always be the column header in every page, we substrct 1 to account for that
    rows = rows - 1;

    return rows;
}

// Calculates the max rows in current page. The current page is determined 
// by the current x, y position
int CPdfBatchReport::CalculateMaxRowsInCurrentPage(void)
{
    float AvailablePageHeight =  pPage->GetPageSize().GetHeight() - PDF_BOTTOM_MARGIN - y;

    int rows = AvailablePageHeight / PDF_TABLE_STANDARD_ROW_HEIGHT;

    // because the first will always be the column header in every page, we substrct 1 to account for that
    rows = rows - 1;

    return rows;
}


void CPdfBatchReport::StartPage(void)
{
    x = PDF_LEFT_RIGHT_MARGIN;
    y = PDF_TOP_MARGIN;
}

使用这个公共代码创建基类并在派生类中进行实际打印是否有意义?这是一个好习惯吗?

所以基本上我会让基类说出PrintBase,其中包含上面的函数,以及来自它的两个派生类PrintBatchReportPrintItemReport实际上将使用这些函数。

3 个答案:

答案 0 :(得分:6)

是的,将公共代码放在基类中绝对是个好主意。 "不要重复自己" - 干 - 是一种很好的编程风格。避免复制粘贴编程。

你唯一不希望基类内容的时候就是它是一个接口类。但在这种情况下似乎并非如此。

答案 1 :(得分:1)

  

是的,将公共代码放在基类中绝对是个好主意。

我想扩展@Mats的答案。就您提取到基类中的所有代码遵循单一责任原则而言,这确实是一个好主意。避免盲目地使用继承来进行常见的代码提取。面向对象的编程不止于此。

考虑责任。在许多情况下,你应该支持组合而不是继承。你真的需要任何父类来完成你的任务吗?可能是,现有的功能可以分担几个职责,可以分成几个类,您可以将PrintBase传递到内部或在实例中进行实例化。

答案 2 :(得分:1)

这似乎是一个非常合理的解决方案。在这种情况下,您将继承一个常见的实现,因此我强烈建议私有继承而不是公共。然后,您只需实例化正确的子类即可完成工作。这肯定是比在多个类中复制代码更好的方法。

另一种选择是将公共参数/功能封装到第三个类中,并使每个特定报告按值分类,将各种职责委托给帮助程序类。