【问题标题】:Is casting from MyObject[] to Object[] and then back again a bad code smell?从 MyObject[] 转换为 Object[] 然后再返回一个不好的代码气味?
【发布时间】:2012-11-26 09:45:45
【问题描述】:

我正在审查/重构一些代码,但遇到了我不喜欢的相互依赖关系,但我不确定在 C# 中解决此问题的最佳方法是什么。我的问题的本质是在一个文件中我有:

class MyObject
{
  public string Name {get;set;}
  public int? Age {get;set;}
}

public interface IConnection
{
  void Connect(string user,string pw,Action<MyObject[]> onConnect);
  void Disconnect();
}

然后在另一个文件中:

public class ConcreteDataProvider : IConnection
{
  public void Connect(string user,string pw,Action<MyObject[]> onConnect)
  {
    //...
    IEnumerable<MyObject> collection = ...
    onConnect( collection.ToArray() );
  }
}

我对这个设计的问题是MyObject 是特定于这个具体的数据提供者。我不想在IConnection 中提到它。

我的想法是将IConnection.Connect() 重构为:

void Connect(string user,string pw,Action<Object[]> onConnect);

然后在onConnectConcreteDataProvider 实现中,我会将数组转换为MyObject[]。 (从Unable to cast object of type 'System.Object[]' to 'MyObject[]', what gives? 看来,这意味着我需要使用Array.ConvertAll

这是一个糟糕的设计,会再次困扰我吗?


顺便说一句,对ToArray() 的调用会触发数据下载,我不希望在完成之前调用onConnect()。在幕后它也触发了实际的连接;在执行第一个查询之前,我不知道连接是否有效并且是否正常工作。这就是为什么我不想将IEnumerable 传递给OnConnect(),并让它调用ToArray()

【问题讨论】:

  • IConnectionIDataProvider是不同的接口吗?
  • @Rawling 抱歉,不,这是一个错字。我刚刚解决了这个问题。

标签: c# refactoring


【解决方案1】:

使用泛型怎么样?

public interface IConnection<T>
{
  void Connect(string user, string pw, Action<T[]> onConnect);
  void Disconnect();
}

【讨论】:

  • 感谢您的建议。与 Object[] 相比,这样做的优点/缺点是什么?
  • 强类型、编译时安全、重构友好、运行时无需执行强制转换,...​​...这个列表还在继续。
  • 这是一个很好的优点列表。最大的缺点是我很难编译它!首先,我需要对 MyObject 类进行新的约束。然后 LINQ 智能失败,并希望我在 select 调用 (CS0411) 上明确指定模板参数。
猜你喜欢
  • 2011-04-24
  • 2011-08-24
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多