Класс проектирования для глубокой копии объекта проекта SAP PS - PullRequest
0 голосов
/ 08 февраля 2019

Я начал разработку с создания класса "ZProject", который использовался только для чтения или обновления информации заголовка проекта SAP PS, поэтому он имел только 1 структурный атрибут с типом таблицы PROJ.

Теперь мне нужнодобавить действительно сложную операцию «Копировать» в полный проект.Это означает, что я прочитал полную справочную иерархию проекта PS, элементы СПП, виды деятельности, этапы, затраты ... затем переименовал идентификаторы и, наконец, сохранил копию, используя вызов BAPI.Поскольку класс ZProject не имеет всех этих атрибутов, я сделал это статическим методом, но я бы хотел сделать это по-другому.Я рассмотрел следующие варианты:

  1. Добавьте все необходимые атрибуты в класс ZProject (СПП-элементы, иерархия, действия ...).Конструктор не будет заполнять их, потому что они не всегда нужны, но если метод get нуждается в них и обнаруживает, что они пустые, он вызовет своего рода метод «init», который загружает всю информацию.Наконец, я реализую метод экземпляра глубокой копии, который переименовывает необходимые идентификаторы и сохраняет их в базе данных, используя BAPI.

  2. Первый параметр позволяет классу читать личные атрибуты, обращаясь напрямую, безиспользуя геттер, поэтому без запуска метода init.Будущий разработчик может быть смущен тем, что не понимает, что даже в частном порядке вы должны использовать геттеры.Тогда альтернативным решением является создание класса ZProjectFull с конструктором, который уже читает все, и, наконец, тот же метод глубокого копирования.Если я сделаю это, должен ли ZProjectFull наследовать от ZProject?

У вас есть лучшие идеи о том, как это сделать?Должен ли я реализовать метод clone () вместо глубокого копирования, может быть?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019
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.

0 голосов
/ 08 февраля 2019

Теперь мне нужно добавить действительно сложную операцию «Копировать» в полный проект.Это означает, что я прочитал полную справочную иерархию проекта PS, элементы СПП, виды деятельности, этапы, затраты ... затем переименовал идентификаторы и, наконец, сохранил копию, используя вызов BAPI.Поскольку класс ZProject не имеет всех этих атрибутов, я сделал это в статическом методе,

Нет, вы все равно можете выполнить глубокое клонирование в методе instance .Вы определяете метод копирования, возвращающий новый экземпляр ZProject.Внутри метода copy вы получаете информацию заголовка текущего экземпляра ZProject и читаете полную справочную иерархию PS Project, СПП-элементы, действия, этапы, затраты ... затем переименовываете идентификаторы и, наконец, сохраняете копию, используяБАПИ позвони.В конце вы возвращаете новый экземпляр с новой информацией заголовка.Вы даже можете сделать цепной вызов копирования.Кроме того, этот copy метод также является ленивым-init, поскольку он читает зависимую дочернюю информацию только тогда, когда вызывающая сторона вызывает ее.

У вас есть идеи о том, как это сделать?Должен ли я реализовать метод clone () вместо глубокого копирования, может быть?

Имя метода не имеет значения.Вы можете иметь его clone () или copy () или deep_copy (), если сигнатура этого метода имеет смысл, поскольку все они имеют смысл.

...