Tôi có một vấn đề thiết kế liên quan đến các thuộc tính .NET.
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
Vấn đề:
Giao diện này có hai thuộc tính chỉ đọc Id
và IsInvalidated
. Tuy nhiên, thực tế là chúng chỉ đọc, không có gì đảm bảo rằng giá trị của chúng sẽ không đổi.
Hãy nói rằng đó là ý định của tôi để làm cho nó rõ ràng rằng
Id
đại diện cho một giá trị không đổi (do đó có thể được lưu trữ an toàn), trong khiIsInvalidated
có thể thay đổi giá trị của nó trong suốt vòng đời của mộtIX
đối tượng (và do đó không nên lưu vào bộ nhớ cache).
Làm thế nào tôi có thể sửa đổi interface IX
để làm cho hợp đồng đó đủ rõ ràng?
Ba nỗ lực của riêng tôi tại một giải pháp:
Giao diện đã được thiết kế tốt. Sự hiện diện của một phương thức được gọi là
Invalidate()
cho phép một lập trình viên suy ra rằng giá trị của thuộc tính có cùng tênIsInvalidated
có thể bị ảnh hưởng bởi nó.Đối số này chỉ giữ trong trường hợp phương thức và thuộc tính được đặt tên tương tự.
Tăng cường giao diện này với một sự kiện
IsInvalidatedChanged
:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;
Sự hiện diện của một
…Changed
sự kiện choIsInvalidated
các tài sản này có thể thay đổi giá trị của nó và sự vắng mặt của một sự kiện tương tựId
là một lời hứa rằng tài sản đó sẽ không thay đổi giá trị của nó.Tôi thích giải pháp này, nhưng đó là rất nhiều thứ bổ sung có thể không được sử dụng.
Thay thế tài sản
IsInvalidated
bằng một phương phápIsInvalidated()
:bool IsInvalidated();
Điều này có thể là quá tinh tế một sự thay đổi. Nó được coi là một gợi ý rằng một giá trị được tính mới mỗi lần - điều này sẽ không cần thiết nếu đó là một hằng số. Chủ đề MSDN "Lựa chọn giữa các thuộc tính và phương thức" có ý nghĩa này để nói về nó:
Sử dụng một phương pháp, thay vì một tài sản, trong các tình huống sau đây. [V]] Hoạt động trả về một kết quả khác nhau mỗi lần nó được gọi, ngay cả khi các tham số không thay đổi.
Những loại câu trả lời tôi mong đợi?
Tôi quan tâm nhất đến các giải pháp hoàn toàn khác nhau cho vấn đề, cùng với lời giải thích về cách họ đánh bại những nỗ lực trên của tôi.
Nếu những nỗ lực của tôi là thiếu sót về mặt logic hoặc có những nhược điểm đáng kể chưa được đề cập, như vậy chỉ còn một giải pháp (hoặc không có), tôi muốn nghe về nơi tôi đã sai.
Nếu sai sót là nhỏ và vẫn còn nhiều giải pháp sau khi xem xét, vui lòng bình luận.
Ít nhất, tôi muốn có một số phản hồi về giải pháp ưa thích của bạn và vì lý do gì.
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateException
s, chẳng hạn, nhưng tôi không chắc liệu điều này thậm chí có thể về mặt lý thuyết hay không. Sẽ tốt đẹp, mặc dù.
IsInvalidated
cần mộtprivate set
?