繁体   English   中英

WITH结构声明

[英]WITH statement for structures

在某些语言中,存在简化单个对象的方法和属性访问的语法。 以VB.NET为例:

With foo
   .bar()
   .reset(true)
   myVar = .getName()
End With

或者正如贾格尔指出的那样, 帕斯卡尔

With myBookRec do
 Begin
  Title  := 'Some Book';
  Author := 'Victor John Saliba';
  ISBN   := '0-12-345678-9';
  Price  := 25.5;
 End;

现在我经常发现自己在给定的结构上设置了大量的属性。 以设置字段目录的经典案例为例:

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的功能?

如果没有,是否有更好的方法来复制此行为?


我实际上已经考虑过为一个字段目录类复制“return this”方法菊花链。 这似乎是一个替代方案,但我并没有完全卖掉它的实用性,因为你必须为每个结构维护一个类。

ls_fieldcat = zcl_fieldcat=>new( ls_fieldcat )->edit('')->outputlen(20)->col_post(1)->get().

我不认为菊花链方法是有用的 - 它不是更容易阅读,如果出现任何问题,它很难调试。 就个人而言,我可能会使用具有多个可选属性的“多安装程序”:

  lr_my_field->set_attributes( edit  = abap_true
                               title = 'foo'
*                              ...
                               bar = 'baz' ).    

话虽这么说,我的问题中的代码根本没有问题。 清晰可读,简单的数据处理。 只需将其放入名为PREPARE_FIELDCATALOG的方法中, PREPARE_FIELDCATALOG知道会发生什么。

使用新的ABAP语法,您可以使用VALUE #( ... )语句(或VALUE #( BASE ls_fieldcat ...)来简化代码,以修改已分配字段的结构),可用于在ABAP中模拟WITH 不是一个完美的解决方案,特别是如果你有一个类似你的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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM