SAP 某 ABAP 系统标准类中仅有 5.4% 公有属性被 READ-ONLY 修饰,原因竟然是…

笔者之前的文章被很多人误解的 ABAP 关键字:READ-ONLY 发布之后,有朋友询问,SAP 标准实现里,对这个 READ-ONLY 使用的场景多吗?

其实这个问题我们可以自己找到答案。

思路是选择一个 SAP 系统,统计出类的总数,这些类总共定义了多少个属性,其中有多少属性,使用了 READ-ONLY 来修饰。

首先打开 SE80 的 Repository Information System,这里仅能通过类属性的名称进行统计。

但我们的需求是,根据类公有属性经过 READ-ONLY 修饰与否来统计,所以这条路走不通。

下图展示了 SE80 中的 Repository Information System,仅能通过类属性的名称进行查询。

那么还是直接找表吧。类属性的名称和 READ-ONLY 标志位,肯定是存储在后台某张数据库表里的。

笔者本公众号过去大量的文章,通过很多例子,反复介绍了如何自行查找存储了指定信息的数据库表。

通过文章里介绍的技巧,我们找到了数据库表 SEOCOMPODF.

这张表的 CLSNAME,CMPNAME 和 ATTRDONLY 字段,分别存储了类的名称,类属性的名称,以及类属性是否被 READ-ONLY 修饰的状态信息。

笔者的 SAP CRM 系统上,总共有 260 万个类属性(包含 SAP 标准实现和 Z 实现)。

其中 READ-ONLY 属性有 9 万 5 千个,占总数的 3.6% 左右。

当然我们可以把统计范围再缩小一点:只统计 SAP 标准类里的 Public 属性,看其中到底有多少,启用了 READ-ONLY.

在类名称 CLSNAME 的选择条件里,将那些通过 Y 或者 Z 开头的类过滤掉。

Exposure 字段统计条件为 2,代表 Public 属性。

在笔者系统里,总共有 175 万个公有属性。

其中 9 万 4 千个公有属性被 READ-ONLY 修饰,占总数 5.4% 左右。

这个统计数据充分说明,SAP 自身也是严格按照 Clean ABAP 编程规范里的规则,慎用 READ-ONLY 来进行开发的。

SAP 建议慎用 READ-ONLY 的原因,在笔者前一篇文章已经详细论述过,本文不再赘述。

被很多人误解的 ABAP 关键字:READ-ONLY

ABAP 和类公有属性的 READ-ONLY 相关的,还有另一个概念:修改保护(Change protection),有时也称写保护(Write Protection).

通过实际的例子来介绍修改保护的概念。

下面的代码可以通过编译,但是执行时,会遇到运行时错误:

MOVE_TO_LIT_NOTALLOWED_NODATA
 
FORM read_only USING iv_i TYPE int4.
  WRITE:/ iv_i.

  iv_i = 2.
ENDFORM.

START-OF-SELECTION.

PERFORM read_only USING 1.

错误消息:

A new value is to be assigned to the field, although this field is entirely or partly protected against changes.

大意是 subroutine 的输入参数 iv_i 是被修改保护的,而其实现体内的代码,试图对这个被保护的变量赋值,因此产生了运行时错误。

在 ABAP 调试器里,能清楚看到输入参数 iv_i,被标注了 Read Only 的 Checkbox.

Subroutine 已经是一种被废弃的语法,不推荐再使用。

那么我们把上述代码移植到 ABAP 类里面,结果又如何呢?

下面代码第 12 行,试图在类的方法里,修改输入参数的值:

REPORT zbook.

CLASS lcl_test DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: test IMPORTING iv_i TYPE int4.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.
  METHOD: test.
    WRITE:/ iv_i.

    iv_i = 45.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  lcl_test=>test( iv_i = 4 ).

这段代码无法通过编译,遇到错误消息:

the field iv_i cannot be modified.

如果把上图第 12 行代码注释掉,就可以通过编译,成功激活代码。

在调试器里,可以看到输入参数的 READ-ONLY Flag 被勾上了。

看来面向对象的编程范式确实比 Subroutine 健壮很多,可以从语法检查层面规避很多问题。

如果给输入参数 iv_i 添加另一个 VALUE 关键字进行修饰,如下图图例 1 的位置所示,在运行时我们发现,该输入参数的 READ-ONLY 标志位,已经被清除了。

这样一来,在方法内部,可以对这个输入参数进行赋值了。

VALUE 关键字其实蕴含了另一个关于 ABAP 方法调用时,参数传递方式的知识点。

用 VALUE 关键字修饰输入参数,意思就是参数传递采取传值方式进行。

下图第 18 行的实际输入参数 lv_input,在调用 test 方法时,该参数的实际值 4,被传递进 test 方法内,拷贝给 test 的形式参数 iv_input.

因此在 test 方法内部,第 11 行的 iv_i = 45, 修改的是形式参数 iv_i 的值,从拷贝进来的 4 修改成 45,对实际参数 lv_input 没有任何影响,其值仍然为 4 不变。

而如果去掉 VALUE, 参数传递采取 ABAP 默认的引用传递,此时形式参数 iv_i 和实际输入参数 lv_input 具有同一个引用,而 ABAP 输入参数是具有修改保护的,因此在引用传递的前提下,方法内试图输入参数 iv_i 的值,会遇到上面提到的语法错误:the field iv_i cannot be modified.

ABAP 方法和函数调用的参数传递,默认都是引用传递。但是在 RFC 函数的参数声明里,必须使用值传递方式。

希望本文介绍的 READ-ONLY 和修改保护的知识点,能够帮助大家弥补上相关的知识漏洞,感谢阅读。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 支持向量机非线性回归通用MATLAB程序解析 #### 一、概述 本文将详细介绍一个基于MATLAB的支持向量机(SVM)非线性回归的通用程序。该程序采用支持向量机方法来实现数据的非线性回归,并通过不同的核函数设置来适应不同类型的数据分布。此外,该程序还提供了数据预处理的方法,使得用户能够更加方便地应用此程序解决实际问题。 #### 二、核心功能与原理 ##### 1. 支持向量机(SVM) 支持向量机是一种监督学习模型,主要用于分类和回归分析。对于非线性回归任务,SVM通过引入核技巧(kernel trick)将原始低维空间中的非线性问题转换为高维空间中的线性问题,从而实现有效的非线性建模。 ##### 2. 核函数 核函数的选择直接影响到模型的性能。本程序内置了三种常用的核函数: - **线性核函数**:`K(x, y) = x'y` - **多项式核函数**:`K(x, y) = (x'y + 1)^d` - **径向基函数(RBF)**:`K(x, y) = exp(-γ|x - y|^2)` 其中RBF核函数被广泛应用于非线性问题中,因为它可以处理非常复杂的非线性关系。本程序默认使用的是RBF核函数,参数`D`用于控制高斯核函数的宽度。 ##### 3. 数据预处理 虽然程序本身没有直接涉及数据预处理的过程,但在实际应用中,对数据进行适当的预处理是非常重要的。常见的预处理步骤包括归一化、缺失值处理等。 ##### 4. 模型参数 - **Epsilon**: ε-insensitive loss function的ε值,控制回归带宽。 - **C**: 松弛变量的惩罚系数,控制模型复杂度与过拟合的风险之间的平衡。 #### 三、程序实现细节 ##### 1. 函数输入与输出 - **输入**: - `X`: 输入特征矩阵,维度为(n, l),其中n是特征数量,l是样本数量。 - `Y`: 目标值向量,长度为l。 - `Epsilon`: 回归带宽。 - `C`: 松弛变量的惩罚系数。 - `D`: RBF核函数的参数。 - **输出**: - `Alpha1`: 正的拉格朗日乘子向量。 - `Alpha2`: 负的拉格朗日乘子向量。 - `Alpha`: 拉格朗日乘子向量。 - `Flag`: 标记向量,表示每个样本的类型。 - `B`: 偏置项。 ##### 2. 核心代码解析 程序首先计算所有样本间的核矩阵`K`,然后构建二次规划问题并求解得到拉格朗日乘子向量。根据拉格朗日乘子的值确定支持向量,并计算偏置项`B`。 - **核矩阵计算**:采用RBF核函数,通过`exp(-(sum((xi-xj).^2)/D))`计算任意两个样本之间的相似度。 - **二次规划**:构建目标函数和约束条件,使用`quadprog`函数求解最小化问题。 - **支持向量识别**:根据拉格朗日乘子的大小判断每个样本是否为支持向量,并据此计算偏置项`B`。 #### 四、程序扩展与优化 - **多核函数支持**:可以通过增加更多的核函数选项,提高程序的灵活性。 - **自动调参**:实现参数自动选择的功能,例如通过交叉验证选择最优的`Epsilon`和`C`值。 - **并行计算**:利用MATLAB的并行计算工具箱加速计算过程,特别是当样本量很大时。 #### 五、应用场景 该程序适用于需要进行非线性回归预测的场景,如经济预测、天气预报等领域。通过调整核函数和参数,可以有效应对各种类型的非线性问题。 ### 总结 本程序提供了一个支持向量机非线性回归的完整实现框架,通过灵活的核函数设置和参数调整,能够有效地处理非线性问题。对于需要进行回归预测的应用场景,这是一个非常实用且强大的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值