クラスのデザインがすべてです。技術的には、プロパティを使用して実行できる「すべて」は、プロパティなしで実行できますが、コードはそれほどエレガントではありません。優れた設計により、クラスが使いやすくなり、間違いを犯すリスクが軽減されます。
まず、あなたの比較
TPerson = class
private
FName: string;
public
property Name: string read FName write FName;
end;
に
TPerson = class
private
FName: string;
public
procedure SetName(const Name: string);
function GetName: string;
end;
かなり公平ではありません。実際、最初のケースでは、値が設定されている(または読み取られている)ときに何かを行う可能性はありません。したがって、より適切な比較は、後者のコードを次のように比較することです。
TPerson = class
private
FName: string;
procedure SetName(const Name: string);
function GetName: string;
public
property Name: string read GetName write SetName;
end;
たとえば、コントロールを作成する場合、プロパティを変更するときに、コントロールを無効にする(基本的には再描画する)必要があります。たとえば、の「セーターの色」などTPerson
です。例えば、
TPerson = class
private
FSweaterColor: string;
procedure SetSweaterColor(const Value: TColor);
public
property SweaterColor: TColor read FSweaterColor write SetSweaterColor;
end;
...
implementation
procedure TPerson.SetSweaterColor(const Value: TColor);
begin
if FSweaterColor <> Value then
begin
FSweaterColor := Value;
Invalidate; // causes a repaint of the control
end;
end;
とにかく、プロパティのポイントは何ですか?さて、基本的に、ポイントはクラスの優れたインターフェースを作成することです。それは、その実装の詳細に興味がない人にとっては使いやすいはずです。プロパティを使用することで、この目標を達成できます。確かに、セーターの現在の色を読み取るには、を読むだけでAnna.SweaterColor
、設定するには、を読むだけAnna.SweaterColor := clRed
です。これが単に変数を設定するのか、プロシージャを実行するのかはわかりませんが、気にしません。あなたに関する限り、TPerson
オブジェクトは単に。と呼ばれる読み取り可能で設定可能なプロパティを持っていますSweaterColor
。
write
読み取り専用(no )または書き込み専用(no)のプロパティを作成することもできますread
。read
ただし、プロパティのand (あるとしても)をどのように実装してもwrite
、クラスユーザーの観点からはプロパティは同じように見えます。彼は使用することを覚えておく必要はありませんSetSweaterColor
(GetSweaterColor
実際、それらはプライベートであり、彼はアクセスできません)が、プロパティのみを使用しSweaterColor
ます。
これは、プロパティを使用することの別の利点も示唆しています。パブリックプロパティと公開プロパティはクラスのユーザーに表示されますが、プライベートメンバーは表示されません(フィールドFSweaterColor
やSetSweaterColor
プロシージャなど)。これはいい。クラスユーザーが人のセーターの色を変更する唯一の方法は、SweaterColor
プロパティを使用することであることがわかったためです。これにより、コントロールが再描画されることが保証されます。変数がpublicの場合FSweaterColor
、クラスのユーザーはこれを設定して、「セーターの色を変更しても何も起こらないのはなぜですか」と疑問に思うかもしれません。もちろん、この利点を得るためにプロパティは必要ありません。プライベートFSweaterColor
フィールドとパブリックGetSweaterColor
でありSetSweaterColor
、同様に機能しますが、次のように記述する必要があります。GetSweaterColor
色を取得するための処理は必要ありませんが、機能します。また、クラスのユーザーは、 1つではなく2つの識別子を使用することを学ぶ必要があります。
より具体的には、Delphi IDEを使用してプログラミングすると、published property
(-y + ies)がオブジェクトインスペクターに表示され、そこで読み取り/変更が許可されます(該当する場合)。プロパティがなかったら、どうしてそれが可能でしょうか?
とはいえ、プロパティを使用できない場合もあります。たとえば、読み取り専用の「プロパティ」がある場合は、読み取り専用のプロパティではGetSomething
なく、単一のパブリック関数を使用できます。結局のところ、それはあなたにいくつかのコーディングを節約するでしょう。同様に、書き込み専用プロパティがある場合は、単一のパブリックSetSomething
プロシージャを使用できます。これにより、コードも節約できます。最後に、どちらの方法でも(取得も設定も)処理を必要としない読み取り/書き込みプロパティがある場合は、単純にパブリック変数を使用できます。
したがって、結局のところ、クラスごとにクラスの適切な設計を決定する必要があります。私の過度に長い答えの短いバージョンは、Davidのコメントに似ていると思います。
どちらか便利な方を使用してください。