1. はじめに
ABAPでもJavaやJavaScriptのように「メソッドチェーン(method chaining)」が使えることをご存じですか?
メソッドチェーンを使うと、次のようにメソッドをつないで呼び出す”ことができ、コードがとても読みやすくなります。
lo_person->set_name( 'Tanaka'
)->set_age( 28
)->set_city( 'Tokyo'
)->display( ).
このように書くと、設定の流れが一目でわかる可読性の高いコードになります。
2. クラス定義例
CLASS zcl_person DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
METHODS:
"名前を設定
set_name
IMPORTING iv_name TYPE string
RETURNING VALUE(ro_self) TYPE REF TO zcl_person,
"年齢を設定
set_age
IMPORTING iv_age TYPE i
RETURNING VALUE(ro_self) TYPE REF TO zcl_person,
"出身地を設定
set_city
IMPORTING iv_city TYPE string
RETURNING VALUE(ro_self) TYPE REF TO zcl_person,
"出力
display.
PRIVATE SECTION.
DATA:
mv_name TYPE string,
mv_age TYPE i,
mv_city TYPE string.
ENDCLASS.
3. クラス実装例
CLASS zcl_person IMPLEMENTATION.
METHOD set_name.
mv_name = iv_name.
"自分自身を返す
ro_self = me.
ENDMETHOD.
METHOD set_age.
mv_age = iv_age.
"自分自身を返す
ro_self = me.
ENDMETHOD.
METHOD set_city.
mv_city = iv_city.
"自分自身を返す
ro_self = me.
ENDMETHOD.
METHOD display.
WRITE: / |Name: { mv_name }|,
/ |Age : { mv_age }|,
/ |City: { mv_city }|.
ENDMETHOD.
ENDCLASS.
4. 呼び出し例
"インスタンス化
DATA(lo_person) = NEW zcl_person( ).
"メソッドチェーン
lo_person->set_name( 'Tanaka'
)->set_age( 28
)->set_city( 'Tokyo'
)->display( ).
5. ポイント解説
| 項目 | 説明 |
|---|---|
RETURNING VALUE(ro_self) |
メソッドの戻り値に「自分自身のインスタンス」を返す |
ro_self = me |
現在のオブジェクトを返してチェーンを続ける |
| チェーン対象メソッド | 戻り値が「同じクラスの参照」である必要がある |
| 最後のメソッド | チェーンを終了させるため、RETURNING は不要でもOK |
6.使う場面の具体例
メソッドチェーンは「設定をまとめて流れるように記述したいとき」に特に役立ちます。
ABAPの開発では、ビルダー系クラスやHTTPリクエスト作成処理、RAPのエンティティ登録処理などでよく使われます。
例えば、外部APIを呼び出すクラスを設計する場合は下記のようなイメージになります。
lo_http_client->set_url( lv_url
)->set_header( iv_string = 'Content-Type' iv_value = 'application/json'
)->set_body( lv_json
)->execute( ).
7.まとめ
メソッドチェーンは、ABAPでも読みやすく・美しく・意図が伝わるコードを書くための強力なテクニックです。
複数の設定処理やデータ組み立てを“流れるように”書けるので、可読性が一気に上がります。
皆さんも是非現場で使ってみてください。