结构的 WITH 语句
WITH statement for structures
在某些语言中,存在简化方法和属性访问单个对象的语法。例如 VB.NET:
With foo
.bar()
.reset(true)
myVar = .getName()
End With
或者正如 Jagger 指出的那样,在 Pascal:
With myBookRec do
Begin
Title := 'Some Book';
Author := 'Victor John Saliba';
ISBN := '0-12-345678-9';
Price := 25.5;
End;
现在我经常发现自己在给定结构上设置大量属性。以设置字段目录的classic为例:
LOOP AT lt_fieldcat INTO ls_fieldcat.
CASE ls_fieldcat-fieldname.
WHEN 'COLUMN_1'.
ls_fieldcat-edit = ''.
WHEN 'COLUMN_2'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-outputlen = 20.
WHEN 'COLUMN_3'.
ls_fieldcat-edit = abap_true.
ls_fieldcat-drdn_hndl = '2'.
ls_fieldcat-drdn_alias = 'X'.
ls_fieldcat-outputlen = 5.
ls_fieldcat-col_pos = 1.
ls_fieldcat-scrtext_s = text-f01.
ls_fieldcat-scrtext_m = text-f01.
ls_fieldcat-scrtext_l = text-f01.
ENDCASE.
MODIFY lt_fieldcat FROM ls_fieldcat.
ENDLOOP.
有什么方法可以在 ABAP 中复制类似 WITH 的功能吗?
如果不是,是否有更好的方法来复制此行为?
我实际上考虑过为字段目录 class 复制 "return this" 方法菊花链。这似乎是一个 WITH 替代方案,但我并不完全相信它的用处,因为您必须为每个结构维护一个 class。
ls_fieldcat = zcl_fieldcat=>new( ls_fieldcat )->edit('')->outputlen(20)->col_post(1)->get().
我认为菊花链方法没有那么有用 - 它并不容易阅读,而且如果出现任何问题,调试起来会非常困难。就个人而言,我可能会使用具有多个可选属性的 "multi-setter":
lr_my_field->set_attributes( edit = abap_true
title = 'foo'
* ...
bar = 'baz' ).
话虽这么说,我对你问题中的代码完全没有问题。清晰可读,简单的数据处理。只需将其放入名为 PREPARE_FIELDCATALOG
的方法中,每个人都知道会发生什么。
使用新的 ABAP 语法,您可以使用 VALUE #( ... )
语句(或 VALUE #( BASE ls_fieldcat ...)
用于修改已分配字段的结构)稍微简化您的代码,该语句可用于模拟 WITH
在 ABAP 中。这不是一个完美的解决方案,特别是如果一个人有一个像你这样的 CASE
结构,但对于初始化结构化变量肯定很整洁。
LOOP AT lt_fieldcat INTO ls_fieldcat.
CASE ls_fieldcat-fieldname.
WHEN 'COLUMN_1'.
ls_fieldcat = VALUE #(
BASE ls_fieldcat
edit = ''
).
WHEN 'COLUMN_2'.
ls_fieldcat = VALUE #(
BASE ls_fieldcat
edit = 'X'
outputlen = 20
).
WHEN 'COLUMN_3'.
ls_fieldcat = VALUE #(
BASE ls_fieldcat
edit = abap_true
drdn_hndl = '2'
drdn_alias = 'X'
outputlen = 5
col_pos = 1
scrtext_s = text-f01
scrtext_m = text-f01
scrtext_l = text-f01
).
ENDCASE.
MODIFY lt_fieldcat FROM ls_fieldcat.
ENDLOOP.
在某些语言中,存在简化方法和属性访问单个对象的语法。例如 VB.NET:
With foo
.bar()
.reset(true)
myVar = .getName()
End With
或者正如 Jagger 指出的那样,在 Pascal:
With myBookRec do
Begin
Title := 'Some Book';
Author := 'Victor John Saliba';
ISBN := '0-12-345678-9';
Price := 25.5;
End;
现在我经常发现自己在给定结构上设置大量属性。以设置字段目录的classic为例:
LOOP AT lt_fieldcat INTO ls_fieldcat.
CASE ls_fieldcat-fieldname.
WHEN 'COLUMN_1'.
ls_fieldcat-edit = ''.
WHEN 'COLUMN_2'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-outputlen = 20.
WHEN 'COLUMN_3'.
ls_fieldcat-edit = abap_true.
ls_fieldcat-drdn_hndl = '2'.
ls_fieldcat-drdn_alias = 'X'.
ls_fieldcat-outputlen = 5.
ls_fieldcat-col_pos = 1.
ls_fieldcat-scrtext_s = text-f01.
ls_fieldcat-scrtext_m = text-f01.
ls_fieldcat-scrtext_l = text-f01.
ENDCASE.
MODIFY lt_fieldcat FROM ls_fieldcat.
ENDLOOP.
有什么方法可以在 ABAP 中复制类似 WITH 的功能吗?
如果不是,是否有更好的方法来复制此行为?
我实际上考虑过为字段目录 class 复制 "return this" 方法菊花链。这似乎是一个 WITH 替代方案,但我并不完全相信它的用处,因为您必须为每个结构维护一个 class。
ls_fieldcat = zcl_fieldcat=>new( ls_fieldcat )->edit('')->outputlen(20)->col_post(1)->get().
我认为菊花链方法没有那么有用 - 它并不容易阅读,而且如果出现任何问题,调试起来会非常困难。就个人而言,我可能会使用具有多个可选属性的 "multi-setter":
lr_my_field->set_attributes( edit = abap_true
title = 'foo'
* ...
bar = 'baz' ).
话虽这么说,我对你问题中的代码完全没有问题。清晰可读,简单的数据处理。只需将其放入名为 PREPARE_FIELDCATALOG
的方法中,每个人都知道会发生什么。
使用新的 ABAP 语法,您可以使用 VALUE #( ... )
语句(或 VALUE #( BASE ls_fieldcat ...)
用于修改已分配字段的结构)稍微简化您的代码,该语句可用于模拟 WITH
在 ABAP 中。这不是一个完美的解决方案,特别是如果一个人有一个像你这样的 CASE
结构,但对于初始化结构化变量肯定很整洁。
LOOP AT lt_fieldcat INTO ls_fieldcat.
CASE ls_fieldcat-fieldname.
WHEN 'COLUMN_1'.
ls_fieldcat = VALUE #(
BASE ls_fieldcat
edit = ''
).
WHEN 'COLUMN_2'.
ls_fieldcat = VALUE #(
BASE ls_fieldcat
edit = 'X'
outputlen = 20
).
WHEN 'COLUMN_3'.
ls_fieldcat = VALUE #(
BASE ls_fieldcat
edit = abap_true
drdn_hndl = '2'
drdn_alias = 'X'
outputlen = 5
col_pos = 1
scrtext_s = text-f01
scrtext_m = text-f01
scrtext_l = text-f01
).
ENDCASE.
MODIFY lt_fieldcat FROM ls_fieldcat.
ENDLOOP.