【问题标题】:Use Get by Type or Get by ID使用按类型获取或按 ID 获取
【发布时间】:2011-04-06 17:51:02
【问题描述】:

我有一个名为 GetObjectsRelatedToAType 的方法,例如获取CarsRelatedToDealership。从 Web 服务或一般方法签名的角度来看,哪种方法更好:

List<Cars> GetCarsRelatedToDealership( Dealership dealership );

List<Cars> GetCarsRelatedToDealership( id dealership );

我倾向于喜欢对象方法,因为它在确保方法的源输入有效方面更加有力。想法/建议?

【问题讨论】:

  • 既然这是private方法,那就无所谓了。对于public 方法,我喜欢防止暴露像List&lt;T&gt; 这样的特殊类型。我仍然使用它们,但我将它们保留在方法内部,并返回更通用的数组或集合。只是评论,并不能解决您的问题。

标签: c# method-signature


【解决方案1】:

ID 是该方法运行所需的唯一信息吗?如果是这样,我会保留它。

【讨论】:

  • 它是或可能是;我不控制中间层,尽管我倾向于相信他们只关心 ID。
  • 我想你已经有了答案:)
【解决方案2】:

对象方法有问题。

Dealership dealership;
GetCarsRelatedToDealership(dealership); // dealership is null

var dealership = new Dealership();
GetCarsRelatedToDealership(dealership); // dealership has no id

在这些情况下,对象并没有给您带来任何优于 id 的优势。 id 可能是错误的,但您可以验证它。这个对象让事情变得更复杂了。

在处理服务时,我会创建一对请求/响应类。这使您可以确保您的签名永远不需要更改。您的 Request 或 Response 对象可能会改变,但方法签名不会改变。

现在我可以传递经销商 ID 以及请求信息的人,并确保允许请求的用户查看该经销商的库存。只是通过经销商或身份证的东西是不允许的。

public class CarsRequest
{
  public int DealershipId { get; set; }
  public int RequesterId { get; set; }
}

public class CarsResponse
{
  public Car[] Cars { get; set; }
}

CarsResponse GetCarsRelatedToDealership(CarsRequest request);

【讨论】:

    【解决方案3】:

    对于网络服务,我尽量减少通过网络发送的数据量。如果您还需要一个方法,我可能会为“经销商”类/接口创建成员方法“GetRelatedCars”。当 Web 服务调用到来时,您可以通过基于 id 获取该对象并调用对象上的“GetRelatedCars”方法来验证它是一个真正的“经销商”(并且调用者对其拥有权限)。

    【讨论】:

    • 我选择了这个答案,因为从根本上说,检查数据的重要性始终存在于方法中以确保参数有效,并且线路流量肯定是一个考虑因素。其中许多答案都很棒,这也是我喜欢 SO 的原因。
    【解决方案4】:

    你能让这个方法接受一个接口吗?这将使其更加灵活,也许更容易测试。

    List<Cars> GetCarsRelatedToDealership( IDealership dealership );
    

    【讨论】:

    • 我绝对喜欢 IoC 的想法,但对于这个项目,我将通过在我的测试项目中为 DAL 调用不同的构造函数来进行测试。
    • 如何使它更加灵活?不必要地向对象添加接口根本无法改善任何情况
    • 鉴于 Nissan Fan 的评论,在这种情况下似乎不需要接口解决方案。但是,如果这个项目预计会增长并且有多种类型的经销商怎么办? IE。也许并非所有经销商都是经销商对象或必然继承自经销商。这就是接口灵活的方式。此外,以不那么粗鲁的方式表达事物也不会伤害您。
    【解决方案5】:

    我会采用 Id 方法,并验证 Id 是否有效。您可能会得到一个无效的 Dealership 对象,在这种情况下,使用 Dealership 不会获得任何优势

    【讨论】:

      【解决方案6】:

      通常只使用一个 ID 就足够了,而且要容易得多,因为您可以简单地将一个 ID 从一个地方传递到另一个地方。这对于 Web 服务尤其重要,您希望将传输的数据量降至最低。

      但是,如果您经常有较大的方法签名,其中方法名称没有很好地指定输入:

      List<Cars> GetCars(int makeId, int modelId, int year, int dealershipId);
      

      ... 将错误的 ID 传递到错误的地方会变得非常容易。这就是我开始尝试寻找不同策略的地方。将您的输入强输入为域对象是一种解决方案,但它通常会比简单地使用特殊选项 POCO 给您带来更多麻烦:

      public class GetCarsOptions
      {
          public int MakeId {get;set;}
          public int ModelId {get;set;}
          public int Year {get;set;}
          public int DealershipId {get;set;}
      }
      
      List<Cars> GetCars(GetCarsOptions options)
      {
          ValidateOptions(options); // make sure the values all make sense.
      }
      

      事实是,您无法在运行时捕获所有可能的错误,因此最好将自动化测试与“快速失败”技术结合起来,以尝试在编译后捕获尽可能多的错误并部署前。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        相关资源
        最近更新 更多