2012-03-22 38 views
5

Khi bạn có một thực thể, chẳng hạn như UserEntity, ai là tài sản id có nguồn gốc từ khóa chính của nó trong db - bạn có nên cung cấp phương thức setter như setId() không?ID của đối tượng là đối số hàm tạo hoặc thông qua phương thức setter?

Một số lập luận chống lại:

  • mở cửa để ghi đè bất ngờ có thể xảy ra UserEntities khác trong db
  • hai (hoặc nhiều hơn) UserEntities thể tồn tại bất cứ lúc nào với cùng id nhưng khác nhau thuộc tính . (Nếu tôi kéo 3 thành viên khác nhau từ db và thiết lập id giá trị của họ với cùng)

Một số lập luận cho:

  • nếu tôi không CÓ để nhanh chóng UserEntity với một id trong hàm tạo (vì nó có phương thức setter), tôi có thể sử dụng các phương thức của đối tượng UserEntity với các giá trị người dùng tạm thời/giả/mới ... mà không cần phải duy trì nó trước.

Cung cấp setter (và không bắt buộc id trong hàm tạo) hoặc bắt buộc id trong hàm tạo và xóa trình thiết lập?

Trả lời

3

Giá trị danh tính của một thực thể phải được quản lý bởi lớp kiên trì và lý tưởng sẽ không được đặt bởi bất kỳ thứ gì khác - lớp kiên trì sẽ gán giá trị nhận dạng mới khi lưu giữ và đặt nó khi truy xuất. Hơn nữa, bạn sẽ có thể sử dụng một thực thể tạm thời (không tồn tại) mà không cần truy cập vào danh tính của nó. Việc cho phép định danh được thiết lập thông qua hàm tạo có thể dẫn đến các vấn đề vì không có nguồn có thẩm quyền cho các giá trị nhận dạng. Một ví dụ trong đó danh tính có thể được chỉ định từ các nguồn bên ngoài là nếu một khách hàng yêu cầu một thực thể mới tồn tại có một số UUID như là danh tính của nó, mặc dù ví dụ này được giả tạo.

+0

Cảm ơn câu trả lời! Khi lớp persistence đặt danh tính, nó có nên thông qua constructor hay thông qua một setter không? Liệu thực thể có thể được khởi tạo mà không có danh tính? – johnnietheblack

+1

Nó phải thông qua một setter hoặc thông qua sự phản ánh tùy thuộc vào ngôn ngữ. Và cần phải biết ngay rằng khi một thực thể thoáng qua trở nên dai dẳng, các đặc điểm bình đẳng của nó có thể thay đổi trong khi đối tượng vẫn còn trong bộ nhớ nếu ví dụ mã băm có nguồn gốc từ danh tính. – eulerfx

1

@johnnietheblack, tôi muốn tạo một số thiết lập riêngbộ thu công khai cho id của các tổ chức. Xác nhận sẽ có trong setter (nếu cần thiết) và tôi đặt id này độc quyền vào constructors. Các số id được khởi tạo với các giá trị bằng không giúp tôi theo dõi vòng đời của chúng.

Thiết kế điều khiển tên miền của Eric Evans nói về miền mô hình khi Mô hình ứng dụng doanh nghiệp Kiến trúc của Martin Fowler sâu vào cơ sở hạ tầng của ứng dụng này. Tôi tin rằng họ là những bổ sung và tôi khuyên bạn nên.

+0

Cảm ơn! Im lo lắng rằng ngữ nghĩa đang giữ tôi trở lại, ở đây, bởi vì tôi sử dụng PHP, và tôi không chắc chắn những gì một setter tư nhân sẽ thực hiện? Trong PHP có nghĩa là, một phương thức setId() riêng và thực thể có thể sử dụng chính phương thức đó, nhưng không có thực thể nào khác có thể? – johnnietheblack

+0

Tôi thấy rằng nhiều lần cố gắng trở thành ngôn ngữ bất khả tri khó hơn là chỉ hỏi về một ngôn ngữ cụ thể ... haha – johnnietheblack

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