Bagikan melalui


Desain Enum

Catatan

Konten ini dicetak ulang oleh izin Pearson Education, Inc. dari Panduan Desain Kerangka Kerja: Konvensi, Idiom, dan Pola untuk Pustaka .NET yang Dapat Digunakan Kembali, Edisi ke-2. Edisi itu diterbitkan pada tahun 2008, dan buku tersebut telah sepenuhnya direvisi pada edisi ketiga. Beberapa informasi di halaman ini mungkin sudah kedaluarsa.

Enum adalah jenis nilai khusus. Ada dua jenis enum: enum sederhana dan enum bendera.

Enum sederhana merepresentasikan set pilihan kecil dan tertutup. Contoh umum enum sederhana adalah set warna.

Enum bendera dirancang untuk mendukung operasi bitwise pada nilai enum. Contoh umum enum bendera adalah daftar opsi.

✔️ DO menggunakan enum untuk mengetik parameter, properti, dan nilai yang dikembalikan dengan kuat yang mewakili kumpulan nilai.

✔️ DO mendukung penggunaan enum alih-alih konstanta statis.

❌ JANGAN gunakan enum untuk set terbuka (seperti versi sistem operasi, nama teman Anda, dll.).

❌ JANGAN berikan nilai enum yang dipesan yang ditujukan untuk digunakan di masa mendatang.

Anda selalu dapat menambahkan nilai ke enum yang ada di tahap selanjutnya. Lihat Menambahkan Nilai ke Enum untuk perincian selengkapnya tentang menambahkan nilai ke enum. Nilai yang dicadangkan hanya mengontaminasi kumpulan nilai nyata dan cenderung menyebabkan kesalahan pengguna.

❌ HINDARI enum yang mengekspos enum secara publik hanya dengan satu nilai.

Praktik umum untuk memastikan ekstensibilitas C API di masa mendatang adalah dengan menambahkan parameter yang dicadangkan ke tanda tangan metode. Parameter yang dicadangkan tersebut dapat diekspresikan sebagai enum dengan satu nilai default. Ini tidak boleh dilakukan di API terkelola. Kelebihan metode memungkinkan penambahan parameter di rilis mendatang.

❌ JANGAN sertakan nilai sentinel dalam enum.

Meskipun terkadang bermanfaat bagi pengembang kerangka kerja, nilai sentinel membingungkan bagi pengguna kerangka kerja. Mereka digunakan untuk melacak status enum dibandingkan menjadi salah satu nilai dari set yang diwakili oleh enum.

✔️ DO memberikan nilai nol pada enum sederhana.

Pertimbangkan untuk menyebut nilai tersebut seperti "Tidak Ada". Jika nilai seperti itu tidak sesuai untuk enum khusus ini, nilai default paling umum untuk enum harus diberi nilai dasar nol.

✔️ PERTIMBANGKAN menggunakan Int32 (default dalam sebagian besar bahasa pemrograman) sebagai jenis enum yang mendasar kecuali salah satu hal berikut ini benar:

  • Enum adalah bendera enum dan Anda memiliki lebih dari 32 flag, atau berharap memiliki lebih banyak di masa mendatang.

  • Jenis dasar harus berbeda dari Int32 untuk interoperabilitas yang lebih mudah dengan kode yang tidak dikelola mengharapkan enum ukuran berbeda.

  • Jenis dasar yang lebih kecil akan sangat menghemat ruang. Jika Anda mengharapkan enum digunakan terutama sebagai argumen untuk aliran kontrol, ukurannya membuat sedikit perbedaan. Penghematan ukuran dapat signifikan jika:

    • Anda mengharapkan enum untuk digunakan sebagai bidang dalam struktur atau kelas yang sangat sering dipakai.

    • Anda mengharapkan pengguna untuk membuat array besar atau koleksi instans enum.

    • Anda mengharapkan banyak instans enum untuk diserialkan.

Untuk penggunaan dalam memori, ketahuilah bahwa objek yang dikelola selalu selaras dengan DWORD, jadi Anda secara efektif memerlukan beberapa enum atau struktur kecil lainnya dalam sebuah instans untuk mempaketkan enum yang lebih kecil untuk membuat perbedaan, karena total ukuran instans selalu berjalan dibulatkan menjadi DWORD.

✔️ Enum bendera nama DO dengan kata benda jamak atau frasa kata benda dan enum sederhana dengan kata benda tunggal atau frasa kata benda.

❌ JANGAN memperpanjang System.Enum secara langsung.

System.Enum adalah jenis khusus yang digunakan oleh CLR untuk membuat enumerasi yang ditentukan pengguna. Sebagian besar bahasa pemrograman menyediakan elemen pemrograman yang memberi Anda akses atas fungsionalitas ini. Misalnya, dalam C# kata kuncienum digunakan untuk menentukan enumerasi.

Mendesain Enum Bendera

✔️ DO menerapkan System.FlagsAttribute ke enum bendera. Jangan terapkan atribut ini ke enum sederhana.

✔️ DO menggunakan kekuatan dua untuk nilai enum bendera sehingga dapat digabungkan dengan bebas menggunakan operasi OR bitwise.

✔️ PERTIMBANGKAN menyediakan nilai enum khusus untuk kombinasi bendera yang umum digunakan.

Operasi bitwise adalah konsep lanjutan dan tidak diperlukan untuk tugas sederhana. ReadWrite adalah contoh nilai khusus tersebut.

❌ AVOID membuat enum bendera di mana kombinasi nilai tertentu tidak valid.

❌ HINDARI menggunakan nilai enum bendera nol kecuali nilai mewakili "semua bendera dibersihkan" dan dinamai dengan tepat, seperti yang ditentukan oleh pedoman berikutnya.

✔️ DO beri nama nilai nol enum bendera None. Untuk enum bendera, nilai harus selalu berarti "semua bendera dihapus."

Menambahkan Nilai ke Enum

Hal yang sangat umum untuk mengetahui bahwa Anda perlu menambahkan nilai ke enum setelah Anda mengirimkannya. Ada potensi masalah kompatibilitas aplikasi saat nilai tambah baru dikembalikan dari API yang ada, karena aplikasi yang ditulis dengan buruk mungkin tidak menangani nilai baru dengan benar.

✔️ PERTIMBANGKAN untuk menambahkan nilai ke enum, meskipun ada risiko kompatibilitas yang kecil.

Jika Anda memiliki data nyata tentang ketidakcocokan aplikasi yang disebabkan oleh penambahan ke enum, pertimbangkan untuk menambahkan API baru yang mengembalikan nilai baru dan lama, dan menghentikan API lama, yang akan terus mengembalikan nilai lama saja. Ini akan memastikan bahwa aplikasi Anda yang ada tetap kompatibel.

Portions © 2005, 2009 Microsoft Corporation. Semua hak dilindungi undang-undang.

Dicetak ulang dengan izin dari Pearson Education, Inc. dari Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition oleh Krzysztof Cwalina dan Brad Abrams, diterbitkan 22 Okt 2008 oleh Addison-Wesley Professional sebagai bagian dari Seri Pengembangan Microsoft Windows.

Lihat juga