2010-01-08 25 views
32

Tôi có một số thực thể có các trường được tính toán trên chúng như TotalCost. Ngay bây giờ tôi có tất cả chúng như là tài sản nhưng tôi tự hỏi nếu họ thực sự nên được phương pháp. Có một tiêu chuẩn C# cho điều này?C# chỉ đọc thuộc tính được tính toán, chúng có nên là phương pháp không?

public class WorkOrder 
{ 
    public int LaborHours { get; set; } 
    public decimal LaborRate { get; set; } 

    // Should this be LaborCost()? 
    public decimal LaborCost 
    { 
     get 
     { 
      return LaborHours * LaborRate; 
     } 
    } 
} 
+4

Bạn hoàn toàn chính xác. Điều duy nhất tôi sẽ thêm là 'this.' trước' LaborHours' và 'LaborRate', nhưng đó chỉ là để dễ đọc. –

+11

Và cá nhân tôi sẽ không thêm 'this.' từ sở thích của tôi là nó làm giảm khả năng đọc ... :-) – Cellfish

+0

@Cellfish: Đồng ý, chúng ta hãy cố gắng cắt giảm số lượng không cần thiết verbosity xin vui lòng. –

Trả lời

43

Bạn có thể sử dụng các thuộc tính được tính thay vì phương pháp, miễn là tính toán không mất thời gian đáng chú ý

Xem Property usage guidelines

+2

+1 để tra cứu liên kết. –

+1

+1 được liên kết trực tiếp từ nguồn –

+0

Tôi rất vui khi biết điều này không phải là thực hành tồi. Tôi khá thích nó sau khi đến từ đất Java. Cảm ơn các liên kết! –

0

Theo tôi, đó là sở thích; đó là những gì bạn muốn làm. Tôi làm propreties trong hầu hết các trường hợp, trừ khi có logic tham gia. Ngoài ra, nếu bạn cần chuyển các tham số để thay đổi chức năng thì rõ ràng phương pháp sẽ áp dụng ...

1

Tôi sẽ để chúng làm thuộc tính. Nhưng không có lý do "tiêu chuẩn" để làm mọi thứ theo cách này hay cách khác. Nếu bạn là một mình, làm bất cứ điều gì bạn thích nhất. Nếu bạn tham gia một nhóm, hãy làm theo các quy ước mà các thành viên còn lại của bạn đang theo dõi.

14

Tôi nghĩ rằng phương pháp nên thực hiện các hành động trên đối tượng, thường thay đổi trạng thái của đối tượng. Thuộc tính phải phản ánh trạng thái hiện tại của đối tượng ngay cả khi thuộc tính được tính toán. Vì vậy, bạn nên giữ tài sản của bạn IMO.

+0

Điều gì sẽ xảy ra nếu hoạt động liên quan đến số lượng đáng kể tính toán? –

+7

Các lập trình giả sử truy cập tài sản là không đổi-thời gian, vì vậy Microsoft đề nghị không làm bất kỳ tính toán phức tạp nào trong các thuộc tính, mà thay vào đó sử dụng các phương thức khi có sự xử lý quan trọng liên quan. –

+1

Không quan trọng. Cho dù đó là một tài sản hoặc phương pháp không nói cho người gọi bất cứ điều gì. –

0

Tùy thuộc, nếu "thuộc tính" của bạn trở thành voi ma mút và yêu cầu toàn bộ lô logic kinh doanh thì chúng không nên là tài sản, nên có phương pháp. Ví dụ bạn đã đăng có vẻ ok là tài sản. Không có cách làm tiêu chuẩn nào, đi theo bản năng ruột của bạn; nếu nó có vẻ như nó cần phải làm rất nhiều bạn có thể cần một phương pháp.

3

Nếu chúng là a) trọng lượng nhẹ và b) không có tác dụng phụ, tôi sẽ biến chúng thành Thuộc tính.

Trọng lượng nhẹ có một chút mờ nhạt, nhưng nguyên tắc là: Nếu tôi phải lo lắng gọi một thuộc tính (có thể là vòng lặp hoặc bất kỳ nơi nào khác), nó có thể là phương pháp.

+1

Bạn cũng có thể có một thuộc tính lười biếng có thể buộc phải tính lại dựa trên một số phương thức rõ ràng [chẳng hạn như Refesh()] hoặc sự kiện ngầm [như vậy là bộ nhớ cache hết thời gian chờ]. Điều này sẽ cho phép các thuộc tính dễ ràng buộc/tuần tự hóa và khả năng cập nhật dữ liệu. –

+0

Rất đúng. Thuộc tính tải xuống rất hiếm nhưng hữu ích. –

6

Tôi nghĩ tất cả chúng nên là tài sản. Miễn là nó không thay đổi trạng thái của đối tượng, tôi sẽ làm mát nó với tư cách là một tài sản.

Ngoài ra, nếu tôi đang sử dụng lớp của bạn để ràng buộc dữ liệu (WPF, v.v.), thì tôi có thể liên kết trực tiếp với thuộc tính của bạn mà không phải sửa đổi/mở rộng lớp.

+2

+1 cho databinding – ChrisF

+0

+1 cho ràng buộc dữ liệu! Thực hiện tốt. –

+1

Đồng ý, mặc dù điều quan trọng cần nhớ là nếu bạn muốn liên kết với thuộc tính được tính toán, thì các phương thức định sẵn thuộc tính hoặc trình biến đổi khác cần phải tăng sự kiện PropertyChanged cho thuộc tính được tính. – itowlson

0

Nếu một thuộc tính đặc biệt đắt tiền để tính toán, tôi có thể thay đổi nó thành phương thức GetWhatever(). Điều này phục vụ như là một gợi ý cho bất cứ ai sử dụng lớp của tôi rằng giá trị này đòi hỏi một số công việc quan trọng để đến, và người gọi nên cache giá trị thay vì gọi phương thức nhiều lần.

Tính toán nhỏ gọn là hoàn toàn thích hợp bên trong các thuộc tính.

0

Phần lớn chỉ là cú pháp cú pháp, vì vậy bạn muốn bạn là quy ước trong nhóm của bạn, hoặc những gì bạn thích, miễn là nó chỉ trả về thông tin về đối tượng và không thay đổi hoặc tương tác với các đối tượng khác.

0

MSDN cung cấp thông tin về vấn đề này here

nhà thiết kế thư viện lớp thường phải quyết định giữa thực hiện một thành viên lớp như một tài sản hoặc một phương pháp. Trong số chung, các phương thức thể hiện hành động và thuộc tính thể hiện dữ liệu.

Bạn nghĩ đó là loại nào? Một hành động tính toán/getLaborCost hoặc dữ liệu?

WorkOrder workOrder = new WorkOrder(); 
workOrder.LaborHours = 8; 
workOrder.LaborRate = 20; 

decimal cost = workOrder.LaborCost; // This is OK here 

nhưng nếu bạn đang đi để làm điều này cho cùng một đối tượng cũng:

worOrder.LaborHours = 18; 
decimal newCost = workOrder.LaborCost 

Bây giờ điều này có thể không phải là một tài sản. Nó sẽ tốt hơn rất nhiều để trở thành một phương pháp.

0

Đôi khi, bạn cũng phải xem xét những gì bạn đang làm mẫu ... Trên một số miền, giá trị được tính thường hoặc được mong đợi là thuộc tính của mô hình - Thuộc tính. Nếu đây là trường hợp, sau đó viết nó như là một tài sản mặc dù tính toán không phải là ở tất cả tầm thường hoặc một chút tốn kém để tính toán. Chỉ cần ghi lại nó trên API của bạn hoặc thực hiện một số cơ chế lưu vào bộ nhớ đệm để giảm thiểu việc tính toán lại cho thuộc tính này.

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