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スタイルのリファクタリングの特徴は、さまざまな責任(生成、永続化)を識別し、それぞれを独自のタイプにカプセル化することです。これにより、リファクタリングが「このクラスの値取得するにはどうすればよいですか?」からシフトします。「このクラスからこれらの値の知識を削除するにはどうすればよいですか?」

これに答えるために、2つの新しい概念を定義し、それぞれが1つの責任を負い、それらを既存のコンストラクターに渡します。

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

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

このようにして、元のクラスは、どちらのアクティビティについても深い知識がなくても、生成とファイル書き込みの間の相互作用のオーケストレーターになります。クラスをより高いレベルの抽象化に昇格させ、クラスを簡素化するとともに、その責任を共同作業者に分離しました。

ここで、2つの新しいクラスを定義し、関連するパラメーターを使用してそれらを構築します。

発生器

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

ファイルライター

public function __construct($file, $overwriteExistingFile)

これらの要素を配置したら、ジェネレーターを作成し、次にファイルライターを作成し、両方をオーケストレーターに渡すことで、それらを一緒に構成できます。

于 2012-08-23T19:57:55.623 に答える
0

CSVFormatterデリミネーターをセットアップして、フォーマットを個別に単体テストできるものを作成します。

CSVWriterフォーマットされた出力をファイルに書き込むにフォーマッタを挿入します。

これを行う理由は、フォーマットロジックを単体テストするため、または複数の種類のフォーマットを実行する必要がある場合、または異なる種類の出力ストリームに書き込む必要がある場合です。コードが非常に小さくて単純な場合は、コードを複数のクラスに分割する必要はありません。

于 2012-08-23T19:31:38.060 に答える