我目前正在开发一个相当复杂的ABAP应用程序,该应用程序将分成几个模块,每个模块执行工作的特定部分:
根据我的计划,每个模块都将是一个全球级的。但是,这些类之间可能需要共享一些逻辑:辅助子例程,DB访问逻辑等。所有这些都是目前的一组本地课程。
我知道这些类也可以全局化,但这意味着将它们(以及一些内部数据结构)暴露给公众,我不愿意这样做。另一种方法是在我的全球课程之间与他们分享包含,但据说这是一个糟糕的设计。
所以,我的问题是:真正的ABAPers如何解决这样的问题?
答案 0 :(得分:0)
您可能希望对模型 - 视图 - 控制器设计模式进行一些阅读。在UI中显示数据 - 将是"视图"。收集和更新数据都将被纳入"模型" 。业务逻辑应该可以作为视图和模型之间的交互实现在" Controller"。
那就是说,一种方法是利用ABAP OO提供的友谊功能。
作为示例:全局创建模型和视图类,但只允许私有地实例化它们,然后授予对控制器的私有组件访问权限。类定义如下:
CLASS zcl_example_view DEFINITION
PUBLIC
FINAL
CREATE PRIVATE
GLOBAL FRIENDS zcl_example_controller
CLASS zcl_example_model DEFINITION
PUBLIC
FINAL
CREATE PRIVATE
GLOBAL FRIENDS zcl_example_controller
CLASS zcl_example_controller DEFINITION
PUBLIC
FINAL
CREATE PUBLIC
此外,最好使控制器单例并在视图和模型中存储对它的引用。通过在实例化视图和模型时强制执行控制器IS BOUND
,我们可以有效地确保这三个类只存在于您希望的位置。
答案 1 :(得分:0)
以下是如何访问报表中定义的本地类的示例。
REPORT ZZZ_PJ1.
CLASS lcl_test DEFINITION FINAL.
PUBLIC SECTION.
METHODS:
test.
ENDCLASS.
CLASS lcl_test IMPLEMENTATION.
METHOD test.
WRITE 'test'.
ENDMETHOD.
ENDCLASS.
REPORT ZZZ_PJ2.
CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
main.
ENDCLASS.
CLASS lcl_main IMPLEMENTATION.
METHOD main.
DATA:
lr_object TYPE REF TO object.
CREATE OBJECT lr_object
TYPE ('\PROGRAM=ZZZ_PJ1\CLASS=LCL_TEST')
CALL METHOD lr_object->('TEST').
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_main=>main( ).
当然,这不是一个聪明的解决方案,因为每个方法调用都必须是动态调用。
CALL METHOD lr_object->('TEST').
这可以通过使用全局接口来解决,这些接口将定义类的方法(当然,如果它们不是静态的,我认为它们不是静态的)。然后,您必须通过界面控制每个实例。然后,您的目标将被实现,因为只有接口将全局公开,实现将保留在本地类中。
答案 2 :(得分:0)
回到你最初的问题:我听起来像你在你的开发中已经使用了类似MVC模式的东西,所以你唯一的问题是一些例程应该由模型,视图和控制器公开使用。
在这种情况下,我强烈建议将这些例程放在全局可用类中,或者在现有类中实现getter方法来访问这些函数。
像\PROGRAM=ZZZ_PJ1\CLASS=LCL_TEST
这样的任何黑客有时都是必不可少的,但不是这里的。{/ p>
答案 3 :(得分:-2)
如果您的应用程序与您发出的声音一样大,则应使用多个程序包对其进行组织。您肯定必须处理非OO的东西,比如函数模块,数据字典对象和其他不能成为类的东西,所以使用类作为组织应用程序的基本方法将无法在非常小的范围内工作。专业应用程序。
此外,如果您认为“数据库访问逻辑”应该是“在类之间共享”,那么您的计划中可能会存在一些非常严重的缺陷。没有进一步的信息很难猜测,但我强烈建议你招募一个有设计和实现该规模应用经验的人 - 至少要使基本概念正确。