共有クラス

一般的なオブジェクト記法に従い、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までお寄せください。

Nicolas Brachfogel
- プロダクトオーナー & シニアデベロッパー - Nicolas Brachfogelは、2017年にシニアデベロッパーとして4Dに入社しました(4D Serverとネットワークを担当)。Apple Siliconのリリースを管理するプロダクトオーナーとして、ユーザーストーリーを書いて機能仕様に落とし込み、機能実装が顧客のニーズを満たしているかを確認する役割を担っています。Institut Supérieur d'Informatique Appliquée (INSIA) を卒業した Nicolas は、2001年にソフトウェア開発者としてのキャリアをスタートさせました。JavaとC++で数年間コーディングした後、ゲーム会社のクライアント・サーバー開発を専門に担当。サーバー開発者/アーキテクトとして、多くのゲーム(Dofus Arena、Drakerz、Trivial Pursuit Go!)のサーバーアーキテクチャに携わり、成功を収めてきました。