Я постараюсь сделать все возможное, чтобы сформулировать этот вопрос так, чтобы это не привело к языковой войне или списку, потому что я думаю, что на этот вопрос может быть хороший технический ответ.
Различные языки поддерживают псевдонимы типов в различной степени. 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 позволит вам вводить DSBA для ссылки Intellisense на System.Diagnostics.DebuggerStepBoundaryAttribute. Могут ли быть другие функции, которые обеспечат другие преимущества псевдонимов типов более безопасно?
источник
DebuggerStepBoundaryAttribute
гораздо более читабельным, чемDSBA
. В первом случае вы знаете, что это значит. Во втором вы понятия не имеете. Теперь представьте, что вы используете в коде двадцать различных псевдонимов. Хватит ли у кого-нибудь смелости попытаться прочитать и понять ваш код?Ответы:
На ум приходят две особенности:
Переносимость. В таких языках , как C, где типы данные , как
int
это от платформы, псевдоним , какDWORD
делает его легче убедиться , что вы действительно используете 32bit подписанного целого везде, когда это является требованием для вашей программы, даже если порт программа на Plattform , гдеint
находится например, 16-битный без знака и, следовательно,DWORD
должен быть псевдонимом дляsigned long
.Абстракция. В вашей программе вы можете использовать много целых чисел и чисел с плавающей точкой для разных целей. Создавая псевдонимы , как
SPEED
,HEIGHT
,TEMPERATURE
, это относительно легко изменить один из тех , кто , например , отfloat
кdouble
и оставить другим , как они есть.источник
Я согласен с Андреа, что вам нужна инкапсуляция, но я не согласен с тем, что это должно быть дорого.
Я думаю, что среда Happy была бы безопасными типами typedefs, возможно, позволяя явное преобразование между реальным типом и typedef, но предотвращая преобразование импликов.
т.е. основная проблема, которую я вижу с typedefs во многих языках, состоит в том, что они фактически не вводят новый тип, а просто псевдоним, хотя это полезно, это не так полезно, как новый тип, который похож на старый тип, но с новым имя. И состав или наследование слишком тяжелы, если вы хотите убедиться, что вы не смешиваете пару переменных.
источник
type Name = String
, то aString
не может быть передано ожидаемой функции aName
, но возможно обратное.Я думаю, что псевдонимы типа дают ленивому программисту (очень) дешевую инкапсуляцию. Поэтому, возможно, альтернативой может быть просто использование правильной (дорогой) инкапсуляции.
Существует также аргумент, что первый также гораздо более оптимизирован для используемой машины / языка, чем последний, хотя.
источник