一般的なオブジェクト記法に従い、use/end useを指定しなくても自動的に呼び出す、シンプルな共有オブジェクトの使い方をお探しですか?
お待たせいたしました、共有クラスのご紹介です!
共有クラスの作成と管理
4D 20 R5では、新しいコンセプトが追加されました:共有クラスです。
共有クラスは、共有オブジェクトを作成するためにのみ使用でき、そのため、使用方法がシンプルになります。共有クラスを作成するには、コンストラクタ部分に”shared”キーワードを追加するだけです:
//SharedClass クラス
shared Class constructor()
共有クラスを使用して標準オブジェクトを作成することはできません。new()を呼び出してこのクラスの新しいオブジェクトを作成するたびに、そのオブジェクトは共有オブジェクトになります。
クラス関数の拡張
sharedキーワードはクラス関数にも使用でき、この関数がオブジェクトを変更することを表します。関数の内部で use と end use を呼び出す必要はありません。関数が呼び出されるときと終了するときにそれが自動的に呼び出されるためです。これは当然シングルトンコンストラクタにおいても有効です。
shared Function myFunction()
This.attribute:="whatever"
もちろん、sharedキーワードを必要としない関数においてはsharedキーワードを使用せず、同じオブジェクトを使用しようとしている他のプロセスをブロックしないように注意を払う必要があります。
共有クラスと共有関数を適切に使用することで、共有オブジェクトを通常のオブジェクトと同じように操作できるようになり、これによりコードをシンプルに保つことができます。
継承に関する注意点
最後に注意しなければならない点は、非共有クラスは共有クラスを継承できますが、共有クラスは非共有クラスを継承できないということです。ですから、オブジェクト・モデルはそれに合わせて計画する必要があります。
例
長い計算をする必要があり、重要なプロセスがブロックされるのを避けるためにワーカーを使いたいとします。しかし、ある時点で計算結果を取得する必要があるのは明らかです。このCalculationResultクラスを使った例を見てみましょう:
// class CalculationResult
shared Class constructor()
This.isFinished:=False
Function makeCalculation()
...
This.finished:=True
shared Function set finished($finished : Boolean)
This.isFinished:=$finished
shared Function get finished()->$finished : Boolean
$finished:=This.isFinished
使い方は、以下のようにするだけです:
$calculation:=cs.CalculationResult.new()
CALL WORKER("AnyWorker"; Formula($calculation.makeCalculation()))
While (Not($calculation.isFinished))
//計算が進行中に実行されるべきコード
End while
共有クラスが、アプリケーション全体で共有オブジェクトを使う手助けになれば幸いです。何か質問があれば、遠慮なく4D forumまでお寄せください。