我有一堆数据库报表需要实现,未来还会更多,所以对构建可扩展代码和避免重复的逻辑和代码特别感兴趣。我正在用 PHP 实现,但问题更笼统。除了 PHP 之外,请随意发布 Java、C++、C# 等的示例。
我面临的问题是报告的不同之处在于我无法轻松组合所有代码来构建 SQL,甚至更困难的是构建 HTML 输出。例如,一个报告包含一列长文本消息,需要 CSS 样式和启用 Javascript 以使鼠标悬停显示整个消息,而其他报告包含将值转换为百分比的列,或有条件地显示为“更少超过 1%”并累积到“其他”类别。
所以我开始使用策略模式。我的班级模型的一个非常简单的草图可以在这里看到:http: //static.inky.ws/image/4044/ClassDiagram.png
我有一个抽象报告,以及每种报告类型的具体实现。报告有几个属性引用封装的功能(通过接口的具体实现),用于不同的 SQL 构建器和每个报告的输出数据格式。但这开始看起来每个报告的课程太多了。还有另一种更好的方法来解决这个问题吗?
实现上述模型的代码草图:
<?php
abstract class Report {
private $sqlBuilder = null;
private $dataFormatter = null;
}
class ReportOne extends Report {
public function __constructor() {
$this->sqlBuilder = new ReportOneSqlBuilder();
$this->dataFormatter = new ReportOneDataFormatter();
}
class ReportTwo extends Report {
// similar to ReportOne
}
interface SqlBuilder {
}
class ReportOneSqlBuilder implements SqlBuilder {
}
class ReportTwoSqlBuilder implements SqlBuilder {
}
interface DataFormatter {
}
class ReportOneDataFormatter {
}
class ReportTwoDataFormatter {
}
?>
这个想法是保留抽象类中的所有公共代码,以及各种具体子类中的具体差异。写这篇文章时我突然想到我还需要用于 SQL 和数据格式化的抽象类,因为接口不能真正携带任何实现细节。