Pikiran pada tipe alias / sinonim?

10

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 typedefdan #definesering 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 * floatatau type 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 = intdan 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?

Rei Miyasaka
sumber
Intellisense atau tidak, System.Diagnostics.DebuggerStepBoundaryAttribute jauh lebih mudah dibaca dalam kode daripada DSBA, terutama bila sering digunakan.
zvrba
@ zvrba: sebenarnya, DebuggerStepBoundaryAttributejauh lebih mudah dibaca daripada DSBA. 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?
Arseni Mourzenko

Jawaban:

3

Dua fitur muncul di benak saya:

Portabilitas. Dalam bahasa seperti C, di mana tipe data seperti intplatform tertentu, alias seperti DWORDmerek 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 mana intadalah misalnya 16bit tidak ditandatangani dan karenanya DWORDharus menjadi alias untuk signed 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 dari floatke doubledan meninggalkan yang lain seperti mereka.

pengguna281377
sumber
Tapi itu tidak menjawab pertanyaan ...
Rei Miyasaka
@ Reei, Anda benar bahwa ammoQ tidak menjawab pertanyaan tetapi benar-benar mengomentarinya. Namun demikian, P.SE tidak mengizinkan komentar yang diformat atau panjang ... Saya pikir dia tidak pantas menerima downvote: komentarnya tentang topik dan yang baik.
Ando
@Andrea sepertinya bukan hasil dari membaca pertanyaan secara keseluruhan; selain dari catatan tentang portabilitas (yang hanya item lain untuk dimasukkan ke dalam daftar sisi atas), itu hanya pernyataan kembali.
Rei Miyasaka
2

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.

jk.
sumber
1
Saya sangat setuju, saya benar-benar ingin melihat polimorfisme "terbatas" semacam ini. Jika type Name = String, maka a Stringtidak dapat diteruskan ke fungsi yang diharapkan Name, tetapi kebalikannya dimungkinkan.
Matthieu M.
1

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.

Ando
sumber