ABAP 中事件的目的是什么?
What is the purpose of events in ABAP?
从 book 学习 ABAP,我参加了 object/class 活动。我知道来自其他语言(如 C#/WinForms)的事件是 GUI 中的用户操作(例如按钮单击)与交互后执行的一些代码之间的联系。也可以通过代码触发此类事件以模拟用户操作,这有时很有用。
本书以 RAISE EVENT
语句结束示例,该语句从代码中手动触发事件。在其他在线资源中也是如此(例如 1, 2, 3, 4, 5)。如果我可以直接调用对象方法,我看不出有任何理由从代码中引发事件。对我来说,这似乎是不必要的代码层。在 ABAP 中使用事件的目的或好处是什么?我想念什么?
感谢您的评论;他们让我走上了正确的轨道。许多来源的问题是它们展示了非常简单的例子,其中事件没有带来任何好处。 几行代码使用OOP,或者用递归代替简单的循环。这样简单的例子很好学习语法,但不足以理解目的或好处.
同时使用事件和处理程序 class 对我来说意义不大。大多数例子都带有两个 classes(仍然把可以单独的东西放在一起)。对我来说,一个包含三段独立代码的示例带来了最大的好处。据我了解,重点是:
- Class A 有一个由命令
EVENTS
定义的事件。 Class A 不需要引用其他 classes。用我的话来说:内部可能会发生一些对其他人来说有趣的情况。 class 不了解外部世界(无依赖性),但它可以向世界发出信号表明情况已发生。
- 只有对象 A 可以通过命令
RAISE EVENT
从其内部代码引发(触发、触发)事件。用我的话来说:在外面广播(向任何可能关注和订阅的人)发生了这种情况。
- Class B 通过命令
METHODS - FOR EVENT – OF
为 class A 定义了 method/handler 可以用来处理事件。这个 class 需要知道 class A 和它的事件。用我的话来说:Class B 提供代码来处理 class A 中可能发生的情况。
- 第三段了解两个 classes 的代码(可能是创建它们)说:当 class A 中的事件通过命令
SET HANDLER - FOR
引发时使用此处理程序。最重要的是,它也可以是来自与 B 不同的 class 的另一个处理程序。用我的话说:当使用 class A 时,我可以通过从一系列A 不知道的合适的处理程序。
因为遗漏了一个很好的例子,这里演示一下要点:
CLASS lcl_class_a DEFINITION.
PUBLIC SECTION.
DATA a1 TYPE I.
EVENTS: my_event.
METHODS: method_raising_event.
ENDCLASS.
CLASS lcl_class_a IMPLEMENTATION.
METHOD method_raising_event.
"some working code would be here
RAISE EVENT my_event.
ENDMETHOD.
ENDCLASS.
CLASS lcl_class_b DEFINITION.
PUBLIC SECTION.
"This methods could be run after the event.
METHODS: handle_event1 FOR EVENT my_event OF lcl_class_a,
handle_event2 FOR EVENT my_event OF lcl_class_a.
ENDCLASS.
CLASS lcl_class_b IMPLEMENTATION.
METHOD handle_event1.
WRITE: / 'Event in class raised'.
ENDMETHOD.
METHOD handle_event2.
" Some code, e.g. logging to a file.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(object_a) = new lcl_class_a( ).
DATA(object_b) = new lcl_class_b( ).
"Binding event and handler.
SET HANDLER object_b->handle_event1 FOR object_a.
CALL METHOD object_a->method_raising_event.
增加:
- 在现实生活场景中,在 class B(处理程序)的对象中引用 class A(raiser)的对象是很有用的。您可能需要从 class A 那里获得有关该事件的其他信息。但这不是必需的。
- 一个事件可以附加更多处理程序。
了解一些设计模式后,目的或好处会更加清晰。福利中提到了一些。我会按照从一般到特殊的层次结构进行排序:
- 固体
- 松散耦合/解耦/关注点分离
- 依赖倒置原则
- 观察者——可观察的/订阅者——发布者
很高兴看到对我的回答的评论。
从 book 学习 ABAP,我参加了 object/class 活动。我知道来自其他语言(如 C#/WinForms)的事件是 GUI 中的用户操作(例如按钮单击)与交互后执行的一些代码之间的联系。也可以通过代码触发此类事件以模拟用户操作,这有时很有用。
本书以 RAISE EVENT
语句结束示例,该语句从代码中手动触发事件。在其他在线资源中也是如此(例如 1, 2, 3, 4, 5)。如果我可以直接调用对象方法,我看不出有任何理由从代码中引发事件。对我来说,这似乎是不必要的代码层。在 ABAP 中使用事件的目的或好处是什么?我想念什么?
感谢您的评论;他们让我走上了正确的轨道。许多来源的问题是它们展示了非常简单的例子,其中事件没有带来任何好处。 几行代码使用OOP,或者用递归代替简单的循环。这样简单的例子很好学习语法,但不足以理解目的或好处.
同时使用事件和处理程序 class 对我来说意义不大。大多数例子都带有两个 classes(仍然把可以单独的东西放在一起)。对我来说,一个包含三段独立代码的示例带来了最大的好处。据我了解,重点是:
- Class A 有一个由命令
EVENTS
定义的事件。 Class A 不需要引用其他 classes。用我的话来说:内部可能会发生一些对其他人来说有趣的情况。 class 不了解外部世界(无依赖性),但它可以向世界发出信号表明情况已发生。 - 只有对象 A 可以通过命令
RAISE EVENT
从其内部代码引发(触发、触发)事件。用我的话来说:在外面广播(向任何可能关注和订阅的人)发生了这种情况。 - Class B 通过命令
METHODS - FOR EVENT – OF
为 class A 定义了 method/handler 可以用来处理事件。这个 class 需要知道 class A 和它的事件。用我的话来说:Class B 提供代码来处理 class A 中可能发生的情况。 - 第三段了解两个 classes 的代码(可能是创建它们)说:当 class A 中的事件通过命令
SET HANDLER - FOR
引发时使用此处理程序。最重要的是,它也可以是来自与 B 不同的 class 的另一个处理程序。用我的话说:当使用 class A 时,我可以通过从一系列A 不知道的合适的处理程序。
因为遗漏了一个很好的例子,这里演示一下要点:
CLASS lcl_class_a DEFINITION.
PUBLIC SECTION.
DATA a1 TYPE I.
EVENTS: my_event.
METHODS: method_raising_event.
ENDCLASS.
CLASS lcl_class_a IMPLEMENTATION.
METHOD method_raising_event.
"some working code would be here
RAISE EVENT my_event.
ENDMETHOD.
ENDCLASS.
CLASS lcl_class_b DEFINITION.
PUBLIC SECTION.
"This methods could be run after the event.
METHODS: handle_event1 FOR EVENT my_event OF lcl_class_a,
handle_event2 FOR EVENT my_event OF lcl_class_a.
ENDCLASS.
CLASS lcl_class_b IMPLEMENTATION.
METHOD handle_event1.
WRITE: / 'Event in class raised'.
ENDMETHOD.
METHOD handle_event2.
" Some code, e.g. logging to a file.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(object_a) = new lcl_class_a( ).
DATA(object_b) = new lcl_class_b( ).
"Binding event and handler.
SET HANDLER object_b->handle_event1 FOR object_a.
CALL METHOD object_a->method_raising_event.
增加:
- 在现实生活场景中,在 class B(处理程序)的对象中引用 class A(raiser)的对象是很有用的。您可能需要从 class A 那里获得有关该事件的其他信息。但这不是必需的。
- 一个事件可以附加更多处理程序。
了解一些设计模式后,目的或好处会更加清晰。福利中提到了一些。我会按照从一般到特殊的层次结构进行排序:
- 固体
- 松散耦合/解耦/关注点分离
- 依赖倒置原则
- 观察者——可观察的/订阅者——发布者
很高兴看到对我的回答的评论。