【问题标题】:Completely Arbitary C# Question完全任意的 C# 问题
【发布时间】:2009-04-22 06:01:16
【问题描述】:

假设您有一个对象,例如,我们将其称为 ScoreHotChicksEngine。并说 ScoreHotChicksEngine 的构造函数期望传递一个 IDataReader,其中包含显然与为孤独的 Geeks 评分热小鸡有关的属性值。

ScoreChicksEngine(IDataReader reader);

好的,这就是我想收集的关于...的意见

作为开发人员,您是否会认为在将阅读器传递到 ScoreChicksEngine 之前必须先阅读它会更有用

IDataReader = command.ExecuteReader();
reader.Read();
ScoreChicksEngine SCE = new ScoreChicksEngine(reader);

或者您会假设引擎本身会调用该函数并可能处理空值?

IDataReader  = command.ExecuteReader();
ScoreChicksEngine SCE = new ScoreChicksEngine(reader);
if (SCE.HasReaderData()) doSomething();

【问题讨论】:

  • 如果 ScoreHotChicksEngine 工作正常,你在卖吗?
  • 当然,因为即使我不再是唯一拥有 ScoreHotChickEngine 的人,我也会有这么多钱,我不需要一个来竞争。

标签: c# architecture


【解决方案1】:

您是否应该考虑将数据收集与算法分离并在两者之间使用桥接解决方案(例如,迭代器适配器)?只是我的 0.02 美元。

这种设计的含义是算法负责根据需要通过适配器进行调用以读取数据。适配器隐藏了集合及其与正在解决的问题无关的任何特定方面。

【讨论】:

  • 我完全同意@dirkgently。 ScoreChicksEngine 不应该关心甚至知道它从 IDataReader 获取数据。解耦是要走的路。
【解决方案2】:

我会选择第一种方法。第二种方法违反了单一职责原则。我还将构造函数的输入参数声明为IDataRecord 而不是IDataReader。基本上,SCE 类基于单个记录构建自己,而不关心那里的一组记录。

【讨论】:

    【解决方案3】:

    除非 ScoreChicksEngine 有理由假设读者将处于特定状态,否则我会让它自己完成所有工作。如果在初始化之前忘记调用 Read() 怎么办?没有办法真正检查,所以只需在 SCE 中进行检查即可。

    【讨论】:

      【解决方案4】:

      好吧,经过几年痛苦的基于 .Net 的经验,我会假设第一种情况。但是,每次我输入时,我都希望我输入第二个。

      【讨论】:

        【解决方案5】:

        我会让 ScoreChicksEngine 完成这项工作。我的理由:

        1. 不依赖于用户知道/记得这样做。
        2. 可能存在不必要的情况,例如 ScoreChicksEngine 决定其配置不完整。
        3. 如果每次都必须做某事,为什么调用者要到处重复呢?
        4. 让用户更轻松,允许更紧凑的代码,例如:

          ScoreChicksEngine SCE = new ScoreChicksEngine(command.ExecuteReader());

        【讨论】:

          【解决方案6】:

          我会使用第一种方法。也许读者返回不止一条记录,那么你可以这样做:

          IDataReader = command.ExecuteReader();
          while (reader.Read())
              list.Add(new ScoreChicksEngine(reader));
          

          事实上,我过去所做的是围绕数据读取器创建了一个包装类(使用 GetInt32(name)、GetString("name") 等方法。

          这样,ScoreChicksEngine 无法访问读取器的方法,而只能访问包装类的方法。

          上面的示例会看起来像这样:

          IDataReader = command.ExecuteReader();
          while (reader.Read())
              list.Add(new ScoreChicksEngine(new MyDataReaderWrapper(reader)));
          

          【讨论】:

            【解决方案7】:

            自然而然地,第二种方法更有意义,但它在某种程度上取决于引擎将如何对待读者:

            • 它会使用阅读器读取当前行,还是
            • 它会遍历阅读器中的所有行并制作一个列表

            如果是第一种情况,那么我希望引擎不会调用 Read 方法,如果第二种情况是真的,我会假设引擎在驾驶座上并负责调用 Read。

            这可能指向考虑之前建议的解耦。

            【讨论】:

              【解决方案8】:

              这取决于您的 ScoreChicksEngine 对读者做了什么。如果读者正在读取少量数据,那么传入该数据可能会更好:

              IDataReader = command.ExecuteReader();
              ObservableCollection<HotChicks> Wowzer = reader.Read();
              ScoreChicksEngine SCE = new ScoreChicksEngine(Wowzer);
              

              这也可能是一个延迟加载的集合,您的 SCE 不会在意。无论哪种方式,我都不认为 SCE 必须在读取器访问结果之前调用任何内容。当您第一次尝试访问集合时,您的 IDataReader 应该具有调用 read 函数的内部逻辑,或者应该在构造函数中调用它。哪个更好取决于您的情况。不管怎样,建议你使用 ObservableCollection!

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-07-21
                • 2023-03-04
                • 1970-01-01
                • 1970-01-01
                • 2013-05-26
                • 2021-10-21
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多