我有一个负责将文件导出到csv的对象。
它运作良好,但我正在寻找重构它的方法。
这个问题与构造函数有关,它带有许多参数,与csv的导出方式有关:
例如,文件名,分隔符等等。
另外,最近我一直在阅读有关依赖注入的内容,但无法确定是否应该这样做:
一个。保持构造函数不变。 B.创建一个新类,该类被传递给构造函数,该构造函数简单地保存文件名的配置值等 C.还有别的什么吗?
这是现有的构造函数(在PHP中)
public function __construct($file,$overwriteExistingFile, $enclosure, $delim, $headerRow)
{
//set all properties here
}
答案 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
,将格式化的输出写入文件。
你这样做的原因是对格式化逻辑进行单元测试,或者你需要进行多种格式化或写入不同类型的输出流。如果代码非常小而且简单,那么您不需要将其分成多个类。