STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • Bình luận
    • Sao chép

    Struct Trong Lập Trình C Và Tư Duy Trừu Tượng Hoá

    Ứng dụng và tư duy trừa tượng hoá của struct trong lập trình C/C++.

    Rye Nguyen

    11/08/2015
    19/09/2020
    4 phút đọc
    Struct Trong Lập Trình C Và Tư Duy Trừu Tượng Hoá

    Đặt vấn đề

    Giả sử STDIO tổ chức lưu trữ thông tin của các tác giả bằng ngôn ngữ C và có hơn 50 account được cấp quyền author (Gọi tắt là M).

    Mỗi author cần lưu trữ một số thông tin, cụ thể như sau:

    • Name.
    • Job.
    • Phone number.
    • Articles (Danh sách bài viết của tác giả đó).
    • About.
    • ...

    Theo thông thường, tạo ra các mảng tương ứng: char* name[M], char* job[M], long phone_number[M], char* articles[M], char* about[M], ...

    Giả sử STDIO manager quản lý các author, muốn cập nhật thông tin cho một author, có prototype của hàm như sau:

    void UpdateAuthorInfo(
    char* &name, char* &job, long &phone_number, char* &articles, char* &about);

    Vấn đề trở nên phức tạp khi STDIO quyết định bổ sung một vài thông tin cho author. Khi đó, không phải chỉ khai báo thêm các biến, mà các hàm liên quan cũng cần thay đổi theo, dễ xảy ra tình trạng sơ sót khi hệ thống ngày càng lớn.

    Để giải quyết vấn đề đó, STDIO quyết định nâng cấp hệ thống bằng cách sử dụng struct, gom nhóm các thông tin kể trên và biểu diễn thành một đối tượng duy nhất - SAuthor (Cách thức gom nhóm sẽ được trình bày ở phần dưới). Lúc này các mảng lưu trữ thông tin ở trên sẽ được thay bằng một mảng duy nhất: SAuthor* authors[M]. Khi đó, hàm UpdateAuthorInfo được tối giản lại như sau:

    void UpdateAuthorInfo(SAuthor* &author);

    Mỗi đối tượng SAuthor đại diện cho một author, lưu trữ tất cả thông tin trong cùng một cấu trúc dữ liệu. Khi cần cập nhật thêm tính năng, STDIO manager sẽ khai báo thêm thành phần bên trong cấu trúc SAuthor và xử lý thêm tại các hàm liên quan.

    Ở ví dụ nói trên, làm rõ luận điểm: Sử dụng struct để trừu tượng hoá các thông tin có liên quan với nhau thành một đối tượng duy nhất. Mặt khác, struct sau khi được định nghĩa có thể sử dụng như bất cứ kiểu dữ liệu thông thường nào, do đó Lập trình viên dễ dàng tiếp cận với struct như với các kiểu dữ liệu cơ bản.

    Khai báo và sử dụng

    Để khai báo một struct, sử dụng cú pháp như sau:

    struct SExample
    {
    	<data_type>		m_variable;
    	// ...
    };

    Lưu ý dấu chấm phẩy ; sau khi khai báo struct là bắt buộc. Các thành phần của struct được khai báo giống với một biến bình thường, cách nhau bởi dấu chấm phẩy. Các thành phần này có thể được truy cập thông qua các toán tử . hay -> (tương ứng với khai báo bình thường và khai báo kiểu con trỏ).

    Như vậy, với ví dụ ở phần Đặt vấn đề, STDIO manager có thể lập trình cấu trúc SAuthor như sau:

    struct SAuthor
    {
    	char* 		m_name;
    	char*		m_job;
    	long        m_phoneNumber;
    	char*		m_articles;
    	char*		m_about;
    	// ...
    };

    Một struct có thể chứa struct khác như một thành phần của nó. Như vậy, có thể sử dụng liên tục các toán tử . hoặc -> để truy xuất đến thành phần của các thành phần (struct) này.

    Tiền tố S trong SExamplem_ trong m_variable ở ví dụ trên có thể được loại bỏ. Tuy nhiên, với STDIO các tiền tố này nên được sử dụng để phân biệt với các cấu trúc và kiểu dữ liệu khác. Có thể tham khảo thêm bài viết STDIO Coding Convention để xây dựng quy tắc riêng cho mình.

    Sau khi khai báo, struct có thể được đặt lại tên khác bằng từ khoá typedef. Có thể xem thêm bài viết typedef Và enum.

    Ứng dụng struct

    Ngày nay, cùng với sự phát triển của ngôn ngữ C++ thì struct vẫn được lập trình viên sử dụng trong nhiều trường hợp.

    Biểu diễn Hình chữ nhật. Để biểu diễn một hình chữ nhật, cần chiều dài và chiều rộng, cùng với một điểm xác định "vị trí" của hình (thường là toạ độ của điểm top-left). Nếu hình chữ nhật này chỉ được sử dụng 1 lần, ví dụ trong trường hợp khởi tạo một cửa sổ Windows, có thể bỏ qua khái niệm struct. Tuy nhiên nếu việc sử dụng được lặp đi lặp lại thì một cách tự nhiên, có khai báo struct như sau:

    struct SRectangle
    {
    	float x, y;
    	float width, height;
    };

    Ngoài ra, có thể khai báo kết hợp để tạo ra cấu trúc SRectangle như sau:

    struct SVector2
    {
    	float x, y;
    };
    
    struct SRectangle
    {
    	struct SVector2		m_topLeft;
    	float 				width, height;
    };

    Biểu diễn Sin (project Sins):

    struct Sin
    {
    	struct Sprite*		m_sin;
    	struct SColor3B		m_color;
    	
    	struct Sprite*		m_darkForce;
    	bool			    m_isSealed;
    	
    	struct Animate*		m_effect;
    };
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Phù hợp cho bạn

    Đề xuất

    SOLID trong Lập Trình Hướng Đối Tượng

    SOLID trong Lập Trình Hướng Đối Tượng

    SOLID trong lập trình hướng đối tượng có giá trị như thế nào trong việc ...

    Software ArchitectureSOLID Principles

    06/08/2020

    Lập Trình Hướng Đối Tượng Ở Một Cách Tiếp Cận Khác - Tính Trừu Tượng

    Lập Trình Hướng Đối Tượng Ở Một Cách Tiếp Cận Khác - Tính Trừu Tượng

    Hướng tiếp cận tính trừu tượng và OOP theo khái niệm và ví dụ mềm dẻo.

    Modern C++

    10/08/2014

    Khám phá thêm

    Virtual Table Và Hiện Thực Hóa Polymorphism

    Virtual Table Và Hiện Thực Hóa Polymorphism

    Cơ chế vận hành của phương thức ảo, tính đa hình trong lập trình hướng ...

    Nguyễn Hữu Hiếu

    14/05/2014

    Sơ Lược về Phong Cách Lập Trình

    Sơ Lược về Phong Cách Lập Trình

    Bài viết là một vài chia sẻ về cách hình thành phong cách lập trình để ...

    STDIO TrainingLập trình

    27/05/2014

    5 Lý Do Kiến Trúc Sư Nên Học Lập Trình

    5 Lý Do Kiến Trúc Sư Nên Học Lập Trình

    Trong AutoCAD có hỗ trợ lập trình với Python, Revit có thể viết tự động ...

    STDIO TrainingGóc nhìn

    09/08/2020

    Tín Hiệu Số Và Tương Tự - Analog/Digital

    Tín Hiệu Số Và Tương Tự - Analog/Digital

    Trong ngành điện tử nói chung và trong lập trình vi điểu khiển nói ...

    Điện Tử Ứng DụngKiến thức & linh kiện

    22/06/2016

    Lập Trình Hướng Đối Tượng Trong Python  - Phần 1: Cơ Bản

    Lập Trình Hướng Đối Tượng Trong Python - Phần 1: Cơ Bản

    Đặc điểm và cách hiện thực lập trình hướng đối tượng trong Python.

    PythonOOP

    29/03/2015

    Interface Trong C#

    Interface Trong C#

    Giới thiệu về interface trong C#, ý nghĩa sử dụng, tính ứng dụng và cách ...

    Huỳnh Minh Tân

    03/10/2017

    Học Lập Trình Nên Bắt Đầu Từ Đâu?

    Học Lập Trình Nên Bắt Đầu Từ Đâu?

    Học lập trình nên bắt đầu từ đâu? Lựa chọn học từ nền tảng có phải luôn ...

    STDIO TrainingGóc nhìn

    30/06/2020

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020