【问题标题】:Proper approach to interfaces in C#C# 中接口的正确方法
【发布时间】:2014-03-30 12:19:38
【问题描述】:

我创建了一个如下所示的界面:

interface ICsvReader
{
    List<string> ReadFromStream(Stream csvStream);
}

我的问题是关于返回类型List&lt;string&gt;。在教程中,我可以看到很多方法只是 void 的示例。在这种情况下,界面看起来很自然:

interface ILogger
{
    void LogError(string error);
}

您没有任何特定的日志记录目的地或如何记录错误的方法。就像我说的那样,这对我来说看起来很自然,但是要返回的特定类型呢?这不是不好的方法吗?当我使用接口时,我想对我的方法创建一些抽象——“你应该这样做,但我不在乎怎么做”。那么您对文件阅读器的界面或其他东西有更好的想法吗?我想从不同的来源读取 CSV,但总是返回 List&lt;string&gt;。好方法还是坏方法?

【问题讨论】:

  • 您是说每个实现 ICsvReader 的类都应该实现一个返回 List&lt;string&gt; 的方法。这怎么可能被认为是坏事?这正是你想要的。
  • '你应该这样做,但我不在乎如何' - 这正是你的界面所做的。 “你应该获取一个流并给我一个字符串列表;我不在乎你是如何得到它的。”
  • 我说不好是因为也许我应该更一般地定义该操作的结果。
  • 我认为在接口中返回 List 并没有错。但是,我会使用一个接口来支持从不同数据格式返回 List 的不同类。我宁愿将接口视为 IMyDataReader {List ReadFromStream(Stream fileStream);}。然后 CsvReader 将实现该接口。
  • @AntP 有时你意识到你实际上想说“你应该获取一个字节流并给我一个字符串“流”;我不在乎你是如何得到它的,但我不想听到任何OutOfMemoryException 废话”。

标签: c# interface abstraction


【解决方案1】:

记录器有点像writer 所以voidICsvReader 顾名思义是 reader,意思是它会为你读一些东西并作为回报。

你见过返回类型为void 的读取方法吗?一个都想不起来了!

我唯一能建议的是使用IEnumerable&lt;string&gt; 总是承诺比你能提供的少。如果将来需要,这将帮助您切换到延迟执行。

这里没有错。由于 Logger 确实进行了写入操作,因此 void 这不是你的情况,你需要产生一些内容说“这是我为你读的”。

【讨论】:

    【解决方案2】:

    嗯,返回List&lt;string&gt; 意味着你的记忆中有整个结构。对于大于 2 G 的 CSV 文件,这可能不合适。

    另一个选择是返回IEnumerable&lt;string&gt;——这会让 CSV 阅读器决定是要一次读取整个文件,还是进行增量加载和解析。或者你可以有两个不同的类,一个会尝试一次加载整个文件,另一个会逐步工作。

    当然,List&lt;T&gt; 具有IEnumerable&lt;T&gt; 所没有的方法和属性,因此您必须决定是否值得增加这种灵活性。但是我见过一些服务器端插件,它们会将巨大的文件读入内存以便将它们发送到客户端,所以我建议至少考虑一下。

    【讨论】:

      【解决方案3】:

      关于接口中的 void 与 List 返回类型

      我认为您采取的方法是绝对正确的。在您的情况下,您返回的 List 并不正确,实际上这是您的应用程序所需要的。为此,您正在声明接口。接口方法声明可以是任何适合您的代码的东西。

      此处为代码优化目的建议的许多答案都使用 IEnumerable。

      来自问题:

      那么你对文件阅读器的界面有更好的想法吗? 什么?

      只是建议,你真的需要创建界面吗?因为您的情况下 ReadFromStream 方法的定义看起来是相同的,所以您最终可能会在各种类中编写相同的代码。解决方案是在基类/抽象类中编写方法(您将在其中实现抽象)

      【讨论】:

      • 就像之前有人提到的,我将界面更改为数据阅读器,所以现在我可以使用它来创建CsvDataReader
      猜你喜欢
      • 2023-04-02
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      相关资源
      最近更新 更多