0

我有一个负责将文件导出到 csv 的对象。

它运作良好,但我正在寻找重构它的方法。

这个问题与构造函数有关,它带有许多参数,与如何导出 csv 有关:

例如文件名、分隔符等。

另外,最近我一直在阅读有关依赖注入的内容,但无法确定是否应该这样做:

A. 保持构造函数不变。B. 创建一个新类,该类传递给构造函数,该构造函数简单地保存文件名等的配置值 C. 完全是别的吗?

这是现有的构造函数(在 PHP 中)

    public function __construct($file,$overwriteExistingFile, $enclosure, $delim, $headerRow)
    {
        //set all properties here
    }
4

2 回答 2

2

这些值中的每一个都代表作为某个过程输入的数据。$enclosure$delimiter$headerRow与生成 CSV 内容有关,而$file$overwriteExistingFile与将内容持久化到磁盘有关。

DI 风格重构的一个标志是识别各种职责(生成、持久化)并将它们封装自己的类型中。这将重构从“我如何最好地获取这个类的值 ” 到“我如何这个类中删除这些值的知识?”

为了回答这个问题,我们将定义两个新概念,每个概念都有一个职责,并将它们传递给现有的构造函数:

public function __construct($csvGenerator, $csvFileWriter)
{
    ...save dependencies...
}

...at some point, generate the CSV content and pass it to the file writer...

通过这种方式,原始类成为生成和文件写入之间交互的协调者,而无需对任何一个活动都有深入的了解。我们将这个类提升到了更高的抽象层次,简化了它,并将它的职责隔离到了它的协作者中。

现在,您将定义两个类,并使用相关参数构造它们:

发电机

public function __construct($enclosure, $delimiter, $headerRow)

文件编写器

public function __construct($file, $overwriteExistingFile)

有了这些元素,您可以通过创建生成器,然后是文件编写器,然后将两者传递给协调器来将它们组合在一起。

于 2012-08-23T19:57:55.623 回答
0

我将创建一个CSVFormatter您可以设置分隔符并独立对格式进行单元测试的工具。

将格式化程序注入到CSVWriter将格式化输出写入文件的 a 中。

您这样做的原因是对格式化逻辑进行单元测试,或者如果您需要进行多种格式化或写入不同类型的输出流。如果代码非常小而且简单,那么您不需要将它分成多个类。

于 2012-08-23T19:31:38.060 回答