Baru-baru ini, saya lebih suka memetakan 1-1 hubungan menggunakan Dictionaries
daripada Switch
pernyataan. Saya merasa sedikit lebih cepat untuk menulis dan proses mental lebih mudah. Sayangnya, saat memetakan ke instance objek baru, saya tidak ingin mendefinisikannya seperti ini:
var fooDict = new Dictionary<int, IBigObject>()
{
{ 0, new Foo() }, // Creates an instance of Foo
{ 1, new Bar() }, // Creates an instance of Bar
{ 2, new Baz() } // Creates an instance of Baz
}
var quux = fooDict[0]; // quux references Foo
Mengingat konstruk itu, saya telah membuang siklus CPU dan memori membuat 3 objek, melakukan apa pun yang mungkin mengandung konstruktor mereka, dan akhirnya hanya menggunakan salah satu dari mereka. Saya juga percaya bahwa memetakan objek lain fooDict[0]
dalam hal ini akan menyebabkan mereka merujuk hal yang sama, daripada membuat contoh baru Foo
seperti yang dimaksudkan. Solusinya adalah dengan menggunakan lambda sebagai gantinya:
var fooDict = new Dictionary<int, Func<IBigObject>>()
{
{ 0, () => new Foo() }, // Returns a new instance of Foo when invoked
{ 1, () => new Bar() }, // Ditto Bar
{ 2, () => new Baz() } // Ditto Baz
}
var quux = fooDict[0](); // equivalent to saying 'var quux = new Foo();'
Apakah ini sampai pada titik di mana itu terlalu membingungkan? Sangat mudah untuk melewatkannya ()
pada akhirnya. Atau apakah pemetaan ke fungsi / ekspresi merupakan praktik yang cukup umum? Alternatifnya adalah menggunakan sakelar:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Doa mana yang lebih bisa diterima?
- Kamus, untuk pencarian lebih cepat dan lebih sedikit kata kunci (huruf besar dan kecil)
- Switch: Lebih umum ditemukan dalam kode, tidak memerlukan penggunaan fungsi <> objek untuk tipuan.
fooDict[0] is fooDict[0]
). dengan kedua lambda dan saklar ini tidak terjadi