TicketOrder オブジェクトの取得 2
このコードを詳しく調べてみましょう。
最初に、ObjectScript の $Data 関数を使用して、Order の値が事前に %session オブジェクトに保存されているかどうかを判断します。
If $data(%session.Data("Order")) {
}
保存されていない場合、%New メソッドを呼び出すことで新しい TicketOrder オブジェクトを生成します。
Set ord=##class(Cinema.TicketOrder).%New()
%New メソッドは、メモリ上に新しいオブジェクトを作成し、クラス定義で指定された任意の既定のプロパティ値を書き込み、ローカル変数 ord に割り当てるオブジェクト参照 (oref) を返します。この oref は、メモリにあるオブジェクトにアクセスするために使用する “ハンドル” としての役目をします。
通常、1 つのブラウザ要求から次の要求に進む間、Caché は %session オブジェクトに明示的に保存されたデータのみを “記憶” しています。これは、Web の “ステートレス” 方式に矛盾していません。
後の使用のためにこのオブジェクトを保存しておく必要があるので、%Save メソッドを使用して、このオブジェクトをデータベースに格納し (TicketOrder は永続オブジェクトであることに注意してください)、そのオブジェクト ID を %session オブジェクト内に配置します。後で、TicketOrder オブジェクトが既に存在することが検出された場合 (つまり、オブジェクト ID は %session オブジェクト内に格納されている)、%session オブジェクトの Data プロパティを使用してそれを検索します。
メソッドの最後で、オブジェクト ID を %session オブジェクトに配置します。新規に生成されたオブジェクトは、それが %Save メソッドでデータベース内に格納されるまでは、オブジェクト ID を持ちません。
Utils.AddShow
ClassMethod AddShow(ShowID As %String)
{
// Get an order object
If $data(%session.Data("Order")) {
Set ord = ##class(Cinema.TicketOrder).%OpenId(%session.Data("Order"))
}
Else {
Set ord=##class(Cinema.TicketOrder).%New()
// ...
}
// ...
// Save incomplete order and remember its Id in %session.
Do ord.%Save()
Set %session.Data("Order") = ord.%Id()
}