代码之家  ›  专栏  ›  技术社区  ›  Vlad Gudim nuriaion

获取客户订单:Set<Order>getAllOrders()与Set<Integer>getAllOrders()比较

  •  3
  • Vlad Gudim nuriaion  · 技术社区  · 17 年前

    我没有做过太多Java编程,因此在我的脑海中出现了许多未回答的ORM问题,对于经验丰富的人来说,这些问题似乎相当直接。

    假设我们有两个类:Customer和Order。Customer类实现了一个名为listAllOrders的方法,该方法的签名应该是什么?

    1. Set<Order> getAllOrders(); //面向对象的方式

    2. Set<Integer> getAllOrders(); //db友好的方式,基于每个订单分配一个唯一的int id的假设

    3. int[] getAllOrders(); //db友好的方式,经过优化

    4. Set<OrderID> getAllOrders(); //面向对象的方式,经过优化

    5. 另外通过方法重载实现上述功能的组合?

    我的想法是立即放弃第三种选择,因为这种优化是不成熟的、不必要的,而且可能带来更多的麻烦而不是好处。

    在第一个选项和第二个选项之间进行选择,主要的论点似乎是,在许多情况下,返回一个订单集合而不是ID将是一种过分的做法。

    第一个选项总是需要将订单预加载到内存中,尽管一些订单属性可以通过延迟加载来处理,但订单对象本身仍然需要分配比一组裸ID多得多的内存。另一个原因似乎是延迟加载不会给我使用 final 修饰符来强制顺序字段的不变性。

    然而,选项2并没有真正封装订单编号,也就是说,如果决定开始使用字符串UUID或long as order identifier而不是integer,那么就有必要进行认真的重写。显然,这可以通过引入一个名为OrderId的新轻量级对象(第四种方法)来缓解。

    好的,现在我真的很感谢ORM和Java专家的帮助!

    6 回复  |  直到 17 年前
        1
  •  4
  •   Paul Tomblin    17 年前

    知道打电话的人想要什么总是有帮助的。如果每次调用方都必须查找每个订单,那么返回订单id并不是一种优化。另一方面,如果大多数时候他们不需要所有这些信息,那么就没有任何回报。

    大多数情况下,我会选择选项1。但如果是像智能手机这样内存受限的东西,我想我会选择延迟扩展。

        2
  •  2
  •   Rich Kroll    17 年前

    对于刚接触ORM工具的人来说,最困难的事情之一是,他们试图应用他们对数据库的知识以及在该环境中使用的优化(存储ID等)。我建议您使用对象,并在出现性能问题时解决它们。

    大多数ORM会为您处理此类问题;例如,Hibernate默认情况下会延迟加载一个集合(在您的例子中是订单)。在内部,它将为您存储一组ID值,但这并不是您的问题,因为您将只与对象和关联对象的集合进行交互。如果你专注于你的领域对象并且认为是“OO”,你的ORM工具应该支持你,并允许你在必要时进一步优化。

        3
  •  1
  •   Daniel Brückner    17 年前

    我建议使用选项一,因为 你处理的是业务对象,而不是数字 .如果您需要id,您仍然可以从订单中获取。如果使用smart或mapper,在访问真实数据之前,只会加载订单的主键,因此无需担心数据库或内存性能。

        4
  •  0
  •   Soviut    17 年前

    如果函数被调用,我必须同意Paul Tomblin的观点 getAllOrders() 我希望它返回一个order对象(假设存在这样一个类)。应该调用该函数 getAllOrderIds() 如果它将返回更具体的内容。

        5
  •  0
  •   Carl Manaster    17 年前

    选项2和选项3一样,都是过早的优化。你的客户想知道订单是什么;它甚至可能不在乎订单的ID是什么。在某些情况下,客户可能需要ID,但如果你看到这种情况发生,你可能应该问为什么?并找到一种直接对订单进行操作的方法。

        6
  •  0
  •   Jay Jay    17 年前

    我将呼应保罗·汤姆布林的说法,问题不是“做什么最好?”但“实现这一目标的最佳方式是什么?”在说出函数的返回值之前,必须确定调用者将如何处理这些信息。如果调用方想做的是,比如,为用户显示订单ID列表,然后返回订单ID。如果调用方希望显示订单日期、总成本和发货状态的列表,那么我将返回一组包含该数据的对象。等