完全任意的C#问题

时间:2009-04-21 21:43:28

标签: c# architecture

假设您有一个对象,为了示例,我们将调用ScoreHotChicksEngine。并且说ScoreHotChicksEngine的构造函数期望传递一个IDataReader,其中包含属于Lonely 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();

8 个答案:

答案 0 :(得分:6)

您是否应该考虑将数据集合与算法分离并在其间使用桥接解决方案(比如说是迭代器适配器)?只需我0.02美元。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

除非ScoreChicksEngine有理由认为读者将处于特定状态,否则我会让它完成所有工作。如果您在启动之前忘记调用Read()怎么办?没有办法真正检查,所以只需确保在SCE中这样做。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

我会使用第一种方法。也许读者会返回多条记录,然后你可以这样做:

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)));

答案 6 :(得分:1)

自然而然,第二种方法更有意义,但这取决于引擎如何对待读者:

  • 是否会使用阅读器读取当前行,或
  • 它会迭代阅读器中的所有行并制作一个列表

如果是第一种情况,那么我希望引擎不要调用Read方法,如果第二种情况是真的,我会假设引擎位于驱动程序座位并负责调用Read。

这可能意味着考虑如前所述的解耦。

答案 7 :(得分:1)

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

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

这也可能是一个懒惰的集合,你的SCE也不在乎。无论哪种方式,我都不应该在读者可以访问结果之前在阅读器上调用任何东西。当你第一次尝试访问集合时,你的IDataReader应该有内部逻辑来调用read函数,或者应该在构造函数中调用它。哪个更好取决于你的情况。无论哪种方式,建议您使用ObservableCollection!