2013-03-06 11 views
9

Mam trochę problemów z zaprojektowaniem klasy. Tworzenie klasy klienta wygląda prosta:Jak skonstruować obiekt z wieloma właściwościami?

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

Ale dobrze mój klient ma więcej właściwości: gdzie mieszka, data urodzenia itp itd

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; 

Jak widać ja skończyć z konstruktora z całą masą argumentów. Jaki jest lepszy sposób na skonstruowanie obiektu o wielu właściwościach?

+4

Moja początkowa thoght jest skonstruowanie klasę tylko w * * zasadniczych właściwości, które prowadzą do tworzenia instancji klasy. na przykład w twoim przypadku może to być unikalny "UserID". – kobik

+2

Możesz zrobić analogiczny ze swojego przypadku do utworzenia nowego rekordu DB ('insert'). Zastanów się, jakie właściwości są * wymagane * (użyj ich w argumentach konstruktora) i które właściwości mają wartości domyślne (zainicjuj je wewnątrz konstruktora klasy). – kobik

+1

można zdefiniować ** konstruktora **, który pobiera tablicę z pary i przy użyciu RTTI, analizuje klasę TCustomer i ustawia wartości pól z parametrów, tj. TMyCustomer.Create ([AProp ("FirstName", "Joe"), AProp ("LastName", "Doe"), ...]); – ComputerSaysNo

Odpowiedz

15

Jeśli pewna klasa musi mieć wiele pól, chciałbym zrobić konstruktor tylko z obowiązkowych parametrów i resztę chciałbym zachować właściwości zapisywalnych:

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; 

To oczywiście zależy, czy można wystawiać tych właściwości tak być zapisywalny, ale użycie wygląda moim zdaniem lepszy niż konstruktora z wieloma parametrami:

var 
    Customer: TCustomer; 
begin 
    Customer := TCustomer.Create; 
    Customer.Name := 'Name'; 
    Customer.IdNumber := 'ID number'; 
    Customer.Street := 'Street'; 
    Customer.HouseNumber := 12345; 
end; 
+6

+1, aby wspomnieć, że możemy w razie potrzeby wykonać kilka "przeciążeń" konstruktora ("konstruktor jest pusty lub tylko z obowiązkowymi parametrami") – kobik

+0

Można również użyć ustawiaczy właściwości w stylu płynnym, chociaż proste z/do prawdopodobnie zapewniłby równie zwięzły i bezpieczniejszy kod –

Powiązane problemy