2013-03-06 3 views
9

У меня возникли проблемы с проектированием класса. Создание класса Customer выглядит просто:Как построить объект с большим количеством свойств?

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

+2

Вы можете сделать аналогичным вашему делу создание новой записи БД ('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 просто упомянем, что мы можем сделать несколько 'перегрузок' 'конструктора ', если это необходимо (« конструктор пуст или просто с обязательными параметрами ») – kobik

+0

Также могут быть использованы средства определения свойств в свободном стиле, хотя это просто с/do вероятно, обеспечит одинаково краткий и более безопасный код –

Смежные вопросы