Mengapa kita perlu enum dalam bahasa yang diketik secara dinamis?


32

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?


38
Pertanyaan ini pada dasarnya adalah "Mengapa kita perlu tipe" .
user11153

1
Apakah Anda mencari repo untuk mengetahui bagaimana namanya? Itu mungkin akan memberi Anda pemahaman yang lebih baik tentang jawaban yang Anda terima.
RubberDuck

jika Anda memiliki: enum People { YOU, NPC, FOO, BAR }dan fungsi yang menginginkan (Orang) int, Anda dapat menyambungkan apa saja, alih-alih menggunakan angka.
Evan Carslake

3
Apakah Anda bertanya tentang tujuan "enum" khusus ini atau tentang tujuan enum secara umum, dalam bahasa apa pun? Saya berasumsi yang pertama, tetapi semua jawaban saat ini tampaknya berpikir yang terakhir ...
meriton - pada mogok

Jawaban:


56

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.


4
@amon: Anda bisa, tetapi enum memberi Anda mekanisme yang berguna untuk memastikan Anda tidak memiliki tabrakan.
whatsisname

75
Tempat saya dulu bekerja selama sebulan menghabiskan mengejar bug yang disebabkan oleh ide cemerlang seseorang untuk menggunakan konstanta string daripada enum, font editor yang buruk, dan bidang yang tidak sengaja bernama"PROF1LE_"
Gort the Robot

8
@amon Go melakukan hal ini. Satu hal yang menyenangkan tentang enum, bagaimanapun, adalah bahwa kompiler dapat memeriksa bahwa pernyataan switch Anda memiliki case untuk setiap nilai enum yang mungkin.
weberc2

15
Kode ini ditulis pada tahun 80-an. Anda mungkin tidak menyadarinya, tetapi ini berada di era ketika beberapa pengembang belajar untuk mengembangkan mesin tik fisik, yang mungkin tidak memiliki satu kunci . Meskipun sebenarnya saya menyadari bahwa string yang dimaksud adalah "Profi1e" ... sudah dua puluh lima tahun, jadi ingatan saya jelas tidak sempurna.
Gort the Robot

4
@ DarrelHoffman: Saya terkejut Anda terkejut. Dalam Perl, saya sering menemukan diri saya mengetik $1ketika saya maksudkan $i. (Memang, saya tidak pernah mengetik f1ledaripada file- $1kesalahan dipikirkan oleh fakta yang $1sangat umum di Perl - tapi tetap saja, kesalahan semua jenis adalah umum. Mungkin dev memiliki kata sandi prof1ledi dalamnya, sehingga mendorong mereka untuk salah ketik profiledalam konteks non-kata sandi.)
ruakh

22

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.


1
"Mendokumentasikan sendiri" adalah bagian terpenting. Saya lebih suka memeriksa jika status === GEOLOCATION_ACQUIREDdaripada status === 3, sehingga orang yang memelihara perangkat lunak itu memahami apa yang terjadi. Seperti yang Anda katakan, itu juga mencegah nilai yang tidak valid.
Nicolas Bouliane

11

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 enum switch(value) {case LEFT: ...; case RIGHT: ...;}, kompiler dapat memperingatkan saya bahwa saya lupa CENTERkasusnya. 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 membutuhkanHAlignment 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).


Dalam hal ini jika saya melewati <blink>beberapa metode dalam javascript tidak ada yang bisa menghentikan saya, kan? tetapi dalam javahalo lepas kendali :)
CodeYogi

@ CodeYogi ya, karena JS tidak memiliki sistem tipe statis, dan khususnya tidak memiliki konsep tipe enum. Namun, saya dapat mendokumentasikan parameter metode sebagai “take a TagName”, yang akan membuat programmer memanggilnya foo(TagName.STRONG)yang sedikit lebih baik. Akan lebih baik jika JS akan mengeluh jika bidangnya tidak ada, tetapi di sini kita hanya mendapatkan undefinedjika saya mencoba TagName.BLINK. Ini tidak bernilai banyak di JS, tapi ini awal.
Amon

Hmm, tautan kode yang saya sebutkan di atas menggunakan closure compiler maka masuk akal di sana.
CodeYogi

Clojure adalah bahasa fungsional jadi saya tidak yakin bagaimana OOP relevan dengan pertanyaan, tetapi di samping itu, penting untuk membedakan antara enum yang umumnya hanya seperangkat bilangan bulat (bukan OO) dan pola 'Typesafe enum' yang merupakan OO dan apa yang didukung Java.
JimmyJames

@ JimmyJames Saya berbicara tentang JS, bukan tentang Clo j ure (yang berjalan di platform Java, juga mendukung OOP sampai tingkat tertentu). Pertanyaan itu ditandai dengan oop , itulah sebabnya saya menyebutkannya di awal. Saya tidak benar-benar melihat bagaimana enums typesafe terhubung ke OOP, itu hanya fitur sistem tipe (banyak bahasa non-OOP memiliki sistem tipe :-))
amon

3

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.


Saya pikir banyak tanggapan lain baik ketinggalan atau bertele-tele tentang titik ini. Menggunakan 'emum' dalam bahasa dinamis mungkin tidak melakukan apa-apa untuk kompiler, tetapi itu benar-benar dapat membantu IDE, alat dokumentasi, dan juga jangan lupa manusia yang berusaha memahami kode.
Robert

2

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:

  • Ya Tidak

Juga enum kompleks (yang memungkinkan untuk melakukan transformasi / parser aman)

  • Ya (1, benar), Tidak (0, salah)

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.