SAP PS Project对象的深度复制的设计类



我开始开发时创建了一个"ZProject"类,该类仅用于读取或更新SAP PS Project标头信息,因此它只有一个PROJ表类型的结构属性。

现在我需要添加一个非常复杂的操作"复制"完整项目。这意味着我阅读了完整的参考PS项目层次结构、WBS元素、活动、里程碑、成本。。。然后我重命名ID,最后使用BAPI调用保存副本。由于ZProject类没有所有这些属性,所以我用一个静态方法来完成它,但我想用不同的方法来完成。我考虑的选项如下:

  1. 向ZProject类添加所有必要的属性(WBS元素、层次结构、活动…)。构造函数不会填充它们,因为它们并不总是需要的,但如果get方法需要它们并检测到它们为空,那么它将触发一种加载所有信息的"init"方法。最后,我实现了一个深度复制实例方法,该方法重命名必要的ID并使用BAPI保存到数据库中。

  2. 第一个选项使类可以在不使用getter的情况下直接读取访问的私有属性,因此无需触发init方法。未来的开发人员可能会因为不理解即使私下里也必须使用getter而感到困惑。然后,另一种解决方案是创建一个类ZProjectFull,该类具有一个已经读取所有内容的构造函数,最后是相同的深度复制方法。如果我这样做,ZProjectFull应该继承ZProject吗?

你对此有更好的想法吗?我应该实现clone()方法而不是深度复制吗?

现在我需要添加一个非常复杂的操作"Copy"完整项目。这意味着我阅读了完整的参考PS项目层次结构,WBS要素、活动、里程碑、成本。。。然后我重命名ID最后使用BAPI调用保存副本。由于ZProject类没有所有这些属性,我用静态方法

不,您仍然可以在实例方法中进行深度克隆。定义一个复制方法,返回ZProject的新实例。在复制方法中,您可以获得ZProject的当前实例的标题信息,并阅读完整的参考PS项目层次结构、WBS元素、活动、里程碑、成本。。。然后重命名ID,最后使用BAPI调用保存副本。最后,您将返回一个带有新标头信息的新实例。你甚至可以进行链式调用复制。此外,这个copy方法也是惰性初始化,因为它只在调用者调用它时读取依赖的子信息

你对此有更好的想法吗?我应该执行clone()方法而不是深度复制?

方法名称并不重要。只要此方法签名有意义,就可以使用clone()、copy()或deep_copy(),因为它们都有意义。

CLASS zproject DEFINITION.
PUBLIC SECTION.
METHODS constructor IMPORTING project_header.
METHODS clone RETURNING VALUE(result) TYPE REF TO zproject.
PRIVATE SECTION.
DATA project_header TYPE <whatever>.
ENDCLASS.
CLASS zproject IMPLEMENTATION.
METHOD clone.
DATA(data) = read_all_project_data( project_header ).
DATA(modified_data) = assign_new_ids( data ).
save_to_db( modified_data ).
result = NEW zproject( modified_data-project_header ).
ENDMETHOD.
ENDCLASS.

Clone是这类操作的常用名称。这是一个实例方法,因为您克隆了一个已经拥有的对象。通过将数据移交给构造函数,可以避免重新读取已经拥有的数据。您不应该将所有数据作为成员添加到类中,因为它们仅在clone方法中需要。

最新更新