9

クラスの設計に少し問題があります。顧客クラスの作成は簡単に見えます:

TCustomer = Class
  private
    FIdNumber: String;
    FName: String;
    procedure SetName(const Value: String);
    procedure SetNumber(const Value: String);
  public
    Property Name : String read FName;
    Property IdNumber : String read FIdNumber;
    Constructor Create(Number, Name  : String);
end;

constructor TCustomer.Create(ANumber, AName: String);
begin
   SetName(AName);
   SetNumber(ANumber);
end;

MyCustomer := TCustomer.Create('1', 'John Doe');

しかし、私の顧客には、住んでいる場所、生年月日など、より多くのプロパティがあります。

TCustomer = Class
  private
    {..snip snip..}
  public
    Property Name : String read FName;
    Property IdNumber : String read FIdNumber;
    Property Street : String read FStreet;
    Property HouseNumber : Integer : read FHouseNumber;
    ..
    ..
    ..
    Constructor Create(Number, Name, Street : String; Housenumber : Integer .. .. ..);
end;

ご覧のとおり、たくさんの引数を持つコンストラクターになってしまいます。多くのプロパティを持つオブジェクトを構築するより良い方法は何ですか?

4

1 に答える 1

15

特定のクラスに多くのフィールドが必要な場合は、必須パラメーターのみを持つコンストラクターを作成し、残りは書き込み可能なプロパティに保持します。

type
  TCustomer = class
  private
    FName: string;
    FIdNumber: string;
    FStreet: string;
    FHouseNumber: Integer;
  public
    // constructor is empty or just with mandatory parameters
    constructor Create;
    // properties are writeable
    property Name: string read FName write FName;
    property IdNumber: string read FIdNumber write FIdNumber;
    property Street: string read FStreet write FStreet;
    property HouseNumber: Integer read FHouseNumber write FHouseNumber;
  end;

もちろん、これらのプロパティを公開して書き込み可能にすることができるかどうかによって異なりますが、私の見解では、多くのパラメーターを持つコンストラクターよりも使用法がよく見えます。

var
  Customer: TCustomer;
begin
  Customer := TCustomer.Create;
  Customer.Name := 'Name';
  Customer.IdNumber := 'ID number';
  Customer.Street := 'Street';
  Customer.HouseNumber := 12345;
end;
于 2013-03-06T15:54:01.997 に答える