クラスのデザインがすべてです。技術的には、プロパティを使用して実行できる「すべて」は、プロパティなしで実行できますが、コードはそれほどエレガントではありません。優れた設計により、クラスが使いやすくなり、間違いを犯すリスクが軽減されます。
まず、あなたの比較
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のコメントに似ていると思います。
どちらか便利な方を使用してください。