代码之家  ›  专栏  ›  技术社区  ›  jcjr Thunder-KC Inc

ABAP中事件的目的是什么?

  •  0
  • jcjr Thunder-KC Inc  · 技术社区  · 6 年前

    从A学习ABAP book ,我到了对象/类事件。我知道来自其他语言(如c/winforms)的事件是GUI中用户操作(如按钮单击)和交互后执行的一些代码之间的连接。还可以从代码中触发此类事件来模拟用户操作,这有时很有用。

    这本书以这个例子结尾 RAISE EVENT 从代码手动触发事件的语句。在其他在线来源(例如 1 , 2 , 3 , 4 , 5 )如果我可以直接调用对象方法,我看不到从代码中引发事件的任何原因。在我看来,这似乎是不必要的代码层。在ABAP中使用事件的目的或好处是什么?我怀念什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   jcjr Thunder-KC Inc    6 年前

    谢谢你的评论,他们让我走上了正轨。许多来源的问题是,它们展示了一个非常简单的例子,在这个例子中,事件不会带来任何好处。 它与对几行代码使用OOP相同,或者使用递归而不是简单的循环。 这样简单的例子学习语法很好,但不足以理解其目的或好处。

    在一个类中使用事件和处理程序对我来说没有多大意义。大多数例子都有两个类(仍然把可以单独存在的东西放在一起)。对于我来说,一个包含三段独立代码的示例带来了最大的好处。据我了解,关键是:

    1. 类A具有由命令定义的事件 EVENTS . 类A不需要引用其他类。用我的话来说:一些有趣的情况,其他可能发生在内部。这个班不了解外面的世界(没有依赖性),但它可以向世界发出发生这种情况的信号。
    2. 只有对象A可以通过命令从其内部代码引发(激发、触发)事件 RAISE EVENT . 用我的话来说:外界(任何可能关心和订阅的人)都知道情况发生了。
    3. 类B通过命令为类A定义方法/处理程序 METHODS - FOR EVENT – OF 可以用来处理事件。这个班需要知道A班及其活动。用我的话说:B类提供代码来处理可能在A类中发生的情况。
    4. 对于这两个类(可能是创建类)都有知识的第三段代码说:当类A中的事件引发时,使用这个处理程序by命令 SET HANDLER - FOR . 最重要的是,它也可以是不同于B类的另一个处理程序。用我的话说:当使用A类时,通过从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.
    

    添加:

    • 在现实场景中,在类B(处理程序)的对象中引用类A(raiser)的对象是很有用的。您可能需要从A类获取有关该事件的其他信息,但这不是必需的。
    • 可以将更多处理程序附加到一个事件。

    当意识到某些设计模式时,其目的或好处就更加清楚了。一些是在福利中提到的。我将遵循从一般到特殊的层次结构:

    1. 固体
    2. 松耦合/分离/分离问题
    3. 依赖倒置原则
    4. 观察者可观察/订阅者发布者

    很高兴看到对我答案的评论。