在这种情况下我应该如何重构我的代码?

时间:2010-01-29 21:15:36

标签: qt refactoring

我目前正在使用Qt的QTextStream来读取许多不同类型(读取:不同扩展名)的文本文件。我创建的每个“FileReader”类开始都有类似的模式,需要readLine(),如下所示:

// Get the line's first word as float where each word is delimited by a comma 
fileData.readLine().split(",")[0].toFloat();

你可以想象我的程序中有数十行。

此外,toFloat()可能会失败(例如,读取的值不能转换为float),所以我打算像这样修改上面的行:

// Get the line's first word as float where each word is delimited by a comma 
bool convertible;
fileData.readLine().split(",")[0].toFloat(&convertible);
if(!convertible) throw std::runtime_error("Error!");

显然,IMO,可维护性最差的代码就是简单地将上面的代码重复到我使用readLine()的每一行。这绝对不是我计划选择的路径。 (我欢迎有人能证明这样做的好处)

我可以想出几种方法来重构这段代码。

1)不是直接使用Qt的QTextStream类,而是创建我自己的拥有QTextStream的类,然后创建一个名为readFirstTokenAsFloat()的方法。在该方法内部,我将进行错误检查,如上所示。然后每个“FileReader”类现在都会切换到使用这个新类。这种方法的优点,IMO,它完成了我想要做的事情,但缺点,IMO,如果我需要做其他事情,或者如果我想使用其他QTextStream的方法,我会违反DRY原则(?)通过复制相同的方法,并在内部只有一个单行调用QTextStream。

2)或者我可以从QTextStream继承。这样我只需扩展其功能,并获得QTextStream的所有功能。但在这种情况下继承是一个好主意吗?

3)还有其他想法吗?我敢肯定有人遇到过这样的事情。这个模式有特定的名称吗?

1 个答案:

答案 0 :(得分:1)

如果您认为您正在使用所有QTextStream功能,那么继承就是IMO的方法。继承本身并不是坏事,在某些情况下应该避免。但是如果QTextStream中至少有一个方法根本不应该被调用,那么这可能会导致一个奇怪的设计(在这种情况下可能使用接口会有所帮助)

现在,如果您正在使用功能的子集,那么组合(方法编号1)是可行的方法。

我还建议创建一个带有“readFirstTokenAsFloat()”方法的接口,以及您想要的任何其他方法,然后实现该接口(并在“FileReaders”上使用它)。这样,您就可以更少耦合,更容易更改设计。

如果某些内容不明确或存在争议,请随时在评论中发帖,以便我们改进答案=)。