top / index / prev / next / target / source

2015-12-20 diary: Delphi でバリューオブジェクト

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

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 文字列を作成するために必要でした。

関連する記事


この日記について