it-swarm-vi.com

Khi nào một tính năng được coi là "công dân hạng nhất" trong ngôn ngữ / nền tảng lập trình?

Tôi đã thấy nhiều lần tuyên bố như- "Xin hãy biến tính năng này thành một công dân hạng nhất bằng ngôn ngữ/nền tảng". Ví dụ, người ta nói về enums trong C # /. Net. Vậy, khi nào một tính năng được coi là "Công dân hạng nhất" trong ngôn ngữ/nền tảng lập trình?

64
Gulshan

Định nghĩa

Một đối tượng là hạng nhất khi nó:

  • có thể được lưu trữ trong các biến và cấu trúc dữ liệu
  • có thể được truyền dưới dạng tham số cho chương trình con
  • có thể được trả về như là kết quả của chương trình con
  • có thể được xây dựng trong thời gian chạy
  • có bản sắc nội tại (độc lập với bất kỳ tên nào)

Thuật ngữ "đối tượng" được sử dụng một cách lỏng lẻo ở đây, không nhất thiết phải nói đến các đối tượng trong lập trình hướng đối tượng. Các kiểu dữ liệu vô hướng đơn giản nhất, chẳng hạn như số nguyên và số dấu phẩy động, gần như luôn luôn là hạng nhất.

http://en.wikipedia.org/wiki/First_group_object

42
Waquo

Khái niệm "công dân hạng nhất" hoặc "yếu tố hạng nhất" trong ngôn ngữ lập trình được giới thiệu bởi nhà khoa học máy tính người Anh Christopher Strachey vào những năm 1960 trong bối cảnh đầu tiên các lớp chức năng. Công thức nổi tiếng nhất của nguyên tắc này có lẽ là trong Cấu trúc và diễn giải các chương trình máy tính của Gerald Jay Sussman và Harry Abelson:

  • Chúng có thể được đặt tên theo các biến.
  • Họ có thể được thông qua như là đối số để làm thủ tục.
  • Họ có thể được trả lại như là kết quả của các thủ tục.
  • Chúng có thể được bao gồm trong cấu trúc dữ liệu.

Về cơ bản, điều đó có nghĩa là bạn có thể làm với phần tử ngôn ngữ lập trình này mọi thứ bạn có thể làm với tất cả các phần tử khác trong ngôn ngữ lập trình.

Đó là tất cả về "quyền bình đẳng": bạn có thể thực hiện tất cả các điều trên, với, giả sử, số nguyên, vậy tại sao mọi thứ khác phải khác?

Định nghĩa ở trên là một chút hạn chế theo nghĩa là nó chỉ thực sự nói về khía cạnh của hạng nhất có liên quan đến việc là đối tượng của chương trình. Một định nghĩa chung hơn sẽ là một thứ là hạng nhất nếu bạn có thể làm mọi thứ với nó, bạn cũng có thể làm với những thứ khác cùng loại.

Ví dụ: các toán tử Java và Java có cùng loại. Bạn có thể định nghĩa các phương thức mới, bạn có thể (phần nào) tự do chọn tên các phương thức của riêng mình , bạn có thể ghi đè các phương thức, bạn có thể quá tải các phương thức. James Gosling cũng có thể thực hiện tất cả các phương thức đó với các toán tử, nhưng bạn và tôi không thể. Tôi nghĩa là trái với niềm tin phổ biến, Java không quá tải toán tử hỗ trợ: ví dụ: + toán tử bị quá tải cho byte, short, int, long, float, doubleString và IIRC trong Java 7 cũng cho BigIntegerBigDecimal (và có lẽ là một cặp vợ chồng tôi đã quên), đó chỉ là bạn không có bất kỳ ảnh hưởng nào đến nó. Điều đó rõ ràng làm cho các nhà khai thác hạng hai theo định nghĩa thứ hai này. Lưu ý rằng các phương thức vẫn không phải là đối tượng hạng nhất theo thứ nhất định nghĩa, mặc dù. (Điều đó làm cho các nhà khai thác hạng ba?)

33
Jörg W Mittag

Thông thường, điều này đề cập đến một cấu trúc có thể vượt qua như một tham số, có thể được định nghĩa là một kiểu trả về từ một hàm hoặc có thể được gán một giá trị. Thông thường bạn cần có khả năng xây dựng chúng trong thời gian chạy. Ví dụ, một thể hiện của một lớp sẽ là một công dân hạng nhất trong c ++ hoặc Java, nhưng một hàm trong C thì không.

6
Pemdas

Tôi muốn nói một tính năng là một công dân hạng nhất nếu nó được thực hiện chỉ bằng ngôn ngữ.
I E. nó không yêu cầu nhiều tính năng ngôn ngữ hoặc thư viện chuẩn để thực hiện tính năng đó.

Thí dụ:

Trong C/C++, tôi không coi các chức năng là một công dân hạng nhất (những người khác có thể).
[.__.] Điều này là do có nhiều cách để thao tác các chức năng được hỗ trợ trực tiếp bởi ngôn ngữ nhưng yêu cầu sử dụng các tính năng ngôn ngữ khác. Các tham số ràng buộc cho một chức năng không được hỗ trợ trực tiếp và bạn phải xây dựng một functor để thực hiện tính năng này.

1
Martin York