Saya memiliki pertanyaan "praktik terbaik" tentang OOP di C # (tapi itu semacam berlaku untuk semua bahasa).
Pertimbangkan memiliki kelas pustaka dengan objek yang akan diekspos ke publik, katakanlah melalui accessor properti, tetapi kami tidak ingin publik (orang yang menggunakan kelas pustaka ini) mengubahnya.
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
Jelas pendekatan terbaik adalah "opsi C", tetapi sangat sedikit objek memiliki varian ReadOnly (dan tentu saja tidak ada kelas yang ditentukan pengguna memilikinya).
Jika Anda adalah pengguna kelas A, apakah Anda mengharapkan perubahan
List<string> someList = ( new A() ).Items;
merambat ke objek asli (A)? Atau tidak apa-apa mengembalikan klon asalkan ditulis begitu dalam komentar / dokumentasi? Saya pikir pendekatan klon ini mungkin menyebabkan bug yang sulit dilacak.
Saya ingat bahwa di C ++ kita bisa mengembalikan objek const dan Anda hanya bisa memanggil metode yang ditandai sebagai const di atasnya. Saya kira tidak ada fitur / pola seperti itu di C #? Jika tidak, mengapa mereka tidak memasukkannya? Saya percaya ini disebut benar const.
Tetapi sekali lagi pertanyaan utama saya adalah tentang "apa yang Anda harapkan" atau bagaimana menangani Opsi A vs B.