【问题标题】:Passing Files as Parameters将文件作为参数传递
【发布时间】:2009-06-29 22:00:39
【问题描述】:

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

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;
    }
}

所以,我想知道是否应该定义我的接口来获取文件,或者我自己的文件阅读器,以确保数据的格式有效。显然,我希望能够将数据本身作为 Data 对象,但我在这方面受到限制。原因与数据非常大有关,我不得不为多个对象序列化它。在这种情况下,发送数据的路径比发送数据本身更实用。

无论如何,关于这个问题,我倾向于采用 Java 的 File 实例的方法,因为它看起来更通用,但我想听听你的建议。谢谢!

【问题讨论】:

    标签: java file oop refactoring parameter-passing


    【解决方案1】:

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

    如果你有一个我认为最好的获取 Data 对象的接口。

    【讨论】:

    • 不幸的是,流不可序列化,这是算法的必要要求。对于测试和本地执行,我可能会制作一个类似于我在上面示例中注释掉的算法版本,它允许直接传入数据。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 在上述方法的主体中,我实际上没有读取数据。实际上,我创建了一堆任务,这些任务被序列化并通过网络传递。正是在这里,我读入了数据。不幸的是,为每个创建的任务序列化数据副本是不可行的。
        猜你喜欢
        • 2014-03-23
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多