Suy nghĩ về bí danh / từ đồng nghĩa?


10

Tôi sẽ cố gắng hết sức để đóng khung câu hỏi này theo cách không dẫn đến một cuộc chiến ngôn ngữ hoặc danh sách, bởi vì tôi nghĩ có thể có một câu trả lời hay, kỹ thuật cho câu hỏi này.

Các ngôn ngữ khác nhau hỗ trợ bí danh loại ở mức độ khác nhau. C # cho phép khai báo các bí danh ở đầu mỗi tệp mã và chúng chỉ hợp lệ trong toàn bộ tệp đó. Các ngôn ngữ như ML / Haskell sử dụng bí danh loại có thể nhiều như họ sử dụng định nghĩa loại. C / C ++ là một loại của miền Tây hoang dã, typedef#definethường được sử dụng dường như có thể hoán đổi cho các loại bí danh.

Mặt trái của kiểu răng cưa không gây ra tranh chấp quá nhiều:

  • Nó giúp thuận tiện để xác định các loại hỗn hợp được mô tả tự nhiên bằng ngôn ngữ, ví dụ type Coordinate = float * floathoặc type String = [Char].
  • Tên dài có thể được rút ngắn : using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute.
  • Trong các ngôn ngữ như ML hoặc Haskell, trong đó các tham số chức năng thường không có tên, các bí danh loại cung cấp một ngữ nghĩa của tài liệu tự.

Nhược điểm là iffy hơn một chút: bí danh có thể sinh sôi nảy nở, gây khó khăn cho việc đọc và hiểu mã hoặc tìm hiểu một nền tảng. API Win32 là một ví dụ tốt, với nó DWORD = intvà của nó HINSTANCE = HANDLE = void*và của nó LPHANDLE = HANDLE FAR*và như vậy. Trong tất cả các trường hợp này, hầu như không có ý nghĩa gì để phân biệt giữa một TAY và một con trỏ trống hoặc DWORD và một số nguyên, v.v.

Tạm gác lại cuộc tranh luận triết học về việc một vị vua có nên trao tự do hoàn toàn cho các đối tượng của họ và để họ tự chịu trách nhiệm hay liệu họ có nên can thiệp tất cả các hành động đáng ngờ của mình hay không, có thể có một phương tiện hạnh phúc cho phép lợi ích của loại răng cưa trong khi giảm thiểu nguy cơ lạm dụng của nó?

Ví dụ, vấn đề về tên dài có thể được giải quyết bằng các tính năng tự động hoàn thành tốt. Chẳng hạn, Visual Studio 2010 sẽ cho phép bạn nhập DSBA để giới thiệu Intellisense cho System.Diagnostics.DebuggerStepBoundaryAttribution. Có thể có các tính năng khác sẽ cung cấp các lợi ích khác của việc khử răng cưa an toàn hơn không?


Intellisense hay không, System.Diagnostics.DebuggerStepBoundaryAttribution có thể đọc mã ít hơn nhiều so với DSBA, đặc biệt là khi được sử dụng thường xuyên.
zvrba

@zvrba: trên thực tế, DebuggerStepBoundaryAttributelà nhiều hơn dễ đọc hơn DSBA. Trong trường hợp đầu tiên, bạn biết nó có nghĩa gì. Trong cái thứ hai, bạn không có ý tưởng. Bây giờ hãy tưởng tượng bạn sử dụng hai mươi bí danh khác nhau như thế này trong mã. Bất cứ ai cũng có đủ can đảm để cố gắng đọc và hiểu mã của bạn?
Arseni Mourzenko

Câu trả lời:


3

Hai tính năng xuất hiện trong tâm trí của tôi:

Tính di động. Trong các ngôn ngữ như C, nơi kiểu dữ liệu thích intlà nền tảng cụ thể, một bí danh như DWORDlàm cho nó dễ dàng hơn để đảm bảo bạn đang thực sự sử dụng một 32bit ký số nguyên ở khắp mọi nơi, khi điều này là yêu cầu cho chương trình của bạn, ngay cả khi bạn cảng chương trình để một plattform nơi intlà ví dụ 16 bit không dấu và do đó DWORDphải là bí danh cho signed long.

Trừu tượng. Trong chương trình của bạn, bạn có thể sử dụng rất nhiều số nguyên và số dấu phẩy động cho các mục đích khác nhau. Bằng cách tạo bí danh như SPEED, HEIGHT, TEMPERATURE, đó là tương đối dễ dàng để thay đổi một trong những ví dụ từ floatđến doublevà rời khỏi những người khác như họ đang có.


Điều đó không trả lời câu hỏi mặc dù ...
Rei Miyasaka

@Rei, bạn đúng là ammoQ không trả lời câu hỏi nhưng thực sự nhận xét về nó. Tuy nhiên, P.SE không cho phép các bình luận được định dạng hoặc dài ... Tôi nghĩ rằng anh ấy không xứng đáng nhận được một ý kiến ​​trái chiều: bình luận của anh ấy là về chủ đề và một bình luận tốt.
Ando

@Andrea dường như không phải là kết quả của việc đọc toàn bộ câu hỏi; ngoài lưu ý về tính di động (vốn chỉ là một mục khác để đưa vào danh sách tăng giá), nó chỉ là một sự phục hồi.
Rei Miyasaka

2

Tôi đồng ý với Andrea bạn cần đóng gói, tuy nhiên tôi không đồng ý rằng việc này cần phải tốn kém.

Tôi nghĩ rằng phương tiện Happy sẽ là loại typedefs an toàn, có thể cho phép chuyển đổi rõ ràng giữa loại thực và typedef, nhưng ngăn chặn chuyển đổi giả định.

tức là vấn đề chính tôi thấy với typedefs trong rất nhiều ngôn ngữ là chúng không thực sự giới thiệu một loại mới mà chỉ là một bí danh, trong khi điều này hữu ích, nó không hữu ích như một loại mới giống như loại cũ mà là một loại mới Tên. Và thành phần hoặc thừa kế quá nặng nếu bạn chỉ muốn đảm bảo bạn không trộn lẫn một vài biến.


1
Tôi không thể đồng ý nhiều hơn, tôi thực sự muốn thấy loại đa hình "giới hạn" này. Nếu type Name = String, sau đó a Stringkhông thể được chuyển đến một chức năng mong đợi a Name, nhưng điều ngược lại là có thể.
Matthieu M.

1

Tôi nghĩ các bí danh loại cung cấp cho các lập trình viên lười biếng (rất) đóng gói giá rẻ. Vì vậy, có lẽ sự thay thế có thể chỉ là sử dụng đóng gói thích hợp (đắt tiền).

Ngoài ra còn có lập luận rằng cái trước cũng được tối ưu hóa nhiều hơn cho máy / ngôn ngữ đang sử dụng so với cái sau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.