Postaram się jak najlepiej sformułować to pytanie w sposób, który nie spowoduje wojny językowej ani listy, ponieważ uważam, że na to pytanie można znaleźć dobrą, techniczną odpowiedź.
Różne języki obsługują aliasy typów w różnym stopniu. C # pozwala na deklarowanie aliasów typów na początku każdego pliku kodu i są one poprawne tylko w tym pliku. Języki takie jak ML / Haskell używają aliasów typów prawdopodobnie tak samo, jak używają definicji typów. C / C ++ są rodzajem Dzikiego Zachodu, typedef
a #define
często są używane pozornie zamiennie do typów aliasów.
Zalety aliasingu typu nie wywołują zbyt dużego sporu:
- Ułatwia to definiowanie typów kompozytów, które są naturalnie opisane przez język, np .
type Coordinate = float * float
Lubtype String = [Char]
. - Długie nazwy mogą być skracane:
using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute
. - W językach takich jak ML lub Haskell, w których parametry funkcji często nie mają nazw, aliasy typów stanowią pozór samokontroli.
Minusem jest nieco bardziej niepewna: aliasy mogą się rozprzestrzeniać, co utrudnia czytanie i rozumienie kodu lub naukę platformy. Win32 API jest dobrym przykładem, z jego DWORD = int
i jego HINSTANCE = HANDLE = void*
i jego LPHANDLE = HANDLE FAR*
i tak dalej. We wszystkich tych przypadkach nie ma sensu rozróżniać UCHWYTU od wskaźnika pustki lub DWORD i liczby całkowitej itp.
Odkładając na bok filozoficzną debatę na temat tego, czy król powinien dać swym poddanym całkowitą swobodę i pozwolić im ponosić odpowiedzialność za siebie, czy też powinien interweniować wszystkie ich wątpliwe działania, czy może istnieć szczęśliwy środek, który pozwoliłby czerpać korzyści z aliasu typu podczas gdy zmniejszając ryzyko jego nadużyć?
Na przykład problem długich nazw można rozwiązać za pomocą dobrych funkcji autouzupełniania. Na przykład Visual Studio 2010 pozwoli ci wpisać DSBA w celu skierowania Intellisense do System.Diagnostics.DebuggerStepBoundaryAttribute. Czy mogą istnieć inne funkcje, które zapewniłyby inne zalety bezpieczniejszego aliasingu typów?
DebuggerStepBoundaryAttribute
jest znacznie bardziej czytelny niż DSBA
. W pierwszym przypadku wiesz, co to znaczy. W drugim nie masz pojęcia. Teraz wyobraź sobie, że używasz dwudziestu różnych aliasów w kodzie. Czy ktoś miałby dość odwagi, by spróbować odczytać i zrozumieć Twój kod?