在ABAP中实施MVVM

毕业后,我作为C#程序员工作了几年。我一直在使用MVVM设计模式开发WPF应用程序。然后我切换到ABAP。令我大吃一惊的是,我发现ABAP更像是一种过程语言,而不是面向对象的语言,尽管SAP正在努力推进OO范式。 MVC体系结构模式通常用于将业务逻辑与GUI分开。每次我尝试实现MVC模式时,都会遇到某些困难,这些问题使程序的维护比在程序中编写更加困难。尽管事实是对MVC实现进行了详细描述,并在ABAP对象中的“设计模式”一书中以及在专用资源(sapland.rublogs.sap.com等),逻辑分离的问题依然存在。在ABAP上的MVC实现中,模型仍然是一个独立的部分,并且视图和控制器密切相关。View和Controller之间的强大耦合使其难以维护和扩展。以下内容描述了发生这种情况的原因以及解决方法。



MVC和MVVM模式



在本文中,我不会详细描述MVC和MVVM模式如何工作。我只给出我们将来需要的要点。



MVC和MVVM之间的主要区别在于,在第一个Controller中,控制器既了解视图又了解模型,还允许View知道模型。



图片



在MVVM模式中,层之间的关系较弱。View仅知道ViewModel和ViewModel only模型。View通过DataContex引用从ViewModel接收数据。



图片



MVVM模式设计用于C#中的WPF开发。但是他的想法也可以应用于ABAP。



ABAP中的MVC问题



实施MVC时,通常将Model类引入全局定义,将View和Controller类引入本地。局部类的使用是由于需要与GUI元素进行交互。关键是不可能在ABAP类上构建完整的GUI。在View类中,可以使用用于形成GUI的功能(CL_SALV_TABLE,REUSE_ALV_GRID_DISPLAY等),但这还不够。在教室中无法创建GUI状态,标题,屏幕,PBO,PAI。



本地视图和控制器有几个缺点:



  1. View和Controller可以访问选择屏幕的所有全局变量和参数。
  2. PBO PAI Controller View ( ALV) View ( ALV). View, Controller, View Controller. , .. , Low Coupling.


MVVM ABAP MVA



为了利用ABAP中的MVVM并使各层更加独立,我为自己定义了以下开发模式。



图片



由于不可能在ABAP上以纯格式实现MVVM,因此使用ViewModel并非完全正确。因此,我使用Application代替ViewModel和Controller。



逻辑分离原理类似于MVVM原理。 View将用户命令传递给Application,然后Application对模型进行操作。没有反馈。

ABAP应用程序的功能是只能在用户操作后才能更新视图。即使某些异步过程更改了模型,它也将无法启动视图的更新。此功能使您可以减弱模型与视图的关系,并将将视图更新的功能委托给视图本身。换句话说,创意本身必须决定何时更新自身,何时不更新。



MVA概念



MVA实现基于一种面向对象的方法,其中将为体系结构的每一层实现一个或多个类。每个层都有许多属性。



查看(查看和IView):



  • MVA与IView视图抽象一起使用。所有View类都必须包含IView实现。
  • IView包含需要与模型进行交互的事件
  • IView包含上下文-指向需要向用户显示的模型数据的链接
  • 视图可以包含不需要与模型交互的业务逻辑。例如,如果您想从ALV实施交易对手卡,则此逻辑将应用于视图。
  • View在与View类关联的一组函数中包含GUI元素。


应用:



  • 用作视图和模型的绑定,并且是应用程序的入口点。
  • 具有启动条件-一组参数,用于确定应启动应用程序的参数。通常,这些是选择屏幕的参数。
  • 应用标准包括模型和表示标准。例如,如果选择屏幕要求您输入过帐日期并指定PDF或ALV报告输出标记,则过帐日期将参考模型标准,而PDF和ALV标志将参考显示标准。
  • 启动条件将传递给应用程序设计器。该应用程序创建模型和视图,订阅视图事件,并将视图上下文绑定到模型。


模型:



  • 包含视图所需的公共属性。
  • 包含用于计算模型的标准和初始化方法。


MVA实施



让我们使用物料流报告的示例来考虑MVA的实现。数据刷新按钮将用作与模型的交互。



类图将如下所示。







模型。模型设计者将数据选择标准作为输入。该类将具有用于初始化和更新数据的方法,以及具有要显示的数据的属性。















IView。视图界面包含用于设置上下文,显示视图,事件和定义上下文类型的方法。















IView包含上下文结构的描述,并且结构字段必须是引用







视图。该视图实现IView接口。此外,所有用户事件均由View类注册,并且仅引发那些需要由应用程序处理的事件。在事件参数中,必须传递视图中所需的所有数据(例如,选定的ALV线)



ALV视图中View类的







实现在此实现中,我们需要定义GUI状态,为此,我们将创建一个FM并将其连接到CL_SALV_TABLE实例







。重要的是,所有UI事件都必须由View接收(在这种情况下,通过ON_USER_COMMAND),如果必要,则View可以为应用程序生成RAISE EVENT。这种方法使视图和应用程序更加独立。



应用。应用程序设计人员将应用程序条件(选择屏幕参数)作为输入,实例化Model和View,订阅View事件,并将View上下文绑定到Model。构造函数是应用程序了解View的唯一位置。应用程序包含用于启动程序的RUN方法。可以将启动应用程序与使用预定义的屏幕参数启动事务进行比较。这使得它可以在没有提交的情况下从其他程序中使用。







启动应用程序。现在,我们正在制作一个程序,将启动该应用程序。







就是这样,应用程序已准备就绪。您可以观看结果。







视图方面的业务逻辑。不需要调用模型和控制器的事件可以在View本身中处理。



例如,如果您想通过双击MATNR来实现打开MM03,则可以在“视图”侧完成此逻辑的处理。







基于以下考虑,此逻辑已移至“视图”级别:不需要为其他数据处理模型;该逻辑仅适用于ALV,即 如果以Excel或PDF的形式实现了View,则无法处理此事件。



参考



ABAP对象中的设计模式

初学者的模式:MVC,MVP和MVVM

ABAP中的体系结构模式:MVC,MVP,MVVM,MVA



All Articles