是否使用结构对单个属性进行分组?

Use structures to group individual attributes or not?

我不确定如何充分利用 ABAP 结构和 class 属性。

假设我有包含 4 个字段的对象操作:操作 ID、类型、描述和日期。

现在我可以用这 4 个属性创建一个 class,但是如果我想要一个构造函数,我需要 4 个单独的参数或一个需要映射到每个属性的结构。如果我想在一个结构中获取所有这些对象数据,例如通过 RFC 获取 return,也会发生同样的情况。然后一个方法get_operation_details( )需要一个一个映射所有的。

如果我将结构类型 ty_operation_details 用作单个 class 属性,那么当我向结构添加字段时,构造函数也会保持有效,并且 get_operation_details( ) 方法会也总是可以的。但是,如果我在 public 部分中直接使用 READ-ONLY 属性,那么使用 Operation->get_details( )-operationID 而不是 operation->operation_ID 似乎是错误的。我想第一种方法在 OO 世界中更正确,但我们失去了一些 ABAP 的好处。

你推荐使用什么?也许它可以允许第一个选项并同时使用结构的一件事是 CORRESPONDING 语句能够将 class 属性映射到平面结构,但我认为这是不可能的。

与大多数事物一样,您的设计应该遵循您的用途。如果您主要将一组属性一起使用,请考虑将它们分组到一个结构中。如果您主要单独使用它们,或者以不同的重组方式使用它们,请将它们分开。

一些注意事项:

  • 如果您总是 create/update/delete 将一组属性放在一起,则分组可以缩短调用时间。您已经发现了这个优势。

  • 分组揭示了字段之间的逻辑关系,当保持字段分开时,这些逻辑关系并不清楚。例如,这可能表明您的参数的一部分是强制性的,而其余部分形成几个可选集。

  • 分组简化了对状态进行操作的功能,例如 Memento 或 Flyweight 模式,因为它允许将对象的状态提取、存储和恢复为单个结构。

另外,像许多其他事情一样,将这个 非此即彼 问题变成 我将简单地使用两者.例如,如果您的 class 有四个单独的属性,为什么不仍然提供一种方法来设置或获取它们作为一个结构?当然,这会添加一些映射,但映射仍将封装在您自己的 class 中,而消费者会获得一个易于使用的界面。