我创建了一个如下所示的界面:
interface ICsvReader
{
List<string> ReadFromStream(Stream csvStream);
}
我的问题是关于返回类型List<string>
。在教程中,我可以看到很多方法只是void
的例子。在那种情况下,界面看起来很自然:
interface ILogger
{
void LogError(string error);
}
您没有任何特定的日志记录目标或方法如何记录错误。就像我说的那样对我来说很自然,但要返回的具体类型呢?这不是坏方法吗?当我使用界面时,我想在我的方法上创建一些抽象 - '你应该这样做,但我不在乎'。那么你对文件阅读器的界面有什么更好的想法吗?我想从不同来源阅读CSV,但总是返回List<string>
。好的方法还是坏的方法?
答案 0 :(得分:3)
记录器有点writer
所以void
; ICsvReader
顾名思义它是读者意味着它会为你读取一些东西并给予回报。
您是否曾见过返回类型为void
的read方法?我无法记住一个!
我唯一能建议的是使用IEnumerable<string>
始终承诺少于您提供的内容。如果将来需要,这将帮助您切换到延迟执行。
这里没有错。由于Logger执行写入操作,因此void
不是你的情况,你需要提出一些说法&#34;这就是我为你所读的内容&#34;。
答案 1 :(得分:1)
好吧,返回List<string>
意味着你的整个结构都在你的记忆中。对于大于2 G的CSV文件,这可能不合适。
另一种选择是返回IEnumerable<string>
- 这将让CSV阅读器决定是立即读取整个文件,还是进行增量加载和解析。或者你可以有两个不同的类,一个尝试一次加载整个文件,另一个可以一步一步地工作。
当然,List<T>
具有IEnumerable<T>
没有的方法和属性,因此您必须决定这种增加的灵活性是否值得。但我已经看到许多服务器端插件会将巨大的文件读入内存以便将它们发送到客户端,因此我建议至少考虑一下。
答案 2 :(得分:0)
关于接口
中的void vs List返回类型我认为你采取的方法是绝对正确的。在你的情况下你返回列表是不正确的,实际上这是你的应用程序的需要。为此,您要声明界面。接口方法声明可以是适合您代码的任何内容。
这里为代码优化目的建议的答案很多,使用IEnumerable。
来自问题:
那么你对文件阅读器的界面还是有更好的想法 什么?
刚才建议,你真的需要创建界面吗?因为在你的情况下你的ReadFromStream方法的定义看起来是相同的,所以你可能最终在各种类中编写相同的代码。解决方案将是基类/抽象类中的write方法(在其中您将实现抽象)