2013-03-06 37 views
9

Tôi đang gặp một chút rắc rối khi thiết kế một Lớp học. Tạo một lớp khách hàng trông đơn giản:Làm cách nào để xây dựng một đối tượng có nhiều thuộc tính?

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

Nhưng cũng khách hàng của tôi có nhiều thuộc tính: nơi ông sống, ngày tháng năm sinh vv vv

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; 

Như bạn thấy tôi kết thúc với một constructor với rất nhiều đối số. Một cách tốt hơn để xây dựng một đối tượng với rất nhiều thuộc tính là gì?

+4

Thoght ban đầu của tôi là xây dựng lớp chỉ với các thuộc tính * cần thiết để duy trì tạo cá thể lớp. ví dụ trong trường hợp của bạn, nó có thể là một 'UserID' duy nhất. – kobik

+2

Bạn có thể thực hiện tương tự trường hợp của mình để tạo bản ghi DB mới ('chèn'). Hãy suy nghĩ xem các thuộc tính nào là * required * (sử dụng chúng trong các đối số constructor) và các thuộc tính nào có mặc định (khởi tạo chúng trong constructor lớp của bạn). – kobik

+1

bạn có thể định nghĩa một constructor ** ** mà phải mất một mảng của cặp và sử dụng RTTI, bạn phân tích các lớp TCustomer và giá trị trường thiết lập từ các thông số, tức là TMyCustomer.Create ([AProp ('FirstName', 'Joe'), AProp ('LastName', 'Doe'), ...]); – ComputerSaysNo

Trả lời

15

Nếu một lớp nhất định cần phải có nhiều lĩnh vực, tôi sẽ làm cho một nhà xây dựng chỉ với các thông số bắt buộc và phần còn lại tôi sẽ giữ trong thuộc tính có khả năng ghi:

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; 

Điều này tất nhiên phụ thuộc, nếu bạn có thể phơi bày những các thuộc tính để có thể ghi được, nhưng cách sử dụng trông trong chế độ xem của tôi tốt hơn hàm tạo với nhiều tham số:

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

1 chỉ đề cập đến chúng ta có thể thực hiện một số 'overload's của 'constructor' nếu cần thiết ("constructor rỗng hoặc chỉ với các thông số bắt buộc") – kobik

+0

setters tài sản thạo kiểu có thể được sử dụng là tốt, mặc dù đơn giản với/làm có lẽ sẽ cung cấp cho các mã súc tích và an toàn hơn –

Các vấn đề liên quan