云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

消息队列_南宁企业网站_测评

小七 141 0

消息队列_南宁企业网站_测评

本博客是6篇系列文章的第6部分,介绍如何在ABAP中使用面向对象的设计模型。

第1部分-将简单的过程模型转换为等效的OO设计,重点介绍封装和抽象的OO原则。

第2部分-通过重构程序来进一步探索抽象将选定的静态类转换为可实例化类。

第3部分-进一步重构程序,以利用继承的OO原则。

第4部分-坚持单一责任原则,对程序进行优化,将每个类限制为只执行其预期的操作。

第5部分-删除不再服务于某个类的类目的

第6部分-引入单例OO设计模式,消除了所有静态类。

回顾一下之前的博客,我们采用了一个几乎相同的类的程序,并消除了不必要的重复。以下是我们在上一篇博客中留下的源代码:

打开你最喜欢的ABAP编辑器,复制这个ABAP程序,然后应用更改来消除所有静态类。对于那些在他们的站点上没有ABAP2XLSX可用的人,用以下源代码替换类excel\u电子表格\u管理器:

并在报告语句后包含以下本地异常类定义:

动机

如本系列之前的一个博客中所述,静态类为ABAP程序员提供了一个踏脚石,使他们更加熟悉面向对象的原则,因为它们与ABAP函数组相似,具体来说:

函数组和静态类都只提供它们定义的属性和数据字段的单一副本。函数组和静态类都加载到存储中,第一次引用它的一个成员。静态类的方法可以通过类名调用,类似于简单地通过功能模块名调用功能模块的方式。

虽然对于那些新的OO概念来说,静态类更容易掌握,但是它们在真正面向对象的设计中所能提供的东西上有局限性。事实上,这本书的规则5.3是官方的ABAP编程指南(https://www.sap-press.com/official-abap-programming-guidelines\u 2093/),阿里大数据应用平台,状态(第162页):

规则5.3:不要使用静态类

最好使用对象而不是静态类。如果你不想有多个实例化,你可以使用单例。

这本书继续提供关于为什么应该避免静态类的更多细节,其中:

显式对象创建对于面向对象编程是必不可少的。静态构造函数只提供有限的功能。静态类缺乏对多态性的支持。

理解多个实例化

让我们花点时间来理解规则5.3中出现的短语"不想有多个实例化"。静态类没有实例化的概念。当程序执行时,为静态类定义的任何属性在存储器中只存在一次。相反,对于一个提供实例化的类来说,在程序执行时,有可能同时存在该类的多个实例,在每种情况下,类实例都是由create object语句(或该语句的某些变体,如运算符new)创建的。假设我们有一个静态类car,定义如下:

请注意,set\u color和set\u year这两个方法是静态方法,因为它们是用class methods语句定义的。还要注意,color和year这两个属性是静态属性,因为它们是用class data语句定义的。实际上,这个类的所有属性和方法都是静态定义的,使这个类成为一个静态类。实例化这样一个类是没有必要的,事实上,这是不正确的;我们只需要在代码中开始使用这个类,如:

在出现这些语句的程序期间,class car的属性color和year在存储中只存在一次。

class car被定义为静态类的问题是我们只能用它来跟踪一辆车的color和year。如果我们需要跟踪大量汽车对象的颜色和年份,那么我们需要更改类,以便a)它提供实例化,b)我们创建类的多个实例来表示我们要跟踪的汽车的多个实例。下面是car类需要如何更改以适应多个实例化:

静态版本和上面版本之间的区别是:

从类定义语句中删除了限定符摘要。class methods语句已更改为methods语句。类数据语句已更改为数据语句。这两个方法使用实例自引用(me)而不是类名引用各自的属性,使用实例选择器(->)而不是类选择器(=>)。

现在我们可以创建多个cars实例并跟踪它们各自的颜色和年份,如:

因为car类不再是静态的,大数据服务,它的属性color和year在class car的每个实例中只存在一次,而不是在每个程序执行时只存在一次。

Singletons

让我们花点时间来理解规则5.3中出现的短语"你可以使用Singletons"。singleton是一种面向对象的设计模式,它保证在程序执行期间只存在一个类的单个实例。它是《设计模式:可重用面向对象软件的元素》(Gamma,Helms,Johnson,一个实例类在程序执行过程中不需要存在多个实例,它只是启用了这个功能。根据本系列之前的一篇博客,当我们将类excel\u spreadsheet\u manager从静态类转换为实例类时,我们获得了在程序执行期间多次实例化此类的能力。但是,您会注意到我们的示例程序只实例化了这个类一次。实际上,对于我们的示例程序中所有促进多个实例化的类,我们从来没有利用它们中的任何一个实例化一次以上。这是因为我们只需要这些类的一个实例来处理我们的处理需求。因为对于这些类,我们"不想有多个实例",如规则5.3中所述,那么我们"可以使用单例"来确保在执行期间这些类只有一个实例。

将我们的第一个类从静态转换为单例

开始,让我们使用静态类flight\u records\u retriever,并通过以下更改将其转换为单例类:

更改其类定义语句,删除限定符摘要并在限定符final之后添加限定符create private。在其公共部分中,在方法检索\u记录的定义之前包含以下语句:

通过将"类方法"替换为"方法",将方法检索\u记录从静态方法更改为实例方法。在类实现语句之后包括以下静态构造函数方法:

完成这些更改后,类飞行记录\u retriever应如下所示:

此时,调用方法retrieve \u records of class flight \u retriever时语法检查将失败。修改语句:

之后语法检查将通过。