7-Zipを扱うDelphi用ライブラリ「d7zip」に学ぶ上手なインターフェースの使い方

d7zipは、7z.dllを使って7z書庫形式のファイルを読み書きするライブラリです。

このライブラリはクラスの設計が上手で、参考になります。

たとえば、次のように使用します。

{ d7zipで書庫を解凍するサンプルコード }
with CreateInArchive(CLSID_CFormatZip) do
begin
  OpenFile('c:\test.zip');
  ExtractTo('c:\test');
end;

CreateInArchive関数の返値はI7zInArchive型です。
実際の返値はTInterfacedObjectを継承しているT7zInArchive型のインスタンスです。

クラス図

CreateInArchive関数は以下の点において、優れていると思います。

  • T7zInArchiveを直接Createせず、オブジェクトを生成する専用の関数を用意していること
  • オブジェクト生成関数がインターフェースを返すこと

これによって、

  1. Freeを呼ぶ必要がない。(参照カウンタによって自動的に破棄される)
  2. Freeを呼んでオブジェクトが二重に破棄される問題が発生いない

というメリットがあります。
(オブジェクトが二重に破棄される問題については「Delphi/interfaceを使おう/何が問題になるか? – TOBY SOFT wiki」の「問題となる例1」をご覧ください。)

そして、T7zInArchiveクラスはimplementation部で宣言されています。
ライブラリの利用者がT7zInArchiveクラスを直接使用することはできません。

CreateInArchive関数によって、簡潔でトラブルが発生しにくいコードを書くことができるようになっています。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください