ビジネスクラスでのプロパティ対ゲッター/セッターの使用
-
09-10-2019 - |
質問
典型的な顧客や従業員のクラスのように、Buisnessクラスを扱う場合、ゲッターとセッターのみを使用するか、プロパティを使用する方が良いでしょうか?
私はJava Booksのいくつかのooの例(自己学習のために)に翻訳しています。これらの例には、getname()とsetname()は常に使用されていません。プロパティは使用されません。
ここで、公開されたプロパティを持つコンポーネントを作成すると、プロパティを使用する非常に正当な理由がありますが、通常のクラスでは、どのアプローチが優れているかがわかります。コードは、ゲッターとセッター(私たちがプロパティを読み取り/書き込んでいるという事実を強調している)またはプロパティ(一見したところ、パラメーターのないメソッドと混同することができる)でより読みやすいですか?
解決
いいえ。ゲッターとセッターは、プロパティがないため、Javaにのみ存在します。プロパティを使用するためのクリーンなコードがはるかに高くなります。そして、ゲッターまたはセッターが必要な場合は、プロパティに組み込むことができますが、アクセスコードをたくさんの関数呼び出しで散らばる必要はありません。
他のヒント
わお。プロパティには、「ゲッターとセッターの方法のための単なるラッパー」よりもはるかに多くのものがあります。
プロパティは、エレガントでありながら強力な、プロボイド制御クラスフィールドへのアクセスを制御する方法です。
フィールドへのアクセス
すでに述べたように、クラスフィールドに直接アクセスできます。これは確かに非常に優れており、コードをより明確にします。また、クラスの実行可能な最初のバージョンを実装するための非常に良い方法でもあります。
TMyClass = class
private
FValue: String;
public
property Value: String read FValue write FValue;
end;
後で、クラスを再設計して、メソッドを使用してフィールドアクセスを検証および操作できます。パブリックインターフェイスはまだ同じです。
TMyClass = class
private
FValue: String;
procedure SetValue(AValue: String);
public
property Value: String read FValue write SetValue;
end;
procedure TMyClass.SetValue(AValue: String);
begin
if AValue = ''
then FValue := 'No value!'
else FValue := AValue;
end;
アクセスの制御
プロパティは、Readonly/Writeonlyフィールドの簡単な概要を提供します。たとえば、読み取り/不変のクラス:
TClient = class
private
FName: String;
FSite: String;
FMail: String;
public
constructor Create(AName, ASite, AMail: String);
property Name: String read FName;
property Site: String read FSite;
property Mail: String read FMail;
end;
多型
TClient = class
private
FName: String;
protected
function GetName: String; virtual; abstract;
public
property Name: String read GetName write FName;
end;
TImportantClient = class(TClient)
protected
function GetName: String; override;
end;
TArgumentativeClient = class(TClient)
protected
function GetName: String; override;
end;
function TImportantClient.GetName: String;
begin
Result := '+++ ' + FName;
end;
function TArgumentativeClient.GetName: String;
begin
Result := ':-( ' + FName;
end;
{----- ----- ----- ----- -----}
var
ClientA,
ClientB: TClient;
begin
ClientA := TImportantClient.Create;
ClientB := TArgumentativeClient.Create;
ClientA.Name := 'Mr. Nice';
ClientB.Name := 'Mr. Dumbhead';
ShowMessage(ClientA.Name);
ShowMessage(ClientB.Name);
end;
{----- ----- ----- ----- -----}
デフォルトのプロパティ
クラスでは、デフォルトのクラスフィールドを定義できます。つまり、プロパティ名を指定せずにフィールドに直接アクセスできます。
A := MyStringList[i]:
MyStringList[i] := B;
{ instead of }
A := MyStringList.Strings[i];
MyStringList.Strings[i] := B;
{ or }
A := MyStringList.GetString(i);
MyStringList.SetString(i, B);
索引
とともに Index
キーワード、Delphiは、Getter/Setterメソッドの引数として一定の値を渡します。
TMyRect = class
private
FValues: Array[0..3] of Integer;
function GetProperty(Index: Integer): Integer;
public
property Top : Integer Index 0 read GetProperty;
property Left : Integer Index 1 read GetProperty;
property Width : Integer Index 2 read GetProperty;
property Height : Integer Index 3 read GetProperty;
end;
function TMyRect.GetProperty(Index: Integer): Integer;
begin
Result := FValues[Index];
end;
いくつかのリソース
カバーするトピックはまだいくつかあります(インターフェイスの実装、保存された値、RTTI/設計時間プロパティなど)が、この投稿は少し長くなり始めました...
これらのサイトでもっと読むことができます:
プロパティはDelphiの大きな利点です。私は自分でかなりのJavaとDelphiをやったことがありますが、間違いなくプロパティに行くでしょう。実際には両方のアプローチが最終的に同じことを行い、プロパティがゲッター/セッターよりもはるかに厄介に見える唯一の違いがあります。
私はあなたがプロパティに行くことをお勧めします、そしてそれらを最大限に活用してください!
それは本当に味と使用の問題です。
Pascalのようなプログラマーにとって、あなたが価値を読んでいるか書いているかどうかは非常に明確です。したがって、すべての文でGetXxxまたはSetXXXを書くjavaのような方法でゲッターとセッターを使用しない場合、コードはより読みやすいと思いますあなたのプログラム。
私にとって、そして私はPascalプログラマの大多数について、あなたが読んでいる/執筆しているプロパティの名前を掲載するだけで、コードはより読みやすくなります。 。
また、Delphiプロパティモデルからの大きな利点(および優雅さ)であると思います。これは、フィールドからプロパティ値を直接取得/設定して、値があるコードのラインだけで多くのget/setメソッドを持つことができると思います。フィールドからの割り当てまたは読み取りは、努力/時間の完全な無駄です。