我已经创建了一个示例来介绍我的问题。
public class Algorithm
{
// This is the best, but circumstances prevent me from doing this.
/*public static void computeSomething(Data data)
{
// Compute some stuff
}*/
public static void computeSomething(DataFileReader reader) throws IOException
{
// Compute some stuff.
}
public static void computeSomething(File file) throws IOException, DataFormatException
{
DataFileReader = DataFileReaderFactory.newDataFileReader(file);
// Compute some stuff.
}
}
public class DataFileReaderFactory
{
private enum FileExtension { XML, UNSUPPORTED_EXTENSION }
private static final String XMLExtension = ".xml";
public static DataFileReader newDataFileReader(File file) throws DataFormatException
{
switch(computeFileExtension(file))
{
case XML : return new XMLFileReader(file);
default : throw new DataFormatException();
}
}
private static FileExtension computeFileExtension(File file)
{
if(file.getName().endsWith(XMLExtension))
return FileExtension.XML;
else
return FileExtension.UNSUPPORTED_EXTENSION;
}
}
所以,我想知道是否应该定义我的接口来获取 Files 或我自己的文件阅读器,以确保数据的格式有效。显然,我希望能够将数据本身作为 Data 对象,但我在这方面受到限制。原因是数据非常大,我不得不为多个对象序列化。在这种情况下,发送数据路径而不是数据本身更为实际。
无论如何,关于这个问题,我倾向于采用Java的文件实例的方法,因为它似乎更通用,但我想听听你的建议。谢谢!
答案 0 :(得分:4)
使用允许您在内存中创建测试程序的内容。例如。使用InputStream而不是File,允许您为测试编写一个简单的InputStream实现,而不必在文件系统上创建文件,将其放入其中,并在完成后将其删除。
如果你有一个接口来获取我认为最好的数据对象。
答案 1 :(得分:0)
我同意上面的回答,你应该真正使用Data对象/接口。在进行测试时,可以创建数据对象的模拟以便于测试。此外,如果您正在读取来自不同来源的数据 - 数据库,文件,内存等,则可能并不总是很容易将其转换为相同的流格式(但您可以为每种源类型提供适配器,将其转换为正确的数据格式)。
我注意到你的方法也是静态的。您可能需要考虑使用实例方法并创建算法实例。如果需要,实例方法将允许您存储状态。
答案 2 :(得分:0)
我在这里看到的一个重要问题是你的算法是否需要同时对整个数据集进行操作,还是以流式格式对数据集进行操作?
如果您需要同时使用该数据集来运行您的算法(即在数据元素之间来回随机导航),那么您应保留您已注释掉的第一种方法。在您的其他方法中,获取流并将其读入完整数据集,然后将该完整数据集传递给您的算法方法。仅仅因为你需要一个特定的界面并不意味着你必须将整个实现放到那个位置。
另一方面,如果这是一个设计用于对数据流进行操作的算法(即路由算法),那么将垃圾保留在该方法中并按照您应该的那样对流进行操作...
答案 3 :(得分:0)
考虑到你的约束,我将同时使用File的方法和使用DataFileReader的方法,并让前者调用后者。如果您可以扩展DataFileReader以创建用于测试的内存读取器,则尤其如此。