gpt4 book ai didi

c++ - 正确放置 "toCSV"函数 : In each object, 还是放在通用类中?

转载 作者:行者123 更新时间:2023-11-30 05:26:18 25 4
gpt4 key购买 nike

有一组 classA 对象,包含几个数据字段,在每个 classA 对象内部,有一组 classB 对象,包含额外的数据字段。

有时我想生成一个 CSV 文件。

我最初的方法是在 classA 和 classB 中实现一个 .toCSV() 并在 main.cpp 中执行以下操作:

string completecsv;
foreach(classA ca, setOfClassA)
completecsv.append(ca.toCSV());

在 classA.toCSV() 里面

string csv;
csv.append(field1);
csv.append(field2);
csv.append(...);
foreach(classB cb, setOfClassB)
csv.append(cb.toCSV());

return csv;

最后在 classB.toCSV() 中

string csv;
csv.append(field1);
csv.append(field2);
csv.append(...);

return csv;

现在,我的另一种方法是创建一个名为 OutputManager 之类的类,它负责与 CSV 生成有关的所有事情,使 MVC 模式更清晰地分开。

关于这两种方法有什么想法吗?

非常感谢。

最佳答案

如果 classAclassB 的许多属性都可以包含在报告中,无论报告格式如何(CSV、XML、Json 等)。 ), 那么听起来classAclassB 实际上是没有太多逻辑的数据类。

如果是这种情况,我会将报告生成与它们分开,以便在需要时轻松地使用其他输出格式扩展报告机制。

为了满足分层输出格式(如 XML 或 Json),让您从中读取属性的类型也公开“子”属性可能是有意义的,这样它就可以循环并递归应用。

对于获得输出的每种类型,它可以公开其“输出表”数据的名称-值集合,OutputManager 然后选择要处理的内容。

像这样,OutputManager 将获取“根”IOutputtable(在本例中为 classB)并循环其名称-values,然后递归地对其子项执行相同的操作。

interface IOutputtable
{
NameValueCollection Items { get; }
IEnumerable<IOutputtable> Children { get; }
}

class A : IOutputtable
{
private int _baz;

public NameValueCollection Items {
get {
return new NameValueCollection() {
{ "baz", _baz.ToString() }
};
}
}

public IEnumerable<IOutputtable> Children {
get {
return Enumerable.Empty<IOutputtable>();
}
}
}

class B : IOutputtable
{
private int _foo;
private string _bar;
private List<A> _as = new List<A>();

public NameValueCollection Items {
get {
return new NameValueCollection() {
{ "foo", _foo.ToString() },
{ "bar", _bar }
};
}
}

IEnumerable<IOutputtable> Children {
get { return _as; }
}
}

关于c++ - 正确放置 "toCSV"函数 : In each object, 还是放在通用类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37853719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com