タイプのエイリアス/シノニムについての考え?


10

言語の戦争やリストにならないような方法でこの質問を構成するために最善を尽くします。この質問に対する優れた技術的な答えがあると思います。

さまざまな言語がさまざまな程度で型エイリアスをサポートしています。C#では、各コードファイルの先頭で型のエイリアスを宣言でき、それらはそのファイル全体でのみ有効です。ML / Haskellのような言語は、型定義を使用するのと同じくらい、型エイリアスを使用します。C / C ++はと、ソートワイルドウェストのあるtypedef#define別名型に一見互換的に使用されていることが多いです。

タイプエイリアスの利点は、あまり論争を引き起こしません。

  • これは、言語によって自然に記述されている複合型、例えばを定義することが便利になりますtype Coordinate = float * floattype 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ます。最初のケースでは、それが何を意味するか知っています。2つ目はわかりません。次に、このようなコードで20種類のエイリアスを使用するとします。誰かがあなたのコードを読んで理解しようとするのに十分な勇気がありますか?
Arseni Mourzenko

回答:


3

2つの機能が思い浮かびます。

移植性。データ型が好きなC、のような言語でのintプラットフォームの特定、などの別名ですDWORDこれはあなたのプログラムのための要件である、それが簡単にあなたが本当にどこにでも符号付き整数32ビットを使用していることを確認することができますが、plattformにも、あなたのポートのプログラムintですたとえば、16ビットは符号なしなのでDWORD、のエイリアスでなければなりませんsigned long

抽象化。プログラムでは、さまざまな目的で多数の整数および浮動小数点数を使用する場合があります。、、のようなエイリアスを作成することSPEEDHEIGHTTEMPERATUREたとえばからfloatに変更したりdouble、その他をそのままにしたりするのは比較的簡単です。


それでも質問の答えにはなりません...
宮坂玲

@Rei、あなたは、ammoQが質問に答えなかったが、本当にそれにコメントしたとあなたは正しいです。それにもかかわらず、P.SEはフォーマットされたコメントや長いコメントを許可しません...私は彼が反対票を投じる価値がないと思います:彼のコメントはトピックであり、良いものです。
安藤

@Andreaそれは質問全体を読んだ結果ではないようです。移植性に関する注記(上向きのリストに入れるもう1つの項目です)は別として、それは単なる言い直しです。
宮坂零

2

私はあなたがカプセル化を必要とするアンドレアに同意します、しかし私はこれが高価である必要があることに同意しません。

幸せな媒体は型安全なtypedefであり、おそらく実際の型とtypedefの間の明示的な変換を許可するが、暗黙の変換は防止すると思います。

つまり、多くの言語のtypedefで私が目にする主な問題は、実際には新しいタイプではなくエイリアスを導入することですが、これは便利ですが、古いタイプのような新しいタイプほど便利ではありませんが、新しいタイプがあります。名前。また、いくつかの変数を混在させないようにしたいだけの場合、構成または継承は重すぎます。


1
私はこれ以上同意することができませんでした、私は本当にこのような「限定された」多型を見たいと思っています。の場合type Name = String、a Stringを期待する関数に渡すことはできませんNameが、その逆も可能です。
Matthieu M.

1

型エイリアスは、怠惰なプログラマーに(非常に)安価なカプセル化を提供すると思います。したがって、おそらく代替策は、適切な(高価な)カプセル化を使用することだけかもしれません。

ただし、前者は後者よりも使用中のマシン/言語に対してはるかに最適化されているという主張もあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.