Saya memiliki switch
struktur yang memiliki beberapa kasus untuk ditangani. Ini switch
beroperasi di atas enum
yang 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 switch
struktur 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 if
struktur 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 switch
struktur dengan kejatuhan di antara kasus-kasus.
Saya harus menggunakan goto
dalam hal itu karena C#
tidak memungkinkan jatuh. Namun, itu mencegah rantai logika yang sangat panjang meskipun ia melompat di dalam switch
struktur, 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 goto
kata 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?
goto
ketika struktur tingkat tinggi tidak ada dalam bahasa Anda. Saya terkadang berharap ada fallthru
; kata kunci untuk menyingkirkan penggunaan tertentu goto
tapi oh well.
goto
bahasa tingkat tinggi seperti C #, maka Anda mungkin mengabaikan banyak alternatif desain dan / atau implementasi lainnya (dan lebih baik). Sangat berkecil hati.