2013-03-06 66 views
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

我最初thoght是構造類只與維持類實例創建的*至關重要*屬性。例如在你的情況下,它可能是一個唯一的'UserID'。 – kobik 2013-03-06 15:52:48

+2

您可以將您的情況與創建新數據庫記錄('insert')做類似。考慮*所需的屬性*(在構造函數參數中使用它們)以及哪些屬性具有默認值(在您的類構造函數中初始化它們)。 – kobik 2013-03-06 16:02:21

+1

您可以定義**構造函數**,該構造函數需要一對對的數組,並使用RTTI解析TCustomer類並從參數中設置字段值,即TMyCustomer.Create([AProp('FirstName','Joe')) AProp('LastName','Doe'),...]); – ComputerSaysNo 2013-03-06 16:06:51

回答

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如果需要的話,我們可以根據需要(「構造函數是空的或只是帶有必需的參數」)構造幾個'constructor'的重載') – kobik 2013-03-06 16:23:00

+0

也可以使用流暢式屬性設置器,儘管使用/ do可能會提供同樣簡潔和更安全的代碼 – 2013-03-07 09:07:07