Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何共享本地课程?_Oop_Abap - Fatal编程技术网

Oop 如何共享本地课程?

Oop 如何共享本地课程?,oop,abap,Oop,Abap,我目前正在开发一个相当复杂的ABAP应用程序,该应用程序将分为几个模块,每个模块执行作业的特定部分: 一个用于从多个来源收集一些数据 一个用于在UI中显示该数据(SALV网格,如果有必要) 一个是基于这些数据做一些生意 根据我的计划,每个模块都将是一个全球课程。但是,这些类之间可能需要共享一些逻辑:辅助子程序、DB访问逻辑等等。目前所有这些都是一组本地类 我知道这些类也可能是全球性的,但这意味着将它们(以及许多内部数据结构)公开给公众,这是我不愿意看到的。另一种方法是在我的全局类之间与它们共

我目前正在开发一个相当复杂的ABAP应用程序,该应用程序将分为几个模块,每个模块执行作业的特定部分:

  • 一个用于从多个来源收集一些数据
  • 一个用于在UI中显示该数据(SALV网格,如果有必要)
  • 一个是基于这些数据做一些生意
根据我的计划,每个模块都将是一个全球课程。但是,这些类之间可能需要共享一些逻辑:辅助子程序、DB访问逻辑等等。目前所有这些都是一组本地类

我知道这些类也可能是全球性的,但这意味着将它们(以及许多内部数据结构)公开给公众,这是我不愿意看到的。另一种方法是在我的全局类之间与它们共享include,但据说这是一种糟糕的设计


所以,我的问题是:真正的算盘是如何解决这样的问题的?

如果你的应用程序有你想象的那么大,你应该使用多个包来组织它。您肯定需要处理非面向对象的东西,如功能模块、数据字典对象和其他不能作为类的一部分的东西,因此使用类作为组织应用程序的基本手段在非常小和专门的应用程序之外是行不通的


此外,如果您认为“DB访问逻辑”应该“在类之间共享”,那么您的计划中似乎嵌入了一些非常严重的缺陷。没有进一步的信息很难猜测,但我强烈建议您招募在设计和实现这种规模的应用程序方面有经验的人——至少要正确理解基本概念

您可能需要阅读一些有关模型-视图-控制器设计模式的内容。在UI中显示数据-将是一个“视图”。数据的收集和更新都将纳入一个“模型”。业务逻辑应该在“控制器”中实现为视图和模型之间的交互

也就是说,一种方法是利用ABAPOO中提供的友谊特性

例如:全局创建模型和视图类,但只允许它们被私有实例化,然后授予对控制器的私有组件访问权。类别定义如下:

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

此外,最好将控制器设置为单例,并在视图和模型中存储对它的引用。当视图和模型被实例化时,通过强制控制器
被绑定
,我们可以有效地确保这三个类按照您的意愿存在。

下面是一个如何访问报表中定义的本地类的示例

报告与全班同学一起讨论。 使用该类的报表。 当然,这不是一个聪明的解决方案,因为每个方法调用都必须是动态调用

CALL METHOD lr_object->('TEST').

但是,这可以通过使用定义类的方法的全局接口来解决(当然,如果它们不是静态的,我假设它们不是静态的)。然后,您必须通过接口控制每个实例。您的目标将实现,因为只有接口将在全球公开,实现将保留在本地类中。

回到您最初的问题:我觉得您在开发中已经在使用类似MVC模式的东西,所以您唯一的问题是一些例程将由模型、视图和控制器公开使用

在这种情况下,我强烈建议将这些例程放在全局可用类中,或者在已经存在的类中实现getter方法来访问这些功能


任何像
\PROGRAM=ZZZ_PJ1\CLASS=LCL_TEST
这样的黑客有时都是必要的,但在这里并不重要。

尤其是
DB访问逻辑
听起来像是另一个助手类的需要。也许您可以创建一个主类并从这个主类继承子例程(但这也可能是一个非常糟糕的主意-取决于您的实际代码)。我关心的是找到一种方法在应用程序模块之间共享它们,而不使它们成为全局的(即公共的)。将它们拆分为单独的包并不是那么大,是的,我意识到它将包括类以外的内容。共享数据库的东西有什么不对?该应用程序有多个入口点,类似的东西可能需要在不同的模块中检索。我没有感觉到你在尝试学习新东西,但你正在寻找一些神奇的疗法,使你的破损设计看起来不那么破损。祝你好运-我出去了…看起来你不是在教什么。“问问知道怎么做的人”——非常好的建议,谢谢。但我需要理解的魔法概念是什么?“破设计”——论点、建议?它有什么缺点?我怀疑在模型和视图中存储对控制器的引用是否符合MVC原则(反之亦然),但私有构造函数和友谊的整个想法听起来很有趣。只是一个注释,定义类之间的友谊听起来从来都不有趣,相当可怕。一个有趣的技巧。然而,维护以这种方式设计的应用程序可能很容易成为一场灾难。我想我会放弃本地课程的想法:共享的东西必须向公众公开。好结论!我使用局部类主要用于组织全局类的内部结构(即,用于构建没有可重用函数但在全局类内部形成一组连贯的逻辑的委托对象)。@AlexKiselev你能举一个这样的例子说明事情是如何变成“灾难”的吗?我在这里谈论的是使用全局接口的方法。对于方法的动态调用,我可以同意。我主要是指动态调用。然而,即使在接口方法的情况下,“使用位置列表”是否能够找到dyn
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').