複雑なメソッドのあらゆる終了ポイントで、同じクリーンアップコードを書き直すことほど面倒なことはあるでしょうか?
ドキュメントを閉じる処理、プロセス間フラグのリセット、リソースの解放など、どのような作業であれ、関数がどのように、どこで終了してもクリーンアップタスクが確実に実行されるようにするには、常に綿密な構造設計が必要でした。メソッドが予期せず中断されたり、あるいは早期に Return 実行されたりした場合、たった1行のクリーンアップコードを忘れるだけで、メモリリークやリソースのロックを引き起こす可能性があります。
4D 21 R4 からは、そうした心配は過去のものとなります。新しいdefer コマンドの登場です。これは、4Dコードをよりクリーンで安全に、そしてはるかに洗練されたものにするために設計された、強力で現代的な制御フローコマンドです。
その仕組みと、4Dコードの記述方法をどのように変革するかについて、詳しく見ていきましょう!
deferコマンドとは?
そのコンセプトは驚くほどシンプルです。「defer」コマンドを使用すると、現在のメソッドや関数の実行が完了したときにのみ自動的に実行される式をスタックに積むことができます。
実行フローがdefer ステートメントに遭遇しても、その式はすぐには実行されません。代わりに、専用の内部的な”deferred スタック“に安全にプッシュされます。
魔法のような処理が行われるのは、メソッドや関数が終了したときです。どのような形で完了したとしても、4D は自動的にdeferred スタックからすべての式を取り出し、LIFO(後入れ先出し)順に実行します。
この実行は、以下のすべての終了シナリオで確実にトリガーされます:
- 通常の完了:実行フローが自然に終了した場合。
- 早期終了:Return ステートメントが検出され、処理された場合。
- 予期しない中止:致命的なエラーが発生し、ユーザーが中止を確認した場合でも、4Dは環境を安全にクリーンアップするために、遅延された式が確実に実行されるようにします。
実用的なユースケース
defer の威力を理解するために、このコマンドによって開発が劇的に簡素化されるような 2 つの典型的な例を見てみましょう。
確実なリソース管理
XMLツリー、データベーストランザクション、その他の外部リソースを扱う場合、メモリリークを防ぐために、それらが適切に閉じられていることを確認する必要があります。defer を使用すれば、割り当てコードとクリーンアップコードを並べて記述できます:
var $root: := ("rootName") ( ( ))
Text
$rootDOM Create XML Ref
// Ensure the XML tree will be closed and memory freed, no matter what happens next!
deferDOM CLOSE XML$root
// $root ツリーで何かを行う...
環境およびデータベースの状態の復元
コードによっては、グローバルなデータベースパラメータや環境設定を一時的に変更し(特定の複雑な操作に対して動作が遅くなるような重い診断ログを有効にするなど)、その後、元の値に確実に復元する必要がある場合があります。defer コマンドは、この状態の復元を非常にうまく処理します:
// 診断ログ記録のカレントの状態を取得する
$logRecording:=Get database parameter(Diagnostic log recording)
// この特定のプロセス/メソッドに対して一時的にこれを有効化する
SET DATABASE PARAMETER(Diagnostic log recording; 1)
// メソッドまたは関数が終わったらすぐに元の状態に戻せるようにする
defer(SET DATABASE PARAMETER(Diagnostic log recording;$logRecording))
// 複雑または重い操作をここで実行する...
設計による安全な実行
この機能は、安全性と堅牢性を重視して設計されています。クリーンアップタスクの失敗によってアプリケーションの終了フローが中断されることを心配する必要はありません。
遅延スタックから実行された式がエラーをスローした場合、4D は実行を中断することなく、バックグラウンドで自動的にそれをキャッチします。まるで式が暗示的なtryブロック内で実行されたかのように振る舞い、スタックの残りの実行をシームレスに継続します。
コードを簡潔に保ち、無限ループや予期しない動作を回避するために、いくつかの安全策も実装しました:
- ネスト禁止:遅延された式の中に他の defer ステートメントが含まれていた場合、これらのネストされた式は単に無視されます。
- 内部での Return 文の禁止:遅延式内で誤ってReturn 文が呼び出された場合、その実行は行われません。
スマートなコンテキスト評価
メソッドや関数の最後で遅延式が実行される場合、4D は変数のコンテキストをシームレスに処理します。標準のローカル変数は、遅延されたまさにその瞬間の値を保持し続けますが、プロセス変数、ローカルオブジェクト変数、およびクラシックレコードは、メソッドや関数の完了時の最終状態を反映します。
まとめ
4D 21 R4から利用可能となったdeferコマンドは、単なる利便性を超え、開発ワークフローの構造的な向上をもたらします。ロジックの先頭で初期化とクリーンアップをまとめて行うことで、コードの可読性と保守性が向上し、予期せぬ実行時の中断に対する耐性も高まります。
よりクリーンで安全な4Dアプリケーションを作成する準備はできていますか?4Dフォーラムでご意見をお聞かせください!
現在、この投稿へのコメント機能は利用できません。