Я реализую вещь, которая генерирует результаты и записывает их в файл определенного формата.
Довольно просто, но я хочу, чтобы это было динамически.
Я скину внизнесколько классов.
Данные - базовый класс для всех результатов
DataFile - базовый класс для всехТипы форматов файлов, имеет метод addData(Data * data)
ErrorData - выводится из данных, содержит данные об ошибке.
InfoData - получено из Data, содержит общую информацию.
XmlFile - получено из DataFile, содержит данные в формате XML.
BinaryFile - полученный из DataFile, содержит данные в двоичном формате.
У меня такой вопрос:
Куда я помещаю реализацию о том, как писать ErrorData в XmlFile ?
Что мне не нравится видеть в ответе:
- Новый мфункция ember в данные , файл данных , ErrorData или XmlFile (потому что это означает, что мне нужно добавлять их каждый раз, когда я добавляю новые данных или DataFile производный класс)
- Приведение типов к производным типам.
- Общее уродство:)
Я знаю свою базовую виртуализацию C ++ и все, не нужно быть сверхспецифичным.
Хотя я ценю несколько фрагментов кода, они оставляют меньше неопределенности.
У меня были некоторые мысли по поводу создания базового класса DataWriter инаследовать классы от того, кто знает, как записать Данные определенного типа в DataFile определенного типа, но янемного неуверен в деталях этого.
РЕДАКТИРОВАТЬ:
Я поясню немного больше в форме примера.
Давайте иметь 2 новых формата файлов, FormatATxtFile и FormatBTxtFile .
Предположим, что у нас есть объект InfoData и он имеетпараметры:
Номер строки сообщения: 34
Содержание сообщения: Hello World
Объект, записанный в FormatATxtFile , в файле выглядит так:
Строка: 34; Txt: Hello World; Тип: Info
И в FormatBTxtFile это будет выглядеть примерно так:
@ Info, 34, Hello World
Это своего рода способ экспорта данных в другой формат.Мне не нужно импортировать, по крайней мере, сейчас.
Как будет выглядеть код, использующий это:
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
Текст ошибки: LINK: фатальная ошибка 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>