2013-03-06 20 views
9

私はクラスを設計するのに苦労します。私は、コンストラクタで終わるご覧のよう生年月日は多くのプロパティを持つオブジェクトを作成する方法は?

などなど、
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; 

を彼が住ん:

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'); 

しかし、よく私の顧客は、より多くのプロパティがあります。 は簡単に見えるカスタマー・クラスの作成します多くの議論があります。多くのプロパティを持つオブジェクトを構築するより良い方法は何ですか?特定のクラスは、多くのフィールドを持つ必要がある場合は、私が唯一の必須パラメータと、私は書き込み可能なプロパティで続けるだろう残りのコンストラクタになるだろう

+4

は私の最初のthoghtは、クラスインスタンス生成を維持*不可欠*プロパティを持つクラスを構築することです。例えばあなたの場合、それはユニークな 'UserID'かもしれません。 – kobik

+2

あなたのケースに似て、新しいDBレコードを作成することができます( 'insert')。どんなプロパティが*必須か(コンストラクタ引数で使用する)と、どのプロパティがデフォルトを持つか(クラスコンストラクタ内で初期化する)を考えます。 – kobik

+1

の配列をとり、RTTIを使用してTCustomerクラスを解析し、フィールド値をパラメータ、つまりTMyCustomer.Create([AProp( 'FirstName'、 'Joe')]で設定する**コンストラクタ**を定義できます。 AProp( 'LastName'、 'Doe')、...]); – ComputerSaysNo

答えて

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; 
+6

+1必要であればコンストラクタのいくつかの 'overload'を行うことができます("コンストラクタは空であるか、必須のパラメータだけです ") – kobik

+0

流暢なスタイルのプロパティ設定ツールも使用できますおそらく同等に簡潔で安全なコードを提供するでしょう –

関連する問題