結果を生成し、特定の形式のファイルに書き込むものを実装しています。
かなり単純ですが、これを動的にしたいと思います。
いくつかのクラスを破棄します。
Data - すべての結果の
基本クラスDataFile - すべてのファイル形式タイプの基本クラス、メソッドを持っていますaddData(Data * data)
ErrorData - Data から派生し、エラーに関するデータを含みます。
InfoData - Data から派生し、一般的な情報を含みます。
XmlFile - DataFile から派生し、XML 形式のデータを含みます。
BinaryFile - DataFile から派生し、バイナリ形式のデータを含みます。
私の質問はこれです:
ErrorDataをXmlFileに書き込む方法の実装はどこに置くのですか?
答えで見たくないもの:
- Data、DataFile、ErrorDataまたはXmlFileへの新しいメンバー関数(これは、新しいDataまたはDataFile派生クラスを追加するたびにそれらを追加する必要があることを意味するため)
- 派生型への型キャスト。
- 一般的な醜さ:)
基本的な C++ の仮想化などは知っているので、特に詳しく説明する必要はありません。
ただし、あいまいさが少なくなるいくつかのコードはありがたいです。
DataWriter基本クラスを作成し、特定のタイプのDataを特定のタイプのDataFileに書き込む方法を知っているクラスを派生させることについていくつか考えましたが、その詳細については少しわかりません。
編集:
例の形でもう少し明確にします。
FormatATxtFileとFormatBTxtFileという 2 つの新しいファイル形式を用意しましょう。
InfoDataオブジェクトがあり、次のパラメーターがあるとします 。
メッセージの行番号:34
メッセージ内容:Hello World
FormatATxtFileに書き込まれたオブジェクトは、ファイル内で次のようになります。
行:34;テキスト:Hello World;タイプ:情報
FormatBTxtFileでは、次のようになります。
@Info,34,ハローワールド
データを別の形式にエクスポートする一種の方法。少なくとも今は、インポートは必要ありません。
これを使用したコードは次のようになります。
DataFile * file = DataFileFactory::createFile(type);
std::vector<Data*> data = generateData();
file->setData(data);
file->writeTo("./FileName"); // correct end is added by DataFile type, ie .txt
編集:
Xml およびバイナリ ファイル形式でどのような問題が発生するかを十分に明確にしていないようです。ごめんなさい。
上記と同じInfoDataオブジェクトを使用して、XmlFile 形式にプッシュしてみましょう。特定の要素の下で、次のようなものが生成される場合があります。
<InfoLog>
<Info Line="34">Hello World</Info>
</InfoLog>
ErrorDataクラスに次のパラメータがあるとします。
エラーの行番号: 56
エラー テキスト: リンク: 致命的なエラー LNK1168
エラー メッセージの前の 10 行: text1...
エラー メッセージの後の 10 行: text2...
何が起こったかのログ全体: text3...
これを XML 形式にプッシュすると、まったく別のものにする必要があります。
<Problems>
<Error>
<TextBefore>text1...</TextBefore>
<Text line = 56>
LINK : fatal error LNK1168
</Text>
<TextAfter>text1...</TextAfter>
</Error>
...
</Problems>
ファイル全体は次のようになります。
<Operation>
<InfoLog>
<Info Line="34">Hello World</Info>
<Info Line="96">Goodbye cruel World</Info>
</InfoLog>
<Problems>
<Error>
<TextBefore>text1...</TextBefore>
<Text line = 56>
LINK : fatal error LNK1168
</Text>
<TextAfter>text1...</TextAfter>
</Error>
<Error>
<TextBefore>sometext</TextBefore>
<Text line = 59>
Out of cheese error
</Text>
<TextAfter>moretext</TextAfter>
</Error>
</Problems>
</Operation>