我正在创建一个反序列化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中不严格可行),或者每个方法应该以单一方式做一件事,因此我应该有更多的方法,每个方法都有一个名称?)
答案 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->字符串读取。如果内容可能很大,则可能很重要。