Nguồn gốc của cấu trúc và các lớp


8

Các lập trình viên đã phải giải quyết vấn đề thiết kế và triển khai nào khi họ quyết định sử dụng các cấu trúc và các lớp trước tiên?

Khi nào thì điều này xảy ra và ai là người tiên phong đằng sau những ý tưởng này?

Lưu ý, đây là câu hỏi kép, bởi vì cấu trúc và các lớp có liên quan. Tôi nhận ra rằng các cấu trúc khá cũ hơn các lớp học. Sẽ thật tuyệt nếu câu trả lời sẽ nói riêng về cả hai và trích dẫn một số nguồn.


Chúng không liên quan như thường nghĩ, và vấn đề bị làm mờ bởi thực tế là C ++ đã thực hiện các lớp bằng cách đặt đường cú pháp trên các cấu trúc có chứa con trỏ hàm. Để làm lầy thêm vùng nước, C ++ đã mở rộng các cấu trúc để bao gồm các định nghĩa phương thức thực tế và sau đó làm cho structtừ khóa tùy chọn khi cấu trúc được sử dụng.
Gort Robot

1
Cuộc thi lịch sử không diễn ra trong hai ngày nữa. :)
chrisaycock

Cảm ơn mọi người đã trả lời. Các câu trả lời đề cập đến nguyên tắc sư phạm của IBM 1620, COBOL, Simula 67 và Giorgio tạo ra tất cả cốt lõi của những gì tôi chấp nhận là câu trả lời.
xralf

Câu trả lời:


5

Ý tưởng của cấu trúc là nhóm một tập hợp các biến vào một thùng chứa. Ví dụ: nếu bạn có ba tọa độ

int x;
int y;
int z;

bạn có thể muốn xem chúng như một đơn vị dữ liệu và nhóm chúng lại với nhau:

struct point
{
    int x;
    int y;
    int z;
};

Bạn có thể xem đây là một cách để mô đun hóa dữ liệu của bạn. Bây giờ bạn có thể xác định các biến chứa cả ba giá trị trong một đơn vị:

struct point p1, p2;

Trong lập trình thủ tục, bạn có các thủ tục hoặc hàm thao tác dữ liệu và đặc biệt là các cấu trúc, vd

void shiftX(struct point *p, int offset);

Bạn có thể gọi hàm trên một cấu trúc bằng cách chuyển nó dưới dạng đối số:

shiftX(&p1, -10);

Bước từ cấu trúc đến các lớp là để nói rằng các thủ tục / hàm nên được nhóm cùng với dữ liệu thành các đơn vị: như cấu trúc phân loại các thực thể có cùng cấu trúc, các lớp phân loại các thực thể có cùng cấu trúc và hoạt động.

Vì vậy, bây giờ bạn có thể viết:

class Point
{
  public:
    void shiftX(int offset);

    int x;
    int y;
    int z;
 };

và sau đó:

 Point p;

 ...

 p.shiftX(-10);

Theo cách này, việc nhóm các hoạt động trên cùng một loại dữ liệu trở nên dễ dàng hơn. Ví dụ: bạn có thể nhóm tất cả các hoạt động tác động lên các điểm trong định nghĩa lớp, thay vì chúng phân tán trên mã của bạn dưới dạng các hàm có một hoặc nhiều tham số của điểm loại.

Ngoài ra, bạn có thể tinh chỉnh cả cấu trúc và hành vi bằng cách sử dụng tính kế thừa.

Tóm tắt: structs là một khái niệm cho phép tổ chức / mô đun hóa dữ liệu. Các lớp học cho phép tổ chức / mô đun hóa cả dữ liệu và hoạt động.


Tôi thích cách tiếp cận sư phạm của câu trả lời này của bạn. Vì vậy, nếu tôi hiểu đúng, tôi có thể tìm hiểu thêm về ý tưởng này khi đọc một cái gì đó về Simula 67WorldEngineer viết và có thể một nơi nào đó sẽ được viết tại sao ý tưởng này trở nên phổ biến giữa các ngôn ngữ lập trình khác.
xralf

Ý tưởng đã trở nên phổ biến vì đó là một cách tổ chức mã tuyệt vời. Các ứng dụng đã dần dần lớn hơn và phức tạp hơn. Một số hệ điều hành có hơn 100 triệu dòng mã. Mặc dù một biện pháp khá kém là sự phức tạp thực tế, nó đòi hỏi những nỗ lực lớn của tổ chức.
Kỹ sư thế giới

1
Cách khác là sử dụng các mô-đun (Modula-2) hoặc các gói (Ada, Java, Scala, v.v.) hoặc đơn vị (một số phương ngữ Pascal). Bằng cách này, bạn có thể nhóm các loại và hoạt động với nhau. Tuy nhiên, các lớp cung cấp một sự tích hợp chặt chẽ hơn giữa dữ liệu và hoạt động và các tính năng bổ sung như kế thừa.
Giorgio

@xralf: Có thể đọc về Simula 67, bạn có thể tìm hiểu thêm về các động lực cho OOP. BTW, theo như tôi có thể nhớ, Simula 67 đã có các phương thức ảo rồi. Vì vậy, phương pháp ảo là một phát minh thực sự cũ.
Giorgio

@WorldEngineer Tôi nghĩ rằng các hệ điều hành được viết bằng ngôn ngữ hội và ngôn ngữ C và có các thư viện để tổ chức mã.
xralf

5

Cấu trúc là các nhóm dữ liệu, thường được gõ. COBOL đã thấy việc sử dụng rộng rãi đầu tiên của họ. Mặc dù tương tự như đã tồn tại trước đó. Vấn đề thiết kế ở đây là nhóm nhiều bộ dữ liệu lại với nhau như tên, nghề nghiệp và số điện thoại. Ý tưởng về một "bản ghi" là một cái gì đó cũ hơn nhiều so với máy tính và xuất hiện trong toán học và một loạt các môn học khác.

Lập trình hướng đối tượng ban đầu được thiết kế để đối phó với mô phỏng trong đó bạn có một loạt các đối tượng đang chạy để mô phỏng một hệ thống. Simula 67 là người đầu tiên thực hiện phong cách lập trình đó. Smalltalk là ngôn ngữ hướng đối tượng đầy đủ đầu tiên trong đó mọi thứ là một đối tượng bao gồm cả nguyên thủy. Vấn đề ban đầu đang được giải quyết là mô phỏng các hệ thống phức tạp. Simula 67 được thiết kế bởi Ole-Johan Dahl và Kristen Nygaard. Alan Kay (người đã từng trả lời một câu hỏi về Stack Overflow ) đã thiết kế Smalltalk vẫn được sử dụng.

Các cấu trúc và các lớp có liên quan khá chặt chẽ với các kiểu trong đó cả hai đều xác định các tham số nhất định cho một tập hợp dữ liệu. Các lớp sẽ xác định rõ hơn các quyền truy cập và hoạt động, do đó cho phép thực hiện đầy đủ các kiểu dữ liệu trừu tượng. Các cấu trúc có thể được coi là một tập hợp con của các lớp trong một ngôn ngữ hướng đối tượng. Chúng sẽ là một lớp bao bọc có tất cả các trường được đặt thành công khai và không có phương thức nào bên ngoài getters và setters cho các trường đó.


4

Bạn có thể tìm thấy thông tin về các cấu trúc trong bài viết Wikipedia này . Nói tóm lại, chúng dường như rất gắn bó với khoa học máy tính, chúng được hỗ trợ đầu tiên bởi phần cứng (hướng dẫn đặc biệt trong IBM 1620, về cơ bản là thẻ đục lỗ và Công cụ phân tích của Babbage (ít nhất là theo wikipedia). ngôn ngữ được sử dụng rộng rãi đầu tiên để hỗ trợ xây dựng.


Tôi thích giải thích này cho các cấu trúc.
xralf

3

"Các cấu trúc" thực sự hoàn toàn khác với "các lớp". Hãy nghĩ về phong cách cũ "struct" như một bản ghi. Trong QBASIC họ thậm chí còn được gọi như vậy. Sự cần thiết của điều này là khá rõ ràng và mặc dù tôi không thể nói ai đã phát minh ra nó ... Tôi tưởng tượng nó xuất hiện gần như ngay lập tức. Các "lớp" của OOP dường như đã bắt đầu khá tốt với Simula: http://en.wikipedia.org/wiki/Object-oriented_programming#History


Về ý định, có, nhưng nếu bạn đang nói về C ++, sự khác biệt duy nhất giữa a structvà a classclassmặc định privatetrong khi structmặc định là public.
Gort Robot

Các hồ sơ có từ ít nhất là những năm 1800, có một chút trước C ++. Tôi không nghĩ C ++ có liên quan ở đây.
Jörg W Mittag

@ JörgWMittag: Tôi tin bạn, nhưng có bất kỳ nguồn hoặc ví dụ nào cho điều đó?
Thất vọngWithFormsDesigner
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.