Вход в личный кабинет:

Забыли пароль? | Регистрация

Адреса компании:

Санкт-Петербург

196158, Санкт-Петербург,
Пулковское шоссе, д. 30,
корп. 4, Лит. А, офис 203

Тел: +7 812 414 95 41

Москва

129085, г. Москва, проезд Ольминского, д. 3а, стр. 3, офис 706

Тел: +7 495 616 00 53

Блог

26.08.2015

Progress OpenEdge: промышленные средства репликации данных в Oracle и MS-SQL

Progress OpenEdge Pro2 Replication

Читать далее →




Десять причин перехода на новые версии OpenEdge (Progress)


Объектно-ориентированное программирование в OpenEdge ABL (пример)

Вернуться к списку постов

19.07.2012

Автор: Александр Лысенко

Пример демонстрирует использование OOABL. OOABL — объектно-ориентированная надстройка для Progress ABL.  Начиная с версии 10.1B, Вы можете использовать классы. Ниже приведенный листинг написан с использованием Progress Developer Studio 3.6 и OpenEdge Release: 11.0.0.

Объектно-ориентированное программирование (ООП) не спасет Вас от ошибок и не станет панацей от бед. ООП призвано решить следующие задачи: создавать небольшие элементы кода, которые могут быть использованы без изменения внутренней структуры кода, повысить читабельность кода, повысить переносимость кода из приложения в приложение, уменьшить объем кода, используя полиморфизм и наследование.

Рассмотрим следующую задачу. Существует бизнес-объект — физическое лицо (Person), с данным объектом в дальнейшем будут работать один и более разработчиков. Необходимо создать процедуру, которая бы искала данные из временной таблицы и сохраняла их во временной таблице.

Применяя принципы ООП, создадим класс Person, который будет содержать в себе поля нашего объекта. Далее создадим конструкт объекта, который будет принимать идентификатор и инициализировать поля объекта. Опишем метод для создания записи во временной таблице, метод будет принимать объект класса Person и создавать запись. В дальнейшем бизнес-сущность Person может быть создана в любом месте приложения, для разработчика останется только правильно инициализировать поля объекта и передать его в метод createPerson.

USING Progress.Lang.*.
USING demo.pattern.*.

/*класс для работы с таблицей ttCustomer каждое поле таблицы описано
как поле класса*/
CLASS demo.pattern.Person:

    DEFINE PRIVATE VARIABLE age   AS INT  NO-UNDO.
    DEFINE PRIVATE VARIABLE sex   AS CHAR NO-UNDO.
    DEFINE PRIVATE VARIABLE pName AS CHAR NO-UNDO.
    DEFINE PRIVATE VARIABLE pId   AS INT  NO-UNDO.

/* использовал временную таблицу для эмуляции работы с ДБ
	таблица статическая т.е. привязана к классу, а не объекту
*/
    DEFINE PRIVATE STATIC TEMP-TABLE ttCustomer NO-UNDO
        FIELD ttName AS CHAR
        FIELD ttSex  AS CHAR
        FIELD ttAge  AS INT
        FIELD ttId   AS INT.

		/*конструкт по умолчанию*/
    CONSTRUCTOR PUBLIC Person (  ):
    END CONSTRUCTOR.

/*конструкт объекта Person, которые принимает идентификатор и
инициализирует поля объекта*/
    CONSTRUCTOR PUBLIC Person ( INPUT personId AS INT ):
        FIND ttCustomer WHERE ttCustomer.ttId = personId NO-ERROR.
        IF AVAIL ttCustomer THEN
        DO:
            ASSIGN
                age   = ttCustomer.ttAge
                sex   = ttCustomer.ttSex
                pName = ttCustomer.ttName
                pId   = ttCustomer.ttId.
        END.
    END CONSTRUCTOR.
  /*метод будет принимать объект класса Person и создавать запись в таблице*/
    METHOD PUBLIC VOID createPerson (INPUT personObj AS CLASS Person):

        CREATE ttCustomer.
        ASSIGN
            ttCustomer.ttAge = personObj:getAge()
            ttCustomer.ttSex = personObj:getSex().
    END METHOD.

/*метод возвращает поле объекта класса*/
    METHOD PUBLIC INTEGER getAge(  ):
        RETURN age.
    END METHOD.

   /*метод возвращает поле объекта класса*/

    METHOD PUBLIC CHAR getSex(  ):
        RETURN sex.
    END METHOD.

/*метод устанавливает значение в поле объекта класса*/

    METHOD PUBLIC VOID setAge(INPUT inAge AS INT  ):
        age = inAge.
    END METHOD.	

    METHOD PUBLIC STATIC VOID initPersons(  ):

        CREATE ttCustomer.
        ASSIGN
            ttCustomer.ttName = "alex"
            ttCustomer.ttSex  = "M"
            ttCustomer.ttAge  = 12
            ttCustomer.ttId   = 1
            .
		/*и еще много - много раз*/

    END METHOD.
END CLASS.

USING Progress.Lang.*.
USING demo.pattern.*.

/*класс будет демонстрирует использование ООП*/
CLASS demo.pattern.intro1:
  /*объявляем переменную типа класс*/
    DEFINE VARIABLE rClassExample AS CLASS Person NO-UNDO.
/*все действия происходит в конструкторе*/
    CONSTRUCTOR PUBLIC intro1 (  ):
	/*запускаем статический метод для наполнения временной таблицы*/
	  Person:initPersons().
/*создаем объект класса, будет использован конструктор, который
осуществляет поиск записи и инициализирует поля объекта*/
        rClassExample = NEW Person(2).

        MESSAGE rClassExample:getAge().
        MESSAGE rClassExample:getSex().
        DELETE OBJECT rClassExample.
/*создаем объект, устанавливаем значения, сохраняем запись */
        rClassExample = NEW Person().
        rClassExample:setAge(5).
        rClassExample:createPerson(rClassExample).

    END CONSTRUCTOR.

    DESTRUCTOR PUBLIC intro1 ( ):

    END DESTRUCTOR.

END CLASS.

Архив проекта можно скачать здесь

Буду рад ответить на Ваши вопросы!


Добавить свой комментарий

Ваше имя*:
Ваш E-mail*:
Ваш комментарий*:

Компьютерные системы для бизнеса
© 2010 - 2017 Все права на материалы, находящиеся на этом сайте, охраняются в соответствии с законодательством РФ, в том числе, об авторском праве и смежных правах. При любом использовании материалов сайта ссылка на источник обязательна.