Saya mengalami masalah desain tentang properti .NET.
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
Masalah:
Antarmuka ini memiliki dua properti hanya-baca, Iddan IsInvalidated. Namun, fakta bahwa itu hanya baca-saja, tidak dengan sendirinya menjamin bahwa nilai-nilai mereka akan tetap konstan.
Katakanlah itu maksud saya untuk membuatnya sangat jelas bahwa ...
Idmewakili nilai konstan (yang karenanya dapat di-cache dengan aman), sementaraIsInvalidatedmungkin mengubah nilainya selama masa pakaiIXobjek (dan karenanya tidak perlu di-cache).
Bagaimana saya bisa memodifikasi interface IXagar kontrak itu cukup eksplisit?
Tiga upaya saya sendiri pada solusi:
Antarmuka sudah dirancang dengan baik. Kehadiran metode yang disebut
Invalidate()memungkinkan seorang programmer untuk menyimpulkan bahwa nilai properti dengan nama yang samaIsInvalidatedmungkin dipengaruhi olehnya.Argumen ini hanya berlaku dalam kasus di mana metode dan properti diberi nama yang sama.
Tambahkan antarmuka ini dengan sebuah acara
IsInvalidatedChanged:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;Kehadiran
…Changedacara untukIsInvalidatedmenyatakan bahwa properti ini dapat mengubah nilainya, dan tidak adanya acara serupa untukIdmerupakan janji bahwa properti itu tidak akan mengubah nilainya.Saya suka solusi ini, tetapi banyak hal tambahan yang mungkin tidak digunakan sama sekali.
Ganti properti
IsInvalidateddengan metodeIsInvalidated():bool IsInvalidated();Ini mungkin perubahan yang terlalu halus. Seharusnya petunjuk bahwa nilai dihitung baru setiap kali - yang tidak perlu jika itu adalah konstanta. Topik MSDN "Memilih Antara Properti dan Metode" memiliki ini untuk mengatakan tentang hal itu:
Gunakan metode, daripada properti, dalam situasi berikut. […] Operasi mengembalikan hasil yang berbeda setiap kali dipanggil, bahkan jika parameternya tidak berubah.
Jawaban apa yang saya harapkan?
Saya paling tertarik dengan solusi yang sama sekali berbeda untuk masalah ini, bersama dengan penjelasan bagaimana mereka mengalahkan upaya saya di atas.
Jika upaya saya secara logika cacat atau memiliki kerugian yang signifikan belum disebutkan, sehingga hanya satu solusi (atau tidak ada) yang tersisa, saya ingin mendengar tentang kesalahan saya.
Jika kekurangannya kecil, dan lebih dari satu solusi tetap setelah dipertimbangkan, silakan komentar.
Paling tidak, saya ingin umpan balik yang merupakan solusi pilihan Anda, dan untuk alasan apa.
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateExceptions, misalnya, tetapi saya tidak yakin apakah ini secara teori mungkin. Akan menyenangkan.
IsInvalidatedperluprivate set?