代码之家  ›  专栏  ›  技术社区  ›  Peter Lange

完全任意的问题

  •  2
  • Peter Lange  · 技术社区  · 16 年前

    假设您有一个对象,为了举例,我们将其称为ScoreHotchicsEngine。并且说ScoreHotchicksEngine的构造函数期望被传递一个IDataReader,该IDataReader包含一些属性值,这些属性值显然与为孤独的极客打分辣妹有关。

    ScoreChicksEngine(IDataReader reader);
    

    好的,下面是我想收集的信息…

    作为一个开发人员,你会发现假设读者在被传递到ScorechCicksEngine之前必须被阅读更有用吗?

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

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

    IDataReader  = command.ExecuteReader();
    ScoreChicksEngine SCE = new ScoreChicksEngine(reader);
    if (SCE.HasReaderData()) doSomething();
    
    8 回复  |  直到 16 年前
        1
  •  3
  •   Mehrdad Afshari    16 年前

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

        2
  •  6
  •   dirkgently    16 年前

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

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

        3
  •  1
  •   Chris Doggett    16 年前

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

        4
  •  1
  •   Electrons_Ahoy    16 年前

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

        5
  •  1
  •   Chris Thornhill    16 年前

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

    1. 不依赖于用户知道/记得这样做。
    2. 在某些情况下,它可能是不必要的,例如scorechcksengine决定其配置不完整。
    3. 如果每次都要做点什么,为什么打电话的人会到处重复呢?
    4. 使用户更方便,允许更紧凑的clode,例如:

      scorechicksengine sce=new scorechicksengine(command.executereader());

        6
  •  1
  •   M4N    16 年前

    我会用第一种方法。也许读卡器返回多个记录,那么您可以执行以下操作:

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

    事实上,我过去所做的是在数据读取器周围创建一个包装类(使用诸如getInt32(name)、getString(“name”)等方法)。

    这样,ScorechCicksEngine就不能访问读卡器的方法,而只能访问包装类的方法。

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

    IDataReader = command.ExecuteReader();
    while (reader.Read())
        list.Add(new ScoreChicksEngine(new MyDataReaderWrapper(reader)));
    
        7
  •  1
  •   Fredrik Mörk    16 年前

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

    • 它是否使用读卡器读取当前行,或者
    • 它是否会遍历读卡器中的所有行并列出一个列表

    如果第一种情况是这样的,那么我希望引擎不调用read方法,如果第二种情况是这样的,那么我假设引擎在驾驶员的座位上,并且负责调用read。

    这可能指向了像前面建议的那样思考脱钩。

        8
  •  1
  •   Jon Artus    16 年前

    这取决于你的分数对读者的影响。如果读卡器正在读取少量数据,那么传入该数据可能会更好:

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

    这也可能是一个懒惰加载的集合,而您的SCE不在乎。不管怎样,我不认为SCE在访问结果之前必须调用阅读器上的任何内容。当您第一次尝试访问集合时,IDataReader应该具有内部逻辑来调用read函数,或者应该在构造函数中调用它。哪一个更好取决于你的情况。不管怎样,建议你使用一个可观察的集合!