ทำไมเราต้องใช้ enums ในภาษาที่พิมพ์แบบไดนามิก?


32

ฉันอ่านรหัสที่นี่และเห็นว่ามีการใช้ enum เพื่อจัดเก็บชื่อของแท็ก html ทำไมเราต้องทำเช่นนี้? ฉันจะได้รับประโยชน์อะไรจากการใช้กลยุทธ์นี้

ฉันรู้ว่า enums มีประโยชน์อย่างไรในการรวบรวมหรือพิมพ์ภาษาแบบคงที่ แต่เมื่อฉันเห็น enums ในภาษาที่พิมพ์แบบไดนามิกฉันอยากรู้อยากเห็นเช่นรหัสตัวอย่างที่ฉันแสดงด้านบน ดังนั้นคำถามโดยทั่วไปแล้วทำไมเราถึงต้องการ enums ในภาษาที่พิมพ์แบบไดนามิกหรือเราต้องการมันทั้งหมด?


38
คำถามนี้เป็นพื้น"ทำไมเราต้องประเภท"
user11153

1
คุณค้นหา repo เพื่อดูว่ามันถูกเรียกว่าอย่างไร? นั่นอาจทำให้คุณเข้าใจคำตอบที่คุณได้รับดีขึ้น
RubberDuck

หากคุณมี: enum People { YOU, NPC, FOO, BAR }และฟังก์ชั่นที่ต้องการ (คน) intคุณสามารถเสียบอะไรก็ได้แทนที่จะใช้ตัวเลข
Evan Carslake

3
คุณถามเกี่ยวกับจุดประสงค์ของ "enum" นี้โดยเฉพาะหรือเกี่ยวกับจุดประสงค์ของ enums โดยทั่วไปในภาษาใด ๆ ? ฉันจะสมมติคำตอบเดิม แต่คำตอบทั้งหมดในปัจจุบันดูเหมือนจะคิดอย่างหลัง ...
meriton - เมื่อนัดหยุดงาน

คำตอบ:


56

ข้อดีคือคอมไพเลอร์สามารถแจ้งให้คุณทราบว่าคุณพิมพ์ "ADRESS" หรือ "FEILDSET" โดยไม่ตั้งใจและให้คุณแก้ไขได้ทันทีแทนที่จะทำงานในลักษณะไร้สาระที่รันไทม์

แม้ว่าประโยชน์จะมีประโยชน์มากกว่าในภาษาที่พิมพ์แบบสแตติกมากกว่าไดนามิก แต่ก็ยังมีประโยชน์แม้ว่าจะเป็นข้อผิดพลาดรันไทม์เนื่องจากคุณจะได้รับข้อความที่ระบุปัญหากับคำสั่งเคสของคุณแทนที่จะเป็นข้อมูลของคุณ


4
@ มอน: ทำอย่างนั้นได้ แต่ enums ให้กลไกที่ใช้งานง่ายเพื่อให้แน่ใจว่าคุณไม่ได้ชน
whatsisname

75
สถานที่ที่ฉันเคยทำงานใช้เวลาหนึ่งเดือนไล่ข้อผิดพลาดที่เกิดจากความคิดที่สดใสของใครบางคนที่จะใช้ค่าคงที่สตริงแทน enums แบบอักษรบรรณาธิการที่ไม่ดีและชื่อสนามโดยไม่ตั้งใจ"PROF1LE_"
Gort the Robot

8
@amon Go ทำสิ่งนี้ทุกประการ อย่างไรก็ตามสิ่งหนึ่งที่ดีเกี่ยวกับ enums คือคอมไพเลอร์สามารถตรวจสอบว่าคำสั่ง switch ของคุณมีตัวอักษรสำหรับทุกค่า enum ที่เป็นไปได้
weberc2

15
รหัสนี้เขียนขึ้นในยุค 80 คุณอาจไม่เข้าใจสิ่งนี้ แต่นี่เป็นยุคที่นักพัฒนาบางคนเรียนรู้ที่จะพัฒนาเครื่องพิมพ์ดีดทางกายภาพซึ่งอาจไม่มีรหัสเดียว แม้ว่าที่จริงแล้วฉันรู้ว่าสตริงที่เป็นปัญหาคือ "Profi1e" ... มันเป็นเวลายี่สิบห้าปีแล้วดังนั้นความทรงจำของฉันจึงไม่สมบูรณ์แบบ
Gort the Robot

4
@DarrelHoffman: ฉันประหลาดใจที่คุณประหลาดใจ ใน Perl, ฉันมักพบว่าตัวเองพิมพ์เมื่อผมหมายถึง$1 $i(จริงอยู่ที่ฉันไม่เคยพิมพ์f1leแทนfile- The $1ผิดพลาดเป็น primed จากข้อเท็จจริงที่ว่า$1เป็นเรื่องธรรมดามากใน Perl -. แต่ยังคงความผิดพลาดของทุกประเภทอยู่ร่วมกันอาจจะ dev มีรหัสผ่านที่มีprof1leอยู่ในนั้นจึง priming พวกเขาที่จะพิมพ์ผิดprofileในบริบทที่ไม่ใช่รหัสผ่าน)
ruakh

22

Enums มีประโยชน์สำหรับสถานการณ์ที่คุณมีชุดของค่า / เอนทิตีที่คงที่ พวกเขากำลังจัดทำเอกสารด้วยตนเองและอนุญาตให้คอมไพเลอร์ตรวจสอบสิ่งต่าง ๆ ที่จะถูกทิ้งให้รันไทม์ ไม่ควรใช้หากไม่รู้จักชุดค่าความหมายหรือ จำกัด อย่างเคร่งครัด

ตัวอย่างที่มีประโยชน์มากขึ้นจะเป็นรหัสการตอบกลับ HTTP แทนที่จะมีวิธีการที่ใช้ตัวเลขและให้ชื่อและ / หรือคำอธิบายของข้อผิดพลาดคุณสามารถมีชุดของ enums ที่มีชื่อที่มีความหมายรหัสและคำอธิบาย ฯลฯ ในแพคเกจใหม่ทั้งหมดที่มีสิทธิ์ในค่าที่เป็น ได้รับอนุญาตและจำเป็นต้องได้รับการจัดการ


1
"การจัดทำเอกสารด้วยตนเอง" เป็นส่วนที่สำคัญที่สุด ฉันค่อนข้างจะตรวจสอบstatus === GEOLOCATION_ACQUIREDมากกว่าstatus === 3เพื่อให้คนที่รักษาซอฟต์แวร์นั้นเข้าใจสิ่งที่เกิดขึ้น ดังที่คุณกล่าวว่ามันยังป้องกันค่าที่ไม่ถูกต้อง
Nicolas Bouliane

11

Enums ไม่มีส่วนเกี่ยวข้องกับ OOP และ JavaScript ไม่มี enums จะใช้ enums แทนเมื่อใดก็ตามที่มีตัวเลือกระหว่างชุดของค่าคงที่ enum Bool { False, True }ยกตัวอย่างเช่นบูลเป็นทางเลือกระหว่างความจริงและเท็จซึ่งอาจจะนำมาใช้เป็น ในห้องสมุด GUI ที่เราอาจจะมี enum enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }สำหรับการจัดแนวนี้:

มันมักจะไม่เกี่ยวข้องกับวิธีการใช้ Enum ส่วนที่สำคัญคือแต่ละค่าที่เป็นไปได้นั้นแตกต่างกัน หลายภาษาใช้จำนวนเต็มสำหรับ enums แม้ว่าบางอย่างเช่น Java สนับสนุนวัตถุที่กำหนดเอง

จนถึงตอนนี้เราอาจใช้ค่าคงที่เช่นconst int LEFT = -1, CENTER = 0, RIGHT = 1กัน อย่างไรก็ตามคอมไพเลอร์รู้ว่าค่า enum อยู่ด้วยกัน ดังนั้นเมื่อฉันสลับค่า enum switch(value) {case LEFT: ...; case RIGHT: ...;}คอมไพเลอร์สามารถเตือนฉันว่าฉันได้ลืมCENTERกรณี นี่สามารถประหยัดเวลาได้อย่างมาก ในภาษาที่ไม่มี enums หรือไม่มีโครงสร้างตัวพิมพ์สลับสิ่งนี้สามารถจำลองด้วยรูปแบบของผู้เข้าชมแม้ว่าจะมีประโยชน์มากกว่าเมื่อมีการพิมพ์แบบคงที่

ข้อดีอีกอย่างคือ enums สามารถแยกเป็นประเภทได้ เช่นฉันสามารถประกาศว่าวิธีการใช้HAlignmentพารามิเตอร์มากกว่าจำนวนเต็มใด ๆ รหัสจะล้มเหลวในการรวบรวมถ้าฉันให้อะไรนอกจากค่า HAlignment ที่เป็นไปได้หนึ่งในสาม อย่างไรก็ตาม enums ของ C นั้นไม่ได้ถูกห่อหุ้มอย่างดีและค่าคงที่ enum สามารถใช้แทนกันได้กับจำนวนเต็ม ภาษาอื่นเข้มงวดกว่าที่นี่

ใน JavaScript เราไม่ได้รับสิทธิประโยชน์เหล่านี้ ตัวอย่างที่กำหนดประกาศวัตถุที่ถือว่าเป็น Enum สิ่งนี้มีข้อดีสำหรับโปรแกรมเมอร์เช่นทำให้เอกสารง่ายขึ้นจัดกลุ่ม "ค่าคงที่" ทั้งหมดไว้ในวัตถุเดียว…. อย่างไรก็ตามมันเป็นเพียงแบบแผนที่วัตถุเช่นนี้เป็นเหมือน enum

จุดที่นี่คือ HTML จะมีแท็กที่ จำกัด และเป็นที่รู้จักเท่านั้น คุณสามารถดูข้อมูลจำเพาะ HTML5 และใส่ชื่อองค์ประกอบเหล่านั้นเป็น enum ในรหัสของคุณและทำให้ยากที่จะแอบ<blink>แท็กลงในโปรแกรมของคุณ เป็นการดีที่จะเข้ารหัสความรู้นี้ในที่เดียวที่จะทิ้งขยะโค้ดของคุณด้วยตัวอักษรสตริงพิเศษ (หรือแย่กว่านั้นคือหมายเลขมายากล)


ในกรณีนี้ถ้าฉันส่งผ่าน<blink>ไปยังวิธีการบางอย่างในจาวาสคริปต์ไม่มีอะไรสามารถหยุดฉันใช่ไหม? แต่ในความjavaสวัสดีแบ่งหลวม :)
CodeYogi

@CodeYogi ใช่เพราะ JS ไม่มีระบบสแตติกชนิดและโดยเฉพาะอย่างยิ่งไม่มีแนวคิดของประเภท enum อย่างไรก็ตามฉันสามารถบันทึกพารามิเตอร์วิธีเป็น“ ใช้เวลา TagName” ซึ่งจะทำให้โปรแกรมเมอร์ที่จะเรียกมันว่าเป็นfoo(TagName.STRONG)ที่ดีขึ้นเล็กน้อย มันจะดียิ่งขึ้นหาก JS จะบ่นถ้าข้อมูลไม่ได้อยู่ แต่ที่นี่เราจะได้รับถ้าลองundefined TagName.BLINKมันไม่คุ้มค่ากับ JS มากนัก แต่เป็นการเริ่มต้น
amon

อืมรหัสลิงก์ที่ฉันพูดถึงข้างต้นใช้คอมไพเลอร์แบบปิดดังนั้นจึงเหมาะสม
CodeYogi

Clojure เป็นภาษาที่ใช้งานได้ดังนั้นฉันไม่แน่ใจว่า OOP เกี่ยวข้องกับคำถามได้อย่างไรนอกจากนั้นสิ่งสำคัญคือต้องแยกความแตกต่างระหว่าง enums ซึ่งโดยทั่วไปเป็นเพียงชุดจำนวนเต็ม (ไม่ใช่ OO) และรูปแบบ 'Typesafe enum' ซึ่งเป็น OO และสิ่งที่ Java รองรับ
JimmyJames

@JimmyJames ฉันกำลังพูดถึง JS ไม่ใช่เกี่ยวกับ Clo j ure (ซึ่งทำงานบนแพลตฟอร์ม Java ยังรองรับ OOP ในระดับหนึ่ง) คำถามถูกแท็กด้วยoopซึ่งเป็นสาเหตุที่ฉันพูดถึงในตอนแรก ฉันไม่เห็นวิธีการ enums typesafe เชื่อมต่อกับ OOP ว่าเป็นเพียงคุณลักษณะของระบบประเภท (ไม่ใช่ภาษา OOP จำนวนมากมีระบบการพิมพ์ :-))
อมร

3

แม้ว่าภาษาของคุณไม่ต้องการการคอมไพล์คุณอาจใช้ IDE หรือเครื่องมือพัฒนาบางอย่างซึ่งสามารถให้การสนับสนุนที่ดีกว่าสำหรับ enum มากกว่าการ จำกัด

หากคุณใช้ตัวอักษร enum เช่นตัวอักษรในจาวาสคริปต์ตัวแก้ไขของคุณจะให้รหัสเสร็จสมบูรณ์และตัวตรวจสอบรหัสของคุณเช่น JSHint หรือ JSLint จะเตือนคุณหากคุณใช้ค่าผิด


ฉันคิดว่าคำตอบอื่น ๆ มากมายไม่ว่าจะพลาดหรือเอาชนะในจุดนี้ การใช้ 'emum' ในภาษาแบบไดนามิกอาจไม่ได้ทำอะไรให้กับคอมไพเลอร์ แต่มันสามารถช่วย IDEs บางอย่างเครื่องมือเอกสารประกอบและอย่าลืมคนที่พยายามเข้าใจรหัสด้วย
Robert

2

จุดของ enum ดังกล่าวอาจจะให้ Js Api (goog) ชุด / ชุดของแท็กที่อนุญาต อันไหน? สิ่งที่กำหนดโดย W3C HTML 4.01 ( ตรวจสอบเอกสารของ enum ) ดังนั้นการตั้งค่าขอบเขต

อาจหรือไม่อาจเป็นเป้าหมายที่แท้จริงได้ แต่มันจะทำงานได้ดีสำหรับวัตถุประสงค์ดังกล่าว

หากคุณรู้ว่า Javascript ทำงานอย่างไรรหัสที่ใช้ทำคือการกำหนดอาเรย์ที่จัดทำดัชนีโดยสตริง :-) ค่าใดเป็นสตริง แต่อาจเป็นองค์ประกอบอื่นที่มีคุณลักษณะฟังก์ชั่น ฯลฯ ให้จินตนาการของคุณทำงานฟรีและคุณจะเห็นประโยชน์ทุกที่

จาวาสคริกันฉันใช้ enums มากสำหรับการสร้างแบบจำลองและการจัดการสภาพเครื่องจักร

เริ่มต้น> IN_PROGRESS> ยืนยัน> เสร็จสิ้น> ...

ในจาวาสวิตช์ช่วยให้ enums ดังนั้นจึงค่อนข้างง่ายในการตรวจสอบสถานะในเครื่องรัฐเพื่อวนทั่ว enum เพื่อกำหนดลำดับความสำคัญโดยการทำ enums ที่ซับซ้อน ...

ฉันยังใช้พวกมันเพื่อกำหนดค่าคงที่ที่พิมพ์และไม่แปรผัน:

  • ใช่ไม่ใช่

นอกจากนี้ยังซับซ้อน enums (ซึ่งช่วยให้การแปลงปลอดภัย / parsers ปลอดภัย)

  • ใช่ (1, จริง), ไม่ (0, เท็จ)

เนื่องจาก enums มักจะเป็นของเลเยอร์โมเดลของฉัน (คอร์) คุณสมบัติของมันจึงสามารถเข้าถึงได้ทั่วทุกระบบดังนั้นมันจึงกลายเป็นโมเดลที่ใช้งานได้และฉันก็มีข้อต่อที่ต่ำ

สิ่งที่ enums ให้ (เหนือสิ่งอื่นใด) คือขอบเขตและรูปแบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.