2010-01-29 81 views
0

我目前正在使用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()可能失败(例如,读值不转换为浮动),所以我打算修改上面的一行:

// 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!"); 

显然,国际海事组织,最不可维护的代码就是简单地将上面的代码重复给我使用readLine()的每一行。这绝对不是我计划选择的路径。 (我会欢迎有人可以证明这样做的好处)

我可以想到一些方法来重构此代码。

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

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

3)其他想法?我相信有人遇到过这样的事情。这种模式有没有特定的名称?

回答

1

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

现在,如果您使用功能的子集,然后组合(方法1)是要走的路。

我会另外建议创建一个“readFirstTokenAsFloat()”方法和你想要的其他方法的接口,然后实现接口(并在你的“FileReaders”中使用它)。通过这种方式,您可以减少耦合并更轻松地更改设计。

如果有什么不清楚或有争议,请随时发表评论,所以我们可以改进答案=)。

相关问题