동적 타입 언어로 열거 형이 필요한 이유는 무엇입니까?


32

나는 여기에 약간의 코드를 읽고 enum이 html 태그의 이름을 저장하는 데 사용되는 것을 보았습니다. 왜 이렇게해야합니까? 이 전략을 사용하면 어떤 이점이 있습니까?

열거 형이 컴파일되거나 정적으로 유형이 지정된 언어로 얼마나 유용한 지 알고 있지만 동적으로 유형이 지정된 언어로 열거 형을 볼 때 위에서 보여준 예제 코드와 같이 궁금합니다. 따라서 질문은 기본적으로 왜 동적으로 유형이 지정된 언어로 열거 형이 필요한지 또는 전혀 필요하지 않은지에 달려 있습니다.


38
이 질문은 기본적으로 "왜 타입이 필요한가" 입니다.
user11153

1
리포지토리를 검색하여 어떻게 호출되는지 보셨습니까? 그렇게하면 당신이받은 답을 더 잘 이해할 수있을 것입니다.
RubberDuck

당신이있는 경우 : enum People { YOU, NPC, FOO, BAR }A (사람)을 원하고 기능을 int, 당신은 무엇이든 대신 번호를 사용하는 연결할 수 있습니다.
Evan Carslake

3
이 특정 "enum"의 목적 또는 일반적으로 어떤 언어로든 enum의 목적에 대해 묻고 있습니까? 나는 전자를 가정하지만 모든 현재 답변은 후자를 생각하는 것 같습니다 ...
meriton-on strike

답변:


56

이점은 실수로 "ADRESS"또는 "FEILDSET"을 입력하면 컴파일러에서 알려주고 런타임에 넌센스가 아닌 방식으로 동작하는 대신 즉시 수정할 수 있다는 것입니다.

이점은 동적 유형보다 정적으로 유형이 지정된 언어에서 훨씬 더 유용하지만 데이터가 아닌 case 문에 문제가 있음을 나타내는 메시지가 표시되므로 런타임 오류 인 경우에도 여전히 유용합니다.


4
@ amon : 가능하지만 enums는 충돌이 없도록 편리한 메커니즘을 제공합니다.
whatsisname

75
대신에 열거를 사용 문자열 상수, 가난한 편집기 글꼴에 사람의 밝은 아이디어에 의해 발생하는 버그를 쫓는 한 달 동안 한 번에 대한 작업에 사용되는 장소 I, 실수라는 필드"PROF1LE_"
고트 로봇

8
@amon Go는 이것을 정확하게 수행합니다. 그러나 열거 형의 한 가지 좋은 점은 컴파일러가 switch 문에 가능한 모든 열거 형 값이 있는지 확인하는 것입니다.
weberc2

15
이 코드는 80 년대에 작성되었습니다. 당신은 이것을 알지 못할 수도 있지만, 일부 개발자들은 하나의 키를 가지고 있지 않은 물리적 타자기 개발을 배웠을 때였습니다 . 실제로 문제의 문자열이 "Profi1e"라는 것을 알고 있지만 25 년이 지났으므로 기억이 완벽하지 않습니다.
로봇 고트

4
@DarrelHoffman : 당신이 놀란 것에 놀랐습니다. Perl에서 나는 종종 내 자신이 타이핑 $1한다는 것을 알게됩니다 $i. (저는 f1le대신 입력 하지 않습니다 file. $1실수는 $1Perl에서 매우 흔한 사실에 의해 시작됩니다. 그러나 여전히 모든 종류의 실수가 일반적입니다. 개발자가 암호를 사용 prof1le하여 잘못 입력 할 수 있습니다. profile암호가 아닌 상황에서.)
ruakh

22

열거 형은 합리적인 값 / 엔티티 세트가있는 상황에 유용합니다. 그것들은 자체 문서화되어 있으며 컴파일러가 런타임에 남는 것을 검증 할 수 있습니다. 의미있는 값 세트가 알려지지 않았거나 엄격하게 제한되지 않은 경우 절대 사용해서는 안됩니다.

보다 유용한 예는 HTTP 응답 코드와 같은 것입니다. 숫자를 취하고 오류의 이름 및 / 또는 설명을 제공하는 방법을 사용하는 대신, 의미있는 이름, 코드 및 설명 등이 포함 된 열거 형 집합을 하나의 깔끔한 패키지로 만들어 어떤 값이 확실한지 알 수 있습니다 허용되고 처리되어야합니다.


1
"자체 문서화"가 가장 중요한 부분입니다. 있다면 차라리 낫겠 status === GEOLOCATION_ACQUIRED이상 status === 3해당 소프트웨어를 유지하는 사람이 무슨 일이 일어나고 있는지 이해하고 그래서. 말했듯이 유효하지 않은 값도 방지합니다.
Nicolas Bouliane

11

열거 형은 OOP와 관련이 없으며 JavaScript에는 열거 형이 없습니다. 대신, 고정 된 값 세트 사이에서 선택이있을 때마다 열거 형이 사용됩니다. 예를 들어, 부울은로 구현 될 수있는 true와 false 사이의 선택 enum Bool { False, True }입니다. GUI 라이브러리에는 다음과 같은 정렬을위한 열거 형이있을 수 있습니다 enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }.

일반적으로 열거 형이 구현되는 방식과 관련이 없으며 중요한 부분은 가능한 각 값이 고유하다는 것입니다. 많은 언어는 열거 형에 정수를 사용하지만 Java와 같은 일부는 임의의 객체를 지원합니다.

지금까지 우리는 상수를 사용할 수있었습니다 const int LEFT = -1, CENTER = 0, RIGHT = 1. 그러나 컴파일러는 열거 형 값이 함께 속해 있음을 알고 있습니다. 따라서 열거 형 값을 전환 switch(value) {case LEFT: ...; case RIGHT: ...;}하면 컴파일러는이 CENTER경우를 잊어 버렸다고 경고 할 수 있습니다 . 시간을 크게 절약 할 수 있습니다. 열거 형이나 스위치 케이스 구문이없는 언어에서는 방문자 패턴을 사용하여이를 시뮬레이션 할 수 있지만 정적 유형이있는 경우 더 유용합니다.

다른 장점은 열거 형을 별도의 유형으로 취급 할 수 있다는 것입니다. 예를 들어 메소드가 HAlignment정수가 아닌 매개 변수를 사용 한다고 선언 할 수 있습니다 . 그러면 세 가지 가능한 HAlignment 값 중 하나만 제공하면 코드가 컴파일되지 않습니다. 그러나 C의 열거 형은 잘 캡슐화되지 않으며 열거 형 상수는 정수와 상호 교환 적으로 사용될 수 있습니다. 다른 언어는 더 엄격합니다.

JavaScript에서는 이러한 이점이 없습니다. 주어진 예제는 열거 형으로 취급되는 객체를 선언합니다. 이것은 프로그래머에게 몇 가지 장점이 있습니다. 예를 들어 문서화가 더 쉬워지고 모든 "상수"를 단일 객체로 그룹화합니다. 그러나 그러한 객체가 열거 형이라는 것은 단지 관습입니다.

여기서 요점은 HTML에는 유한하고 알려진 태그 세트 만 있다는 것입니다. HTML5 사양을보고 해당 요소 이름을 열거 형으로 코드에 넣을 수 있으므로 <blink>태그를 프로그램에 몰래 넣기가 더 어려워집니다 . 이 지식을 한곳에서 인코딩하여 코드를 특수 문자열 리터럴 (또는 더 나쁜 마술 숫자)로 흩 뜨리는 것이 좋습니다.


이 경우 <blink>자바 스크립트의 일부 메소드에 전달 하면 아무것도 나를 막을 수 없습니다. 그러나 java안녕에
빠지게

JS에는 정적 유형 시스템이 없으며 특히 enum 유형의 개념이 없기 때문에 @CodeYogi 예. 그러나 메소드 매개 변수를 "TagName을 사용합니다"라고 문서화하면 프로그래머가 foo(TagName.STRONG)어느 것이 더 나은지 호출 할 수 있습니다. 필드가 존재하지 않으면 JS가 불만을 제기하면 더 좋을 것입니다. 그러나 여기서 undefined시도하면 만 얻습니다 TagName.BLINK. JS에서는 그다지 가치가 없지만 시작입니다.
amon

흠, 위에서 언급 한 코드 링크는 클로저 컴파일러를 사용하므로 의미가 있습니다.
CodeYogi

Clojure는 기능적 언어이므로 OOP가 질문과 어떻게 관련이 있는지 확실하지 않지만 일반적으로 정수 (OO가 아닌) 세트 인 열거 형과 OO 인 'Typesafe enum'패턴을 구별하는 것이 중요합니다. 그리고 Java가 지원하는 것.
JimmyJames

내가하지 클리오에 대해, JS에 대해서 이야기하고 @JimmyJames J의 (자바 플랫폼에서 실행, 또한 어느 정도 OOP 지원) URE. 질문에 oop 태그가 지정 되었으므로 처음에 언급했습니다. 타입 안전 열거 형이 OOP에 어떻게 연결되어 있는지 알지 못합니다. 유형 시스템 기능 일뿐입니다 (많은 비 OOP 언어에는 유형 시스템이 있습니다 :-))
amon

3

언어에 컴파일이 필요하지 않더라도 일종의 IDE 또는 개발 도구를 사용하여 문자열보다 열거 형과 같은 것을 더 잘 지원할 수 있습니다.

예를 들어 자바 스크립트에서 객체 리터럴과 같은 열거 형을 사용하는 경우 실수로 잘못된 값을 사용하면 편집기에서 코드 완성을 제공하고 JSHint 또는 JSLint와 같은 코드 검사기가 경고합니다.


나는 다른 많은 반응 이이 시점에서 놓치거나 이길 것이라고 생각합니다. 동적 언어에서 'emum'을 사용하면 컴파일러에 아무런 영향을 미치지 않지만 특정 IDE, 설명서 도구에 도움이 될 수 있으며 코드를 이해하려는 사람들을 잊지 않아도됩니다.
Robert

2

이러한 열거의 요점은 Js Api (goog)에 허용 된 태그 세트 / 번들을 제공하는 것입니다. 어느 것? W3C HTML 4.01에 의해 정의 된 것입니다 ( enum의 문서를 확인하십시오 ). 설정 경계입니다.

이것이 실제 목표 일 수도 있고 아닐 수도 있지만, 그러한 목적에 적합합니다.

Javascript가 어떻게 작동하는지 알고 있다면 코드로 배열을 정의하는 것입니다 :-). 어떤 값이 문자열이지만 속성, 함수 등을 가진 다른 구성 요소가 될 수 있습니다. 상상력을 자유롭게 발휘하면 어디서나 혜택을 볼 수 있습니다.

Javascript 외에도, 나는 상태 머신 을 모델링하고 관리하기 위해 열거 형을 많이 사용 합니다 .

START> IN_PROGRESS> CONFIRMED> FINISHED> ...

Java 스위치 에서는 열거 형을 허용하므로 상태 머신을 상태를 확인 하고 열거 형 전체를 반복하고 복잡한 열거 형을 수행하여 우선 순위를 정의하는 것이 매우 쉽습니다 ...

또한 그것들을 사용하여 유형이 지정되고 수정 불가능한 상수를 정의합니다.

  • 예 아니오

복잡한 열거 형 (보안 변환 / 파서를 안전하게 할 수 있음)

  • 예 (1, 참), 아니오 (0, 거짓)

열거 형은 종종 내 모델 계층 (코어)에 속하기 때문에 시스템의 모든 기능에 액세스 할 수 있으므로 기능적 모델이되어 낮은 결합을 유지합니다.

열거 형이주는 것은 경계유형화입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.