从本地文件或远程URL读取数据的方法:如何传递参数?

时间:2013-07-24 19:36:17

标签: oop language-agnostic arguments overloading

我正在创建一个反序列化XML文件并从中创建一些对象的类。

该方法或多或少是这样的(C#样式伪代码):

this.Load(string url_or_filename, out string file_content) {
    try { 
        string filename = url_or_filename;
        loadFile(filename, resultstring);
    }
    catch (FileNotFoundException) {
        string url = url_or_filename;          
        loadUrl(url, resultstring);
    }
}

问题是:将“魔术字符串”传递给此函数并让它从字符串处理意图被认为是一种好习惯,从而为API用户提供易于使用的界面,例如或者更聪明的是有两种不同的方法,一种用于本地文件路径,另一种用于远程URL?

(这可以更广泛地被问为:“我应该有一个接受大量参数类型的方法,或者单个命名方法的大量重载(例如,在Python中不严格可行),或者每个方法应该以单一方式做一件事,因此我应该有更多的方法,每个方法都有一个名称?)

1 个答案:

答案 0 :(得分:1)

我通常更喜欢我的方法/功能做一件事。在这种情况下,我会考虑使用新的抽象:streams。

// in the same C#-pseudocode 
string load(Stream source)
{
    return source.ReadAll();
}

在来电者网站,有人会知道这是一个文件还是一个http请求,所以你可以决定:

// reading from file
foo(string filename)
{
    Stream source = new File(filename).getStream();
    load(source);
}

// reading from an url
bar(string url)
{
    HttpRequest request = new HttpRequest(url);
    Stream source = request.getResponseStream();
    load(source);
}

如果您的XML反序列化可以从流中读取(并且很有可能),您可以跳过stream->字符串读取。如果内容可能很大,则可能很重要。