Мысли о псевдонимах / синонимах типа?

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 позволит вам вводить DSBA для ссылки Intellisense на System.Diagnostics.DebuggerStepBoundaryAttribute. Могут ли быть другие функции, которые обеспечат другие преимущества псевдонимов типов более безопасно?

Рей Миясака
источник
Intellisense или нет, System.Diagnostics.DebuggerStepBoundaryAttribute гораздо менее читабелен в коде, чем DSBA, особенно при частом использовании.
Зврба
@zvrba: на самом деле, DebuggerStepBoundaryAttributeгораздо более читабельным, чем DSBA. В первом случае вы знаете, что это значит. Во втором вы понятия не имеете. Теперь представьте, что вы используете в коде двадцать различных псевдонимов. Хватит ли у кого-нибудь смелости попытаться прочитать и понять ваш код?
Арсений Мурзенко

Ответы:

3

На ум приходят две особенности:

Переносимость. В таких языках , как C, где типы данные , как intэто от платформы, псевдоним , как DWORDделает его легче убедиться , что вы действительно используете 32bit подписанного целого везде, когда это является требованием для вашей программы, даже если порт программа на Plattform , где intнаходится например, 16-битный без знака и, следовательно, DWORDдолжен быть псевдонимом для signed long.

Абстракция. В вашей программе вы можете использовать много целых чисел и чисел с плавающей точкой для разных целей. Создавая псевдонимы , как SPEED, HEIGHT, TEMPERATURE, это относительно легко изменить один из тех , кто , например , от floatк doubleи оставить другим , как они есть.

user281377
источник
Это не отвечает на вопрос, хотя ...
Рей Миясака
@Rei, вы правы, что ammoQ не ответил на вопрос, а прокомментировал его. Тем не менее, P.SE не допускает форматированных или длинных комментариев ... Я думаю, что он не заслуживает понижения: его комментарий относится к теме и является хорошим.
Андо
@ Андреа, кажется, не является результатом прочтения вопроса полностью; кроме примечания о переносимости (который является просто еще одним элементом для добавления в список достоинств), это просто повторение.
Рей Миясака
2

Я согласен с Андреа, что вам нужна инкапсуляция, но я не согласен с тем, что это должно быть дорого.

Я думаю, что среда Happy была бы безопасными типами typedefs, возможно, позволяя явное преобразование между реальным типом и typedef, но предотвращая преобразование импликов.

т.е. основная проблема, которую я вижу с typedefs во многих языках, состоит в том, что они фактически не вводят новый тип, а просто псевдоним, хотя это полезно, это не так полезно, как новый тип, который похож на старый тип, но с новым имя. И состав или наследование слишком тяжелы, если вы хотите убедиться, что вы не смешиваете пару переменных.

JK.
источник
1
Я не мог не согласиться, я действительно хотел бы видеть этот вид "ограниченного" полиморфизма. Если type Name = String, то a Stringне может быть передано ожидаемой функции a Name, но возможно обратное.
Матье М.
1

Я думаю, что псевдонимы типа дают ленивому программисту (очень) дешевую инкапсуляцию. Поэтому, возможно, альтернативой может быть просто использование правильной (дорогой) инкапсуляции.

Существует также аргумент, что первый также гораздо более оптимизирован для используемой машины / языка, чем последний, хотя.

Ando
источник