はじめに
ABAPプログラミングでは、大規模開発や保守のしやすさを考慮し、オブジェクト指向プログラミング(OOP)の考え方を取り入れることが重要です。その核となるのが、「クラス」と「メソッド」です。昔から使われている汎用モジュール(Function Module)に対して、クラスを使うことでカプセル化や再利用性を高め、拡張しやすい設計を実現できます。
クラスとは
「クラス」は、属性(データ)とメソッド(処理)をまとめて定義したもので、いわば「設計図」のようなものです。
クラスの性質をもつオブジェクト(実体)をプログラムで生成することをインスタンス化と呼びます。
動的属性と静的属性
動的属性(Instance Attributes)
インスタンスに応じて異なる値を保持する属性のことです。たとえば ZCL_HUMAN
クラスにおいて「名前」や「年齢」のようなプロパティは、各インスタンスごとに異なる値をもつため、動的属性となります。
静的属性(Static Attributes)
クラスそのものがもつ属性で、インスタンスに依存しません。全インスタンスで共有される情報や定数などを保持する場合に利用します。宣言には CLASS-DATA
を使います。
クラス化がもたらすメリット
- カプセル化:データと処理をひとまとまりにして、外部から見えない情報を隠蔽できる。
- 再利用性:同じ処理を複数箇所で使いまわしやすい。
- 拡張性:クラス継承などで機能の追加や変更がしやすい
メソッドとは
「メソッド」は、クラス内部に定義される処理のまとまりです。
関数やサブルーチンのように、ある特定の作業を行うロジックをまとめたブロックですが、クラスの一部として定義する点が大きな特徴です。
- インスタンスメソッド:インスタンスに属するメソッドで、「インスタンス名->メソッド名」のように呼び出します。インスタンス固有の動作を実装します。
- クラスメソッド(スタティックメソッド):クラス自体に属するメソッドで、インスタンス化せずに「クラス名=>メソッド名」で呼び出せます。
クラスとメソッドの定義
ABAPでは、クラス定義部(DEFINITION) と クラス実装部(IMPLEMENTATION) を分けて記述します。
トランザクションコード SE24 でもGUIベースで同様の概念があります。
クラス定義部(DEFINITION)と実装部(IMPLEMENTATION)
CLASS zcl_human DEFINITION PUBLIC.
PUBLIC SECTION.
DATA: mv_name TYPE string, "動的属性(インスタンス属性)
mv_age TYPE i.
METHODS: constructor
IMPORTING iv_name TYPE string
iv_age TYPE i.
METHODS: run. "インスタンスメソッド
CLASS-METHODS: show_count. "クラスメソッド(スタティックメソッド)
ENDCLASS.
CLASS zcl_human IMPLEMENTATION.
METHOD constructor.
me->mv_name = iv_name.
me->mv_age = iv_age.
ENDMETHOD.
METHOD run.
"走る処理
WRITE: / me->mv_name, 'は走っています。'.
ENDMETHOD.
METHOD show_count.
" 静的メソッドのサンプル
" 例:全体で何人のインスタンスがあるかを表示するとか
WRITE: / 'クラスメソッド: インスタンス総数を表示します。'.
ENDMETHOD.
ENDCLASS.
PUBLIC SECTION / PROTECTED SECTION / PRIVATE SECTION
PUBLIC SECTION
は、他のプログラムやクラスからも参照・呼び出し可能な領域です。PROTECTED SECTION
は、サブクラス(継承)からはアクセスできるが、外部プログラムからはアクセス不可。PRIVATE SECTION
は、そのクラス内部からのみアクセス可能。
アクセスレベル(PUBLIC/PROTECTED/PRIVATE)
ABAPクラスは、外部への公開度をセクションによって管理します。これにより、必要な部分だけを公開し、内部の実装を隠蔽(カプセル化)できます。
コンストラクタ(METHODS constructor)
コンストラクタは、インスタンス生成時に自動的に呼び出される特別なメソッドです。初期化処理や必須の属性設定が必要な場合に使います。ABAPでは METHODS constructor
として定義します。
インスタンス化
クラスを使うには、インスタンス(オブジェクト)を生成する必要があります。ABAPでは以下のように記述します。
DATA: lo_human TYPE REF TO zcl_human.
CREATE OBJECT lo_human
EXPORTING
iv_name = '太郎'
iv_age = 20.
TYPE REF TO <クラス名>
は、クラスの参照型を意味します。CREATE OBJECT
でインスタンス(実体)を生成します。- コンストラクタが定義されていれば、
EXPORTING
で初期値を渡せます。
メソッドの呼び出し
インスタンスメソッドの呼び出し
インスタンスメソッドは、生成したインスタンスを介して呼び出します。
モダンな構文では、<インスタンス名>-><メソッド名>
と記述します。
lo_human->run( ).
レガシーな構文では、以下のようにも記述できます。
CALL METHOD lo_human->run.
クラスメソッド(スタティックメソッド)の呼び出し
クラスメソッド(スタティックメソッド)は、インスタンスを生成しなくても呼び出せます。
「クラス名=>メソッド名
」が基本です。
CALL METHOD zcl_human=>show_count.
新しい書き方では、CALL METHOD
を省略して以下のようにも記述可能です。
zcl_human=>show_count( ).
CALL METHOD の省略記法
ABAP NetWeaver 7.40以降では、CALL METHOD
を省略し、直接 クラス名=>メソッド名( )
または インスタンス名->メソッド名( )
のように記述できます。
可読性の好みやプロジェクトルールによって使い分けましょう。
汎用モジュールとの違い
汎用モジュール(Function Module) は、どのプログラムからでも呼び出せる一方、クラスメソッドは特定のクラスに属します。
ABAPでは、クラスメソッドを利用すれば、
- カプセル化(関連するデータや処理をひとまとめに管理)
- 継承
- ポリモーフィズム(同名メソッドをクラスごとに実装)
など、オブジェクト指向のメリットを活かした設計が可能です。
ただし、スタティックメソッドはインスタンス化不要で呼び出せるので、汎用モジュールと呼び出しやすさの点では似ています。
しかし、「あるクラスに紐付いた機能」という点が明確になるため、プログラムの構造や責務が分かりやすくなるのが大きな利点です。
実際のクラス・メソッド使用例
実際のSAP標準クラス(例: CL_ABAP_LIST_UTILITIES
)を呼び出すコード例を見てみましょう。
DATA: lv_field TYPE string VALUE 'TMP_NAME3',
lv_display TYPE string.
CALL METHOD CL_ABAP_LIST_UTILITIES=>REPLACE_INTO_DISPLAY_LAYOUT
EXPORTING
field = lv_field
display_offset = 40
display_length = 0
CHANGING
display_data = lv_display.
" または、モダンな構文で記述
CL_ABAP_LIST_UTILITIES=>REPLACE_INTO_DISPLAY_LAYOUT(
EXPORTING
field = lv_field
display_offset = 40
display_length = 0
CHANGING
display_data = lv_display
).
- 上記の例はクラスメソッド呼び出しです(
CL_ABAP_LIST_UTILITIES=>...
)。 EXPORTING
とCHANGING
でパラメータを渡していることがわかります。
まとめ
本記事では、ABAPにおけるクラスとメソッドの基礎から具体的なサンプル実装、そして汎用モジュールとの違いを解説しました。主なポイントは以下のとおりです。
- クラス定義で属性(動的/静的)やメソッドをまとめて管理することで、データと処理のカプセル化が可能。
- インスタンスメソッドはオブジェクトに属する動作を実装し、クラスメソッド(スタティックメソッド) はインスタンス化不要で呼び出し可能。
- コンストラクタ(METHODS constructor) を使ってインスタンス化時の初期値や必須設定を確実に行う。
- CALL METHOD の古い構文と、新しい
->
や=>
の呼び出し構文を両方理解し、プロジェクトルールや可読性に応じて使い分ける。 - 汎用モジュールとの大きな違いは、オブジェクト指向によるカプセル化や継承などの恩恵が得られるかどうか。
ABAPでもオブジェクト指向を活用することで、保守性・拡張性の高いプログラムを実現できます。慣れないうちは少しとっつきにくいかもしれませんが、ぜひクラス設計を意識した開発にチャレンジしてみてください。