Saya akan mencoba yang terbaik untuk membingkai pertanyaan ini dengan cara yang tidak menghasilkan perang bahasa atau daftar, karena saya pikir mungkin ada jawaban yang baik dan teknis untuk pertanyaan ini.
Bahasa yang berbeda mendukung tipe alias hingga derajat yang berbeda-beda. C # memungkinkan tipe alias untuk dideklarasikan pada awal setiap file kode, dan mereka hanya berlaku di seluruh file itu. Bahasa seperti ML / Haskell menggunakan alias tipe mungkin sebanyak mereka menggunakan definisi tipe. C / C ++ adalah semacam Wild West, dengan typedef
dan #define
sering digunakan secara bergantian untuk tipe alias.
Sisi buruk dari aliasing tipe tidak terlalu banyak menimbulkan perselisihan:
- Itu membuatnya mudah untuk mendefinisikan tipe komposit yang dijelaskan secara alami oleh bahasa, misalnya
type Coordinate = float * float
atautype String = [Char]
. - Nama yang panjang dapat dipersingkat:
using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute
. - Dalam bahasa seperti ML atau Haskell, di mana parameter fungsi sering tidak memiliki nama, ketik alias menyediakan kemiripan dokumentasi mandiri.
Kelemahannya sedikit lebih rapuh: alias bisa berkembang biak, membuatnya sulit untuk membaca dan memahami kode atau mempelajari platform. API Win32 adalah contoh yang baik, dengan DWORD = int
dan HINSTANCE = HANDLE = void*
dan itu LPHANDLE = HANDLE FAR*
dan itu. Dalam semua kasus ini, hampir tidak masuk akal untuk membedakan antara HANDLE dan void pointer atau DWORD dan integer dll.
Mengesampingkan perdebatan filosofis tentang apakah seorang raja harus memberikan kebebasan penuh kepada rakyatnya dan membiarkan mereka bertanggung jawab atas diri mereka sendiri atau apakah mereka harus memiliki semua tindakan dipertanyakan mereka diintervensi, mungkinkah ada media bahagia yang akan memungkinkan manfaat dari mengetik alias sementara mengurangi risiko penyalahgunaannya?
Sebagai contoh, masalah nama panjang dapat diselesaikan dengan fitur autocomplete yang baik. Visual Studio 2010 misalnya akan memungkinkan Anda untuk mengetik DSBA untuk merujuk Intellisense ke System.Diagnostics.DebuggerStepBoundaryAttribute. Mungkinkah ada fitur lain yang akan memberikan manfaat lain dari mengetik alias lebih aman?
sumber
DebuggerStepBoundaryAttribute
jauh lebih mudah dibaca daripadaDSBA
. Dalam kasus pertama, Anda tahu apa artinya. Yang kedua, Anda tidak tahu. Sekarang bayangkan Anda menggunakan dua puluh alias berbeda seperti ini dalam kode. Adakah yang punya cukup keberanian untuk mencoba membaca dan memahami kode Anda?Jawaban:
Dua fitur muncul di benak saya:
Portabilitas. Dalam bahasa seperti C, di mana tipe data seperti
int
platform tertentu, alias sepertiDWORD
merek lebih mudah untuk memastikan Anda benar-benar menggunakan 32bit integer ditandatangani mana-mana, saat ini kebutuhan untuk program Anda, bahkan ketika Anda port program untuk plattform manaint
adalah misalnya 16bit tidak ditandatangani dan karenanyaDWORD
harus menjadi alias untuksigned long
.Abstraksi. Dalam program Anda, Anda mungkin menggunakan banyak angka integer dan floating point untuk tujuan yang berbeda. Dengan membuat alias seperti
SPEED
,HEIGHT
,TEMPERATURE
, itu relatif mudah untuk mengubah salah satu dari mereka misalnya darifloat
kedouble
dan meninggalkan yang lain seperti mereka.sumber
Saya setuju dengan Andrea Anda perlu enkapsulasi, namun saya tidak setuju bahwa ini harus mahal.
Saya pikir media Happy akan mengetik typedef aman, mungkin memungkinkan konversi eksplisit antara tipe nyata dan typedef, tetapi mencegah konversi implisit.
yaitu masalah utama yang saya lihat dengan typedefs dalam banyak bahasa adalah mereka tidak benar-benar memperkenalkan tipe baru tetapi hanya sebuah alias, sementara ini berguna, tidak berguna seperti tipe baru yang seperti tipe lama tetapi dengan yang baru nama. Dan komposisi atau warisan terlalu berat jika Anda hanya ingin memastikan Anda tidak mencampur beberapa variabel.
sumber
type Name = String
, maka aString
tidak dapat diteruskan ke fungsi yang diharapkanName
, tetapi kebalikannya dimungkinkan.Saya pikir tipe alias memberikan programmer malas (sangat) enkapsulasi murah. Jadi mungkin alternatifnya bisa menggunakan enkapsulasi (mahal) yang tepat.
Ada juga argumen bahwa yang pertama juga jauh lebih dioptimalkan untuk mesin / bahasa yang digunakan daripada yang terakhir.
sumber