Sử dụng tài sản công cộng và lĩnh vực công cộng


8

Nơi tôi làm việc, sử dụng Thuộc tính không được khuyến khích. Chúng tôi có các công cụ tạo mã để "tăng tốc mọi thứ". Tất cả dữ liệu đối tượng kết thúc là trường Công cộng. Nếu bạn yêu cầu thuộc tính nào, bạn sẽ nhận được một cái gì đó như thế này:

Public sFoo as String

Public Property Foo as String
  Get
    Return sFoo
  End Get
  Set(ByVal value as String)
    sFoo = value
  End Set
End Property

Tôi không thể nghĩ ra một lý lẽ hợp lý để làm điều này. Có bất kỳ lý do chính đáng nào để sử dụng cả Tài sản công cộng với Trường công cộng không?


2
Không. thay đổi trình tạo mã để tạo chuỗi công khai Foo {get; bộ; } thay vào đó
Steven A. Lowe

1
Có bằng chứng nào cho thấy nó tăng tốc mọi thứ không? Có bằng chứng nào cho thấy mã khi được thực thi là khác nhau không? Sao bạn hỏi điều này; bạn rõ ràng đã biết điều này là ngu ngốc. Gánh nặng của bằng chứng nên thuộc về người thực hành việc này. Nếu họ không thể biện minh cho điều đó và bạn không thể khiến họ thay đổi, thì tôi sẽ đề xuất một công việc mới!
Dave Hillier

4
Tại sao một downvote? Đó là lỗi của tác giả rằng trong công ty của mình, có những hướng dẫn ngu ngốc.
Arseni Mourzenko

Có thể lĩnh vực này có nghĩa là riêng tư và được trả lại bởi Tài sản. Có thể ai đó biết khái niệm này nhưng làm rối tung thời gian lớn. Sử dụng lĩnh vực riêng được trưng ra làm tài sản công cộng là cách thực hành mã hóa tốt và được sử dụng ngay cả khi bạn không nhìn thấy nó.
Piotr Kula

Câu trả lời:


28

Không.

Không có lý do chính đáng cho việc này. Nó:

  1. Nhầm lẫn các lập trình viên khác bằng cách làm điều gì đó vô nghĩa,
  2. Tiếp xúc với các bộ phận trong lớp của bạn một cách không cần thiết,
  3. Cung cấp hai điểm vào cho cùng một thứ,
  4. ??

Sử dụng Thuộc tính tự động thực hiện thay thế.


5
Là người downvoter nghiêm túc ủng hộ việc sử dụng các tài sản công cộng VÀ các trường cùng một lúc? Tôi cảm thấy hơi mệt mỏi khi có một downvote cho mỗi câu trả lời tôi đăng ... Nếu bạn có đủ thời gian để theo dõi tôi về việc hạ thấp câu trả lời của tôi, bạn cần một sở thích mới.
Robert Harvey

Ai đó đang rình rập bạn Robert. Không phải tôi vì đây chắc chắn là câu trả lời chính xác và câu hỏi của OP khiến tôi choáng váng. Nhiều năm học và viết nó thậm chí không bao giờ vượt qua tâm trí tôi để làm một việc như vậy ..
Piotr Kula

Tôi cũng đã nghe một số người cho rằng việc sử dụng các thuộc tính phải chịu một hình phạt về hiệu năng đối với các trường truy cập trực tiếp, nhưng nói chung điều đó không đúng. Trong mọi phiên bản CLR mà tôi từng gặp, các thuộc tính đơn giản như thế này hầu như luôn được trình tối ưu hóa nội tuyến, do đó, ngay cả đó không phải là vấn đề thực tế.
Cole Campbell

2

Một trong những nguyên tắc hướng đối tượng cơ bản được gọi là Đóng gói. Nó nói rằng mỗi đối tượng nên bảo vệ dữ liệu của nó khỏi sửa đổi bên ngoài.

Điều này được thực hiện bằng cách làm cho tất cả các trường riêng tư và nếu có thể cũng làm cho tất cả các setters tài sản là riêng tư. Thay vào đó, bạn phải giới thiệu hành vi bằng cách thêm các phương thức được sử dụng để sửa đổi trạng thái.

Những gì bạn đang làm là rất sai. Về bản chất, nó chỉ là lập trình chức năng trong đó tất cả các lớp chỉ là các thùng chứa dữ liệu hoặc một cách để phân nhóm các phương thức. Cái trước là một mô hình chống được gọi là Mô hình miền thiếu máu .

Vấn đề với điều đó là logic nghiệp vụ cho mọi mô hình miền được trải rộng trên một số vị trí trong ứng dụng của bạn (tức là mọi nơi mà đối tượng được sửa đổi). Do đó, thật khó để tìm ra các lỗi liên quan đến quy tắc kinh doanh của bạn khi bạn phải phân tích mọi nơi sử dụng đối tượng, thay vì chỉ phân tích chính đối tượng đó.

Tôi đã viết về điều này ở đây: http://blog.gauffin.org/2012/06/protect-your-data/


1

Có bất kỳ lý do chính đáng nào để sử dụng cả Tài sản công cộng với Trường công cộng không?

Tóm lại: Không , không có lời biện minh nào cho điều đó. Các tài sản công cộng có nhiều sử dụng kinh doanh hơn các lĩnh vực công cộng.

Một số trong nhiều cách sử dụng các thuộc tính là:

  • Thuộc tính có thể xác thực dữ liệu trước khi cho phép thay đổi
  • Nó có thể hiển thị dữ liệu trong một lớp trong đó dữ liệu đó thực sự được lấy từ một số nguồn khác, chẳng hạn như cơ sở dữ liệu
  • Nó có thể thực hiện hành động khi dữ liệu được thay đổi, chẳng hạn như nâng cao sự kiện hoặc thay đổi giá trị của các trường khác

Như đã đề xuất, sử dụng các thuộc tính tự động là một cách thông minh khác để đi cùng.

Thêm chi tiết trong các thuộc tính MSDN - VB.NET

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.