1

我创建了一个示例来介绍我的问题。

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文件实例的方法,因为它看起来更通用,但我想听听你的建议。谢谢!

4

4 回答 4

4

使用允许您在内存中创建测试程序的东西。例如,使用 InputStream 而不是 File,允许您为测试编写一个简单的 InputStream 实现,而不必在文件系统上创建一个文件,将内容放入其中,并在完成后将其删除。

如果您有一个获取 Data 对象的接口,我认为这是最好的。

于 2009-06-29T22:05:33.220 回答
0

我同意上述答案,即您确实应该使用 Data 对象/接口。当您进行测试时,您可以创建数据对象的模拟,以便更轻松地进行测试。此外,如果您正在从不同的源读取数据 - 数据库、文件、内存等,将其转换为相同的流格式可能并不总是那么容易(但您可以为每种源类型设置适配器,将其转换为正确的数据格式)。

我注意到您的方法也是静态的。您可能需要考虑使用实例方法并创建算法的实例。如果需要,实例方法将允许您存储状态。

于 2009-06-29T22:31:07.350 回答
0

我在这里看到的一个大问题是您的算法是否需要同时对整个数据集进行操作,还是对流格式的数据集进行操作?

如果您需要同时使用该数据集来操作您的算法(即在数据元素之间来回随机导航),那么您应该保留已注释掉的第一个方法。在您的其他方法中,获取流并将其读入完整数据集,然后将该完整数据集传递给您的算法方法。仅仅因为您需要一个特定的接口并不意味着您必须将整个实现放到那个位置。

另一方面,如果这是一种旨在对数据流进行操作的算法(即路由算法),那么请将您的垃圾保留在该方法中并像您应该那样对流进行操作...

于 2009-06-29T22:34:20.277 回答
0

鉴于您的限制,我将同时拥有使用 File 的方法和使用 DataFileReader 的方法,并让前者调用后者。如果您可以扩展 DataFileReader 以创建用于测试的内存读取器,则尤其如此。

于 2009-06-29T22:35:07.403 回答