古典的なオブジェクト構文に従い、必要なときに自動的にuse/end useを呼び出す、シンプルな共有オブジェクトの使い方をお望みですか?
シートベルトを締めてください。共有クラスの登場です!
共有クラスの作成と管理
4D 20 R5では、新しいコンセプトが追加されました:共有クラスです。
共有クラスは、共有オブジェクトを作成するためにのみ使用でき、そのため、使用方法がシンプルになります。共有クラスを作成するには、コンストラクタにsharedキーワードを追加するだけです:
//class 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))
//Code that will be executed while the calculation is in progress
End while
共有クラスが、アプリケーション全体で共有オブジェクトを使う手助けになれば幸いです。何か質問があれば、遠慮なく4Dフォーラムまで持ってきてください。