Saya memiliki switchstruktur yang memiliki beberapa kasus untuk ditangani. Ini switchberoperasi di atas enumyang menimbulkan masalah kode duplikat melalui nilai gabungan:
// All possible combinations of One - Eight.
public enum ExampleEnum {
One,
Two, TwoOne,
Three, ThreeOne, ThreeTwo, ThreeOneTwo,
Four, FourOne, FourTwo, FourThree, FourOneTwo, FourOneThree,
FourTwoThree, FourOneTwoThree
// ETC.
}
Saat ini switchstruktur menangani setiap nilai secara terpisah:
// All possible combinations of One - Eight.
switch (enumValue) {
case One: DrawOne; break;
case Two: DrawTwo; break;
case TwoOne:
DrawOne;
DrawTwo;
break;
case Three: DrawThree; break;
...
}
Anda mendapatkan idenya di sana. Saat ini saya memecahnya menjadi ifstruktur bertumpuk untuk menangani kombinasi dengan satu baris saja:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Ini menimbulkan masalah evaluasi logis yang sangat panjang yang membingungkan untuk dibaca dan sulit dipertahankan. Setelah mengulangi hal ini, saya mulai berpikir tentang alternatif dan memikirkan gagasan tentang switchstruktur dengan kejatuhan di antara kasus-kasus.
Saya harus menggunakan gotodalam hal itu karena C#tidak memungkinkan jatuh. Namun, itu mencegah rantai logika yang sangat panjang meskipun ia melompat di dalam switchstruktur, dan itu tetap membawa duplikasi kode.
switch (enumVal) {
case ThreeOneTwo: DrawThree; goto case TwoOne;
case ThreeTwo: DrawThree; goto case Two;
case ThreeOne: DrawThree; goto default;
case TwoOne: DrawTwo; goto default;
case Two: DrawTwo; break;
default: DrawOne; break;
}
Ini masih bukan solusi yang cukup bersih dan ada stigma yang terkait dengan gotokata kunci yang ingin saya hindari. Saya yakin harus ada cara yang lebih baik untuk membersihkan ini.
Pertanyaan saya
Apakah ada cara yang lebih baik untuk menangani kasus khusus ini tanpa mempengaruhi keterbacaan dan pemeliharaan?
gotoketika struktur tingkat tinggi tidak ada dalam bahasa Anda. Saya terkadang berharap ada fallthru; kata kunci untuk menyingkirkan penggunaan tertentu gototapi oh well.
gotobahasa tingkat tinggi seperti C #, maka Anda mungkin mengabaikan banyak alternatif desain dan / atau implementasi lainnya (dan lebih baik). Sangat berkecil hati.