Delphi でバリューオブジェクト
Delphi で静的な項目・型をもちいたバリューオブジェクトを利用する場合の簡単なサンプルを作成します。ここでは、注文−注文アイテムの2段階構造のものを利用することを想定します。
uOrderItemVO.pas
まず最初に注文アイテムです。こちらは単純なものの例です。
unit uOrderItemVO; interface // 注文アイテムバリューオブジェクト type TOrderItemVO = class private FItemNo: string; FPrice: Integer; FAmount: Integer; public // アイテム番号 property ItemNo: string read FItemNo write FItemNo; // 価格 property Price: Integer read FPrice write FPrice; // 数量 property Amount: Integer read FAmount write FAmount; end; implementation end.
uOrderVO.pas
こちらは少し複雑なものです。
unit uOrderVO; interface uses System.SysUtils, System.Generics.Collections, uOrderItemVO; // 注文バリューオブジェクト type TOrderVO = class private FOrderNo: string; FTotalPrice: Integer; FOrderDate: TDateTime; FItems: array of TOrderItemVO; procedure SetOrderNo(const No: string); procedure SetTotalPrice(const Price: Integer); procedure SetOrderDate(const DateTime: TDateTime); public // コンストラクタ constructor Create; // 注文番号 property OrderNo: string read FOrderNo write SetOrderNo; // 合計金額 property TotalPrice: Integer read FTotalPrice write SetTotalPrice; // 注文日 property OrderDate: TDateTime read FOrderDate write SetOrderDate; // 注文アイテムを取得 function GetItems: TArray<TOrderItemVO>; // 注文アイテムを挿入 procedure InsertItem(Index: Integer; const item: TOrderItemVO); // 注文アイテムを追加 procedure AddItem(const item: TOrderItemVO); // 注文アイテムを削除 procedure DeleteItem(Index: Integer); end; implementation // コンストラクタ constructor TOrderVO.Create; begin inherited Create; FOrderDate := Now; end; procedure TOrderVO.SetOrderNo(const No: string); begin FOrderNo := No; end; procedure TOrderVO.SetTotalPrice(const Price: Integer); begin FTotalPrice := Price; end; procedure TOrderVO.SetOrderDate(const DateTime: TDateTime); begin FOrderDate := DateTime; end; // 注文アイテムを取得 function TOrderVO.GetItems: TArray<TOrderItemVO>; begin Result := TArray<TOrderItemVO>(FItems); end; // 注文アイテムを挿入 procedure TOrderVO.InsertItem(Index: Integer; const item: TOrderItemVO); var WrkList: TList<TOrderItemVO>; i: Integer; begin try WrkList := TList<TOrderItemVO>.Create; WrkList.AddRange(FItems); WrkList.Insert(Index, item); SetLength(FItems, WrkList.Count); for i := 0 to WrkList.Count - 1 do begin FItems[i] := WrkList.Items[i]; end; finally FreeAndNil(WrkList); end; end; // 注文アイテムを追加 procedure TOrderVO.AddItem(const item: TOrderItemVO); begin InsertItem(Length(FItems), item); end; // 注文アイテムを削除 procedure TOrderVO.DeleteItem(Index: Integer); var WrkList: TList<TOrderItemVO>; i: Integer; begin try WrkList := TList<TOrderItemVO>.Create; WrkList.AddRange(FItems); WrkList.Delete(Index); SetLength(FItems, WrkList.Count); for i := 0 to WrkList.Count - 1 do begin FItems[i] := WrkList.Items[i]; end; finally FreeAndNil(WrkList); end; end; end.
子のバリューオブジェクトは (TList<> ではなく) 配列で保持しています。これは、JSON 直列化の際に デフォルトの解釈器が美しい JSON 文字列を作成するために必要でした。