타입 별칭 / 동의어에 대한 생각?


10

나는이 질문에 대한 좋은 기술적 답변이있을 수 있다고 생각하기 때문에 언어 전쟁이나 목록을 만들지 않는 방식으로이 질문을 구성하기 위해 최선을 다할 것입니다.

다른 언어는 다양한 정도의 유형 별칭을 지원합니다. C #을 사용하면 각 코드 파일의 시작 부분에 형식 별칭을 선언 할 수 있으며 해당 파일 전체에서만 유효합니다. ML / Haskell과 같은 언어는 형식 정의를 사용하는 것만 큼 형식 별칭을 사용합니다. C / C ++는 함께 일종의 와일드 웨스트의입니다 typedef#define자주 별칭 유형에 보이는 의미로 사용된다.

앨리어싱 유형의 단점은 너무 많은 논쟁을 불러 일으키지 않습니다.

  • 언어에 의해 자연스럽게 설명되는 복합 유형 (예 : type Coordinate = float * float또는) 을 정의하는 것이 편리합니다 type String = [Char].
  • 긴 이름을 줄일 수 있습니다 : using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute.
  • 함수 매개 변수에 종종 이름이없는 ML 또는 Haskell과 같은 언어에서 유형 별칭은 자체 문서와 유사합니다.

단점은 좀 더 정교합니다. 별칭이 확산되어 코드를 읽고 이해하거나 플랫폼을 배우기가 어렵습니다. Win32 API는 그것 DWORD = int과 그것 HINSTANCE = HANDLE = void*그리고 그 LPHANDLE = HANDLE FAR*와 같은 좋은 예 입니다. 이 모든 경우에 HANDLE과 void 포인터 또는 DWORD와 정수 등을 구별하는 것은 의미가 없습니다.

왕이 그들의 주제에 완전한 자유를 주어야하고 그들 스스로 책임을 지도록해야하는지 또는 의심스러운 행동이 모두 개입되어야하는지에 대한 철학적 논쟁을 제쳐두고, 타입 앨리어싱의 이점을 허용하는 행복한 매체가있을 수 있을까 학대의 위험을 완화?

예를 들어, 긴 이름 문제는 자동 완성 기능으로 해결할 수 있습니다. 예를 들어 Visual Studio 2010에서는 Intellisense를 System.Diagnostics.DebuggerStepBoundaryAttribute를 참조하기 위해 DSBA를 입력 할 수 있습니다. 유형 앨리어싱의 다른 이점을보다 안전하게 제공하는 다른 기능이있을 수 있습니까?


Intellisense 여부에 관계없이 System.Diagnostics.DebuggerStepBoundaryAttribute는 특히 자주 사용되는 경우 DSBA보다 코드에서 읽기가 훨씬 어렵습니다.
zvrba

@zvrba : 사실, DebuggerStepBoundaryAttribute많이 이상 읽을 DSBA. 첫 번째 경우, 그것이 무엇을 의미하는지 알고 있습니다. 두 번째는 전혀 모른다. 이제 코드에서 이와 같은 20 개의 별명을 사용한다고 가정하십시오. 누구나 코드를 읽고 이해하려고 충분한 용기가 있습니까?
Arseni Mourzenko 2016 년

답변:


3

두 가지 기능이 떠 오릅니다.

이식성. 데이터 유형이 좋아하는 C와 같은 언어에서 int플랫폼 특정 같은 별명이다 DWORD이 프로그램에 대한 요구 사항입니다 쉽게 당신이 정말로 모든 곳에서 정수 서명 한 32 비트를 사용하고 있는지 확인 할 수는하는 플랫폼 이서 심지어 당신 포트 프로그램 int입니다 예를 들어 16 비트 부호가 없으므로에 DWORD대한 별칭이어야합니다 signed long.

추출. 프로그램에서 다른 목적으로 많은 정수 및 부동 소수점 숫자를 사용할 수 있습니다. 같은 별칭을 만들면 SPEED, HEIGHT, TEMPERATURE, 그것에서 그 예 중 하나를 변경할 상대적으로 쉽게 float로를 double그리고있는 그대로 다른 사람을 둡니다.


그래도 질문에 대답하지 않습니다 ...
Rei Miyasaka

@Rei, 당신은 ammoQ가 질문에 대답하지 않고 실제로 그것에 대해 의견을 말한 것이 맞습니다. 그럼에도 불구하고 P.SE는 형식이 있거나 긴 의견을 허용하지 않습니다 ... 나는 그가 공감할 자격이 없다고 생각합니다. 그의 의견은 주제와 좋은 의견입니다.
Ando

@Andrea 그것은 질문을 전체적으로 읽은 결과가 아닌 것 같습니다. 이식성에 대한 참고 사항 (거꾸로 된 목록에 넣을 또 다른 항목 임)을 제외하고는 다시 언급 한 것입니다.
Rei Miyasaka

2

Andrea가 캡슐화가 필요하다는 데 동의하지만 비용이 많이 든다는 데 동의하지 않습니다.

나는 행복한 매체가 타입 안전 타입 정의라고 생각합니다. 실제 타입과 타입 정의 사이에서 명시 적으로 변환 할 수는 있지만 암시 적 변환은 방지합니다.

즉, 많은 언어에서 typedefs로 볼 수있는 주요 문제는 실제로 새로운 유형을 도입하지 않고 단순히 별칭을 사용한다는 것입니다. 이름. 두 변수를 섞지 않도록하려면 구성이나 상속이 너무 무겁습니다.


1
나는 더 이상 동의 할 수 없었습니다. 저는 이런 종류의 "제한된"다형성을보고 싶습니다. 경우 type Name = String, 다음이 String함수에 전달 될 수없는 것으로 예상 Name하지만, 역이 가능합니다.
Matthieu M.

1

타입 별칭은 게으른 프로그래머 (매우) 저렴한 캡슐화를 제공한다고 생각합니다. 따라서 대안은 적절한 (고가의) 캡슐화를 사용하는 것일 수 있습니다.

그러나 전자는 후자보다 사용중인 기계 / 언어에 훨씬 더 최적화되어 있다는 주장도 있습니다.

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