假设我们有一个名为A的类,另一个叫做B. 我们想要一个将A转换为B的转换方法。
从软件架构的角度来看,首选哪一个?
A.export()
B.import()
convert(A, B)
或Convert(A)
或...... 如果语言很重要,我正在使用C ++
答案 0 :(得分:6)
这完全取决于您打算如何使用它,但在许多情况下,最简单的方法是实现转换构造函数:
class B { };
class A
{
A(const B& b) { }
};
B b;
A a = b; //< calls converting constructor
(当然,您可以实现转换构造函数,以便从A
转换为B
答案 1 :(得分:2)
首先,确定它们之间的转换是否真的自然而直观。在这种情况下,您可以使用构造函数或成员函数。
但是,如果连接不太自然,您可能希望使用带有转换方法的单独的ConversionUtils类或类似的东西。您不希望开始在类之间创建太多依赖项或最终实现n * n次转换。
小心使用“转换构造函数”也很重要,因为可以在没有意识到的情况下调用它们。例如,如果我有一个a
和一个b
并且我写了类似a==b
的东西,那么A或B中的构造函数的存在会导致另一个构造函数成功编译警告,以及运行时可能有趣的结果。我强烈建议您在这些情况下制作构造函数explicit
。
答案 2 :(得分:1)
如果我们简要介绍一下Java(只是为了获取信息,即使您使用的是C ++):
假设A类是String,B类是Integer(或Double,Boolean,et c)。 Java库设计者在Integer(“B”)中放置了一个静态方法,称为getInteger(“import”),它接受一个String(“A”)并生成一个Integer(“B”)。那就是你的情况2。
另一方面,在每个类(称为“A”)中都有一个方法toString(“export”)返回一个String(“B”)。这将是你的情况1.
所以即使是这样的基础课,他们也决定采用不同的方式。我想这意味着和@James McNellis说的一样:这取决于。
答案 3 :(得分:0)
您可以重载强制转换运算符,即运算符T(){..返回T值}。你是否应该是另一回事。
答案 4 :(得分:0)
我会使用你的第三个建议。用于转换的单独转换器类。这样你就不会直接将A连接到B或B到A. A和B无论如何都有自己的责任。
转换器类C的责任纯粹是转换。每个班级都要对一件事负责,在我看来这是一件好事。我相信这是SOLID设计原则中的S(单一责任原则)。