DelphiでRAII その2

Delphiのインターフェースを使うと、参照カウントが0になったオブジェクトは自動で破棄されます。
この機能を使って、変数がスコープを離れた時にリソースを返却するRAIIを実現できます。

今回はスコープを離れたら自動的に削除される一時ファイルを作成します。

使用例

procedure TForm1.Button1Click(Sender: TObject);
var
  TempFile: ITempFile;  //一時ファイルオブジェクト
  FileName: String; //一時ファイルのファイル名
begin
  TempFile := CreateTempFile; //一時ファイルを作成する
  FileName := TempFile.GetFileName; //一時ファイルのファイル名を取得する
  DoSomething(FileName); //一時ファイルを使用する
end;  //スコープを離れたら一時ファイルは削除される

実装方法は次のようになります。

type
  /// <summary>一時ファイルを管理するRAIIのインターフェース</summary>
  ITempFile = interface
    /// <summary>一時ファイルのファイル名を取得する</summary>
    function GetFileName: String;
  end;

  /// <summary>RAIIのオブジェクトを取得する</summary>
  /// <returns>RAIIのオブジェクト。実体はTTempFileクラス</returns>
  function CreateTempFile():ITempFile;

implementation

type
  /// <summary>ITempFileの実装。このクラスは公開しない。</summary>
  TTempFile = class(TInterfacedObject, ITempFile)
  private
    FFileName: String; //一時ファイルのファイル名
  public
    constructor Create();
    destructor Destroy; override;
    /// <summary>一時ファイルのファイル名を取得する</summary>
    function GetFileName: String;
  end;

function CreateTempFile():ITempFile;
begin
  Result := TTempFile.Create();
end;

constructor TTempFile.Create;
begin
  //一時ファイルを作成してファイル名を取得する
  FFileName := IOUtils.TPath.GetTempFileName;
end;

destructor TTempFile.Destroy;
begin
  try
    IOUtils.TFile.Delete(FFileName)
  except on E: Exception do
    //削除に失敗した時は例外を無視する
  end;
  inherited;
end;

function TTempFile.GetFileName: String;
begin
  Result := FFileName;
end;

なかなか便利ではないかと思いますが、いかがでしょうか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です