当記事は、「IBM i RiSING」2025年Aチームの成果物となる記事の一つです。
まとめはこちら
はじめに
RPGⅢとフリーフォームのRPGⅣ(以下FFRPG)の比較のため、CRUDアプリの作成ではブラックジャックアプリとは逆に、まずFFRPGで作成し、同じ動作をするものをRPGⅢで作成しました。
以下から、特にCRUDアプリで特徴的な違いとなるモジュール、外部プロシージャの観点で比較ポイントを見ていきます。
作成したもの
作成したコードは以下のリポジトリにまとめています。
https://github.com/risingc03a/rising-c03-a
1.モジュールの有無・外部プロシージャの利用
モジュールとは、RPGⅣで利用できるコンパイル単位で、1つ以上のプロシージャ群を含んだ中間オブジェクトです。まず実行不可能なモジュール・オブジェクトを生成し、これを他のモジュールと合わせて一つのプログラム・オブジェクトを生成することができます。
RPGⅢではこれらは利用できず、単一PGMとサブルーチンでまとまっています。
画面、メニュー分岐、DBアクセスなどが同一ソースに集約されています。
メリットはビルドがシンプルで、小規模・短期開発なら全体を一目で追いやすいこと。既存資産の読み取り・小修正にも強いことです。
FFRPG 版はモジュールを利用し、機能ごとにソースを分割しています。本PGMでは、LOGIN(認証)、SELECT(検索)、ADDUSR(登録)、EXECSQL(SQLユーティリティ)などの機能ごとに分割しています。
ログイン認証やデータベース操作など共通的な機能は、サブプロシージャとしてひとつのソースにまとまっており、各画面プログラムから再利用が可能になっています。
また、共通プロトタイプをCOPY句にまとめ、引数・戻り値・属性を明示して疎結合にしています。これによってUI変更はUI側で、DB変更はDB側で局所化。単体テストがやりやすく、共通処理のユーティリティ化・横展開も容易になります。運用面では、プロトタイプ管理とビルド、リンク手順に慣れが必要、という点がトレードオフになります。
2.モジュール実装の手順
以上の通り、FFRPG版CRUDアプリでは、処理のモジュール化を行うために、各機能(登録/検索/SQL共通処理など)を個別モジュールとしてコンパイルし、最終的に1つのプログラムとしてリンクしました。
以下に、具体的な実装手順を説明していきます。
まず、各処理単位のソースをモジュール化します。
SQLを含むプログラムは CRTSQLRPGI コマンドでコンパイルします。
CRTSQLRPGI OBJ(ライブラリ/モジュール名)
SRCFILE(ライブラリ/ソースオブジェクト)
SRCMBR(メンバー名)
OBJTYPE(*MODULE)
開発の際、実際に利用されたコマンドは以下のようなものです。
CRTSQLRPGI OBJ(RISINGLIB/EXECSQL)
SRCFILE(RISINGLIB/QCRUD)
SRCMBR(EXECSQL)
REPLACE(*YES)
OPTION(*EVENTF)
DBGVIEW(*SOURCE)
OBJTYPE(*MODULE)
同様に、LOGIN・ADDUSR・SELECT・MAIN 各モジュールも同手順で作成します。
次に、作成した複数のモジュールを一つのプログラムにまとめます。
このとき使用するのがCRTPGMコマンドです。
CRTPGM PGM(ライブラリ/プログラム名)
MODULE(ライブラリ/モジュール1 ライブラリ/モジュール2)
実際のCRUDアプリでは以下のようにまとめています。
MODULE(RISINGLIB/MAIN RISINGLIB/EXECSQL RISINGLIB/SELECT)
REPLACE(*YES)
ACTGRP(*NEW)
3.比較ポイントのまとめ
今回のRPGⅢ版プログラムでは単一PGM,サブルーチン中心で、機能を横断する修正は影響範囲が広がりがちな反面、ビルド、配布手順は単純で取り扱いやすいです。
FFRPG版ではモジュール分割と型付きインターフェースの利用で、単体テストや個別の修正が容易です。半面、プロトタイプ管理やビルド手順の運用が複雑になりがちな面もあります。
当記事の著作権はIBMに帰属します。詳細はこちらを参照ください。