依赖注入/配置对象

时间:2012-08-23 19:27:41

标签: oop design-patterns dependency-injection

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

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

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

例如,文件名,分隔符等等。

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

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

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

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

2 个答案:

答案 0 :(得分: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...

通过这种方式,原始类成为生成和文件编写之间交互的协调者,而不必熟悉任何一种活动。我们已经将类提升到更高的抽象级别,简化了它,并将其职责分离到了协作者中。

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

<强>发电机

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

文件编写者

public function __construct($file, $overwriteExistingFile)

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

答案 1 :(得分:0)

我会创建一个CSVFormatter,您可以设置分隔符并单独测试格式。

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

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