Saya membaca beberapa kode di sini dan melihat bahwa enum digunakan untuk menyimpan nama tag html. Mengapa kita perlu melakukan ini? Apa manfaat yang saya peroleh dengan menggunakan strategi ini?
Saya tahu betapa bermanfaatnya enum dalam bahasa yang dikompilasi atau diketik secara statis, tetapi ketika saya melihat enum dalam bahasa yang diketik secara dinamis, saya jadi penasaran, seperti contoh kode yang saya perlihatkan di atas. Jadi, pertanyaannya pada dasarnya adalah mengapa kita perlu enum dalam bahasa yang diketik secara dinamis atau apakah kita membutuhkannya?
enum People { YOU, NPC, FOO, BAR }
dan fungsi yang menginginkan (Orang)int
, Anda dapat menyambungkan apa saja, alih-alih menggunakan angka.Jawaban:
Manfaatnya adalah kompiler dapat memberi tahu Anda jika Anda secara tidak sengaja mengetik "ADRESS" atau "FEILDSET", dan membiarkan Anda segera memperbaikinya alih-alih berperilaku dengan cara yang tidak masuk akal saat runtime.
Meskipun manfaatnya jauh lebih berguna dalam bahasa yang diketik secara statis daripada dinamis, itu tetap berguna bahkan jika itu adalah kesalahan runtime karena Anda akan mendapatkan pesan yang menunjukkan masalah dengan pernyataan kasus Anda daripada data Anda.
sumber
"PROF1LE_"
$1
ketika saya maksudkan$i
. (Memang, saya tidak pernah mengetikf1le
daripadafile
-$1
kesalahan dipikirkan oleh fakta yang$1
sangat umum di Perl - tapi tetap saja, kesalahan semua jenis adalah umum. Mungkin dev memiliki kata sandiprof1le
di dalamnya, sehingga mendorong mereka untuk salah ketikprofile
dalam konteks non-kata sandi.)Enum berguna untuk situasi di mana Anda memiliki serangkaian nilai / entitas yang masuk akal. Mereka mendokumentasikan diri sendiri dan memungkinkan kompilator memvalidasi hal-hal yang seharusnya dibiarkan berjalan-waktu. Mereka tidak boleh digunakan jika himpunan nilai-nilai yang bermakna tidak diketahui atau tidak dibatasi secara ketat.
Contoh yang lebih bermanfaat adalah kode respons HTTP. Alih-alih memiliki metode yang mengambil angka dan memberikan nama dan / atau deskripsi kesalahan, Anda dapat memiliki satu set enum dengan nama yang bermakna, kode dan deskripsi dll dalam satu paket bersih yang otoritatif dalam nilai apa yang diizinkan dan perlu ditangani.
sumber
status === GEOLOCATION_ACQUIRED
daripadastatus === 3
, sehingga orang yang memelihara perangkat lunak itu memahami apa yang terjadi. Seperti yang Anda katakan, itu juga mencegah nilai yang tidak valid.Enum tidak ada hubungannya dengan OOP, dan JavaScript tidak memiliki enum. Sebaliknya, enum digunakan setiap kali ada pilihan antara satu set nilai tetap. Sebagai contoh, boolean adalah pilihan antara benar dan salah, yang dapat diimplementasikan sebagai
enum Bool { False, True }
. Dalam perpustakaan GUI, kita mungkin memiliki enum untuk keberpihakan:enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }
.Biasanya tidak relevan bagaimana enum diimplementasikan, bagian yang penting adalah bahwa setiap nilai yang mungkin berbeda. Banyak bahasa menggunakan bilangan bulat untuk enum, meskipun beberapa seperti Java mendukung objek sewenang-wenang.
Sampai sekarang, kita bisa menggunakan konstanta, misalnya
const int LEFT = -1, CENTER = 0, RIGHT = 1
. Namun, kompiler tahu bahwa nilai enum adalah milik bersama. Jadi ketika saya beralih nilai enumswitch(value) {case LEFT: ...; case RIGHT: ...;}
, kompiler dapat memperingatkan saya bahwa saya lupaCENTER
kasusnya. Ini bisa menghemat waktu. Dalam bahasa tanpa enum atau tanpa konstruksi kasus sakelar, ini dapat disimulasikan dengan Pola Pengunjung, meskipun itu lebih membantu dengan adanya pengetikan statis.Keuntungan lainnya adalah enum dapat diperlakukan sebagai tipe terpisah. Misalnya saya dapat menyatakan bahwa suatu metode membutuhkan
HAlignment
parameter, daripada bilangan bulat apa pun. Kode kemudian akan gagal dikompilasi jika saya memberikan apa pun kecuali satu dari tiga nilai HAlignment yang mungkin. Namun, enum C tidak dienkapsulasi dengan baik dan konstanta enum dapat digunakan secara bergantian dengan bilangan bulat. Bahasa lain lebih ketat di sini.Dalam JavaScript, kami tidak mendapatkan manfaat ini. Contoh yang diberikan mendeklarasikan objek yang diperlakukan sebagai enum. Ini memang memiliki beberapa keuntungan bagi programmer, misalnya membuat dokumentasi lebih mudah, mengelompokkan semua "konstanta" menjadi satu objek, .... Namun, itu hanya sebuah konvensi bahwa objek seperti itu seperti enum.
Intinya di sini adalah bahwa HTML hanya memiliki serangkaian tag yang terbatas dan dikenal. Anda dapat melihat spesifikasi HTML5 dan memasukkan nama elemen itu sebagai enum ke dalam kode Anda, dan karenanya membuatnya lebih sulit untuk menyelinap
<blink>
tag ke dalam program Anda. Lebih baik untuk menyandikan pengetahuan ini di satu tempat yang membuang kode Anda dengan literal string khusus (atau lebih buruk, angka ajaib).sumber
<blink>
beberapa metode dalam javascript tidak ada yang bisa menghentikan saya, kan? tetapi dalamjava
halo lepas kendali :)foo(TagName.STRONG)
yang sedikit lebih baik. Akan lebih baik jika JS akan mengeluh jika bidangnya tidak ada, tetapi di sini kita hanya mendapatkanundefined
jika saya mencobaTagName.BLINK
. Ini tidak bernilai banyak di JS, tapi ini awal.Bahkan jika bahasa Anda tidak memerlukan kompilasi, Anda mungkin akan menggunakan beberapa jenis IDE atau alat pengembangan, yang dapat memberikan dukungan yang lebih baik untuk sesuatu seperti enum daripada hanya untuk string.
Misalnya, jika Anda menggunakan objek enum like literal dalam javascript, editor Anda akan memberi Anda penyelesaian kode dan pemeriksa kode Anda seperti JSHint atau JSLint akan memperingatkan Anda, jika Anda secara tidak sengaja menggunakan nilai yang salah.
sumber
Maksud dari enum tersebut mungkin untuk memberikan Js Api (goog) satu set / bundel tag yang diizinkan. Yang mana Yang didefinisikan oleh W3C HTML 4.01 ( lihat dokumentasi enum ). Jadi itu batas pengaturan.
Mungkin atau tidak mungkin ini tujuan sebenarnya, namun itu akan berfungsi dengan baik untuk tujuan tersebut.
Jika Anda tahu cara kerja Javascript, kode apa yang dilakukan adalah mendefinisikan array yang diindeks oleh string :-) Nilai mana yang merupakan string, tetapi bisa berupa komponen lain dengan atribut, fungsi, dll ... Biarkan imajinasi Anda berjalan bebas dan Anda akan melihat manfaat di mana-mana.
Selain Javascript, saya menggunakan banyak enum untuk memodelkan dan mengelola mesin negara .
MULAI> IN_PROGRESS> CONFIRMED> FINISHED> ...
Dalam java switch memungkinkan enum sehingga cukup mudah untuk memvalidasi status menjadi mesin negara , untuk mengulang seluruh enum, untuk menentukan prioritas dengan melakukan enum yang rumit, ...
Saya juga menggunakannya untuk mendefinisikan konstanta yang diketik dan tidak termodifikasi:
Juga enum kompleks (yang memungkinkan untuk melakukan transformasi / parser aman)
Karena enum sering menjadi milik lapisan model saya (inti), fitur-fiturnya dapat diakses ke seluruh sistem, sehingga menjadi model fungsional dan saya menjaga kopling rendah.
Apa yang diberikan enum (antara lain) adalah batas dan tipifikasi
sumber