Progress 4gl - общие процедуры

Работаю в Progress 4gl и являюсь начинающим программистом. Я работаю над ситуацией, когда есть пять процедур (файлы .p), которые не связаны друг с другом, совместно использующие одну процедуру (. p файл).

Моя проблема в том, что мне нужно изменить общую процедуру, которая должна повлиять только на одну вызывающую процедуру, а не на остальные четыре. Какими способами я могу связать эти две процедуры одновременно, предотвращая воздействие на другие четыре процедуры?

Пожалуйста, помогите мне с этим вопросом. И извините, если не ясно


person Vetrivel Sitrarasu    schedule 23.04.2012    source источник


Ответы (3)


Простое, но архитектурно отталкивающее решение - использовать глобальную общую переменную.

Многие скажут вам, что это плохая техника кодирования. Они правы. Но вы не просите совета по передовой практике.

Просто создайте такую ​​переменную как в вызывающем, так и в вызываемом. Процедуры, которым это не нужно, не пропустят.

Одна из ваших "обычных" программ:

/* p1.p */

message "p1, I'm normal.".
run common.p.

Ваша «особенная» программа:

/* p2.p */

define new global shared variable special as character no-undo.

message "p2, I'm special!".
run common.p.
message "special = " special.

Общая программа:

/* common.p */

define new global shared variable special as character no-undo.
message "common stuff...".
if program-name(2) = "p2.p" then special = "special value".
return.

Вы можете определять НОВУЮ ГЛОБАЛЬНУЮ переменную SHARED сколько угодно раз, и вы получите только одну ее копию. «Новый» не перезаписывает существующие переменные (если вы не укажете GLOBAL, он будет вести себя иначе).

Вы не просили об этом, и, возможно, вам это не нужно, но проверка имени программы (2) заглядывает в стек вызовов, чтобы узнать, был ли common.p вызван p2.p.

Существуют и другие, более сложные способы сделать это, но все они сводятся к одной и той же проблеме - вы создаете основу для очень уродливой связи между вашей «специальной» программой и уже не универсальной «общей» программой.

person Tom Bascom    schedule 24.04.2012

Лучший способ - добавить «флаг» к общей процедуре, а затем передать флаг, когда вам нужно другое поведение. Вы не хотите изменять общую процедуру, поэтому ей нужно знать, какая программа ее вызывает.

person Tim Kuehn    schedule 23.04.2012
comment
да, я могу понять вашу точку зрения. Я сомневаюсь в следующем: Как я смогу передать значение флага из вызывающей процедуры в общую процедуру? - person Vetrivel Sitrarasu; 24.04.2012
comment
добавить еще одну переменную в API процедуры. - person Tim Kuehn; 24.04.2012

  • Перенести всю логику процедуры на новую, имеющую входной параметр.
  • Вызовите эту процедуру из исходного .p
  • Вызовите новую процедуру из процедуры, которой нужен дополнительный параметр.

По желанию

  • Постепенно заменяйте все прогоны с original.p на new.p
  • Удалите original.p, как только убедитесь, что все прогоны были изменены.

В зависимости от вашей версии OpenEdge вы можете переместить логику в класс вместо процедуры. В классе можно использовать перегрузку

person carl verbiest    schedule 21.08.2013