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, Id
dan 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 ...
Id
mewakili nilai konstan (yang karenanya dapat di-cache dengan aman), sementaraIsInvalidated
mungkin mengubah nilainya selama masa pakaiIX
objek (dan karenanya tidak perlu di-cache).
Bagaimana saya bisa memodifikasi interface IX
agar 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 samaIsInvalidated
mungkin 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
…Changed
acara untukIsInvalidated
menyatakan bahwa properti ini dapat mengubah nilainya, dan tidak adanya acara serupa untukId
merupakan janji bahwa properti itu tidak akan mengubah nilainya.Saya suka solusi ini, tetapi banyak hal tambahan yang mungkin tidak digunakan sama sekali.
Ganti properti
IsInvalidated
dengan 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; } }
InvalidStateException
s, misalnya, tetapi saya tidak yakin apakah ini secara teori mungkin. Akan menyenangkan.
IsInvalidated
perluprivate set
?