Có "mẫu thiết kế" nào trong C không? [đóng cửa]


81

Tôi biết rằng các mẫu thiết kế nói chung là thứ được kết nối với lập trình OO, nhưng bạn có một số mẫu mà bạn thường sử dụng khi lập trình C không?

Tôi không quan tâm đến các bản dịch đơn giản của các mẫu OO cổ điển và vui lòng không đề cập đến thiết bị của Duff. ;-)

Câu trả lời:


83

Tôi thích nhất là loạt phim "Patterns in C" của Adam Tornhill :

Ngoài ra: Tôi luôn gotocoi đó là một công cụ tuyệt vời của một người nghèo để tạo mẫu trang trí.

Cập nhật : Tôi thực sự khuyên bạn nên sử dụng Rust ( gỉ- lang.org ) thay vì C, ngoại trừ trường hợp bạn bắt buộc phải sử dụng c. Rust có tất cả các lợi ích của c, bao gồm cả tốc độ và khả năng tương thích thư viện nhị phân với c, nhưng trình biên dịch xử lý phần lớn độ phức tạp để đảm bảo rằng mã là bộ nhớ an toàn và không chứa các cuộc đua dữ liệu. Nó cũng có thể di động, có một thư viện tiêu chuẩn cho các tác vụ thông thường và dễ dàng hơn để lập trình cho các mẫu thiết kế khác nhau.


9
Bạn có thể giải thích thêm về những gì gotophải làm với trang trí?
Gui Prá

Đây là một bộ truyện nhỏ tuyệt vời của Adam Tornhill (là Petersen). Cuốn sách hoàn chỉnh của anh ấy đã có sẵn. Đây bộ nhỏ của mô hình sẽ đưa bạn một chặng đường dài trong C.
Clint Pachl

10

Mẫu thiết kế có thể được xem như các tính năng ngôn ngữ bị thiếu. Giới thiệu các mẫu thiết kế: Các phần tử của Phần mềm hướng đối tượng có thể tái sử dụng trạng thái:

Việc lựa chọn ngôn ngữ lập trình rất quan trọng vì nó ảnh hưởng đến quan điểm của một người. Các mẫu của chúng tôi giả định các tính năng ngôn ngữ cấp độ Smalltalk / C ++ và lựa chọn đó xác định những gì có thể và không thể thực hiện dễ dàng. Nếu chúng ta sử dụng các ngôn ngữ thủ tục, chúng ta có thể đã bao gồm các mẫu thiết kế được gọi là "Kế thừa", "Đóng gói" và "Đa hình". Tương tự, một số mẫu của chúng tôi được hỗ trợ trực tiếp bởi các ngôn ngữ hướng đối tượng ít phổ biến hơn. Ví dụ, CLOS có nhiều phương thức, giúp giảm bớt nhu cầu về một mẫu như Khách truy cập. ( chữ nghiêng của tôi )

Câu in nghiêng là câu trả lời cho câu hỏi của bạn.


7

Tính đa hình thông qua các lệnh gọi lại, ví dụ như thư viện chuẩn của qsort chức năng . Tất cả những gì nó cần là một cách để so sánh hai phần tử và nó có thể sắp xếp một mảng trong số chúng.

Bạn có thể phức tạp hơn nhiều so với điều này bằng cách sử dụng các tập hợp hàm (vtables) để biểu diễn các thuộc tính thích hợp của một kiểu để một thói quen chung có thể xử lý nó một cách hữu ích. Ví dụ: lệnh đọc, ghi, v.v. trên một tệp đang mở hoặc cổng mạng.


Tôi thích sử dụng các cuộc gọi lại. Bạn có thể tạo một hàm duyệt cấu trúc dữ liệu chung để thực thi một hàm gọi lại trên mỗi phần tử.
onemasse

5

Có, có. Khởi tạo lười biếng, singleton, nhóm đối tượng, trạng thái đối tượng, v.v. dễ dàng được thực hiện trong C.

Ví dụ (khởi tạo lười biếng)

#include <stdio.h>

struct foo
{
    int payload;
};

int calculate_payload()
{
    printf("%s\n", "Performing lengthy initialization...");
    return 42;
}

struct foo *get_default_foo()
{
    static int foo_calculated = 0;
    static struct foo default_foo;
    if (!foo_calculated) /* assuming single-threaded access */
    {
        foo_calculated = 1;
        default_foo.payload = calculate_payload();
    }
    return &default_foo;
}

int main()
{
    struct foo *foo1, *foo2;

    printf("%s\n", "Starting the program");

    foo1 = get_default_foo();
    printf("%d\n", foo1->payload);

    foo2 = get_default_foo();
    printf("%d\n", foo2->payload);

    return 0;
}

Có, có thể là như vậy, nhưng bạn thường triển khai một trong những mẫu này như thế nào trong C?
onemasse

2
Điểm tốt hơn là bạn không nên triển khai các mẫu thiết kế xấu (như singleton, hay còn gọi là biến toàn cục) trong C hoặc bất kỳ ngôn ngữ nào cho vấn đề đó.
R .. GitHub DỪNG TRỢ GIÚP ICE

4
@R: Tôi thực sự không nghĩ rằng singleton là một mô hình xấu. Nó thể hữu ích và hiệu quả trong một số trường hợp nhất định, có thể có hại cho chất lượng mã trong một số trường hợp nhất định. Nhưng nhà phát triển phải biết những ưu điểm và nhược điểm của những người sáng tạo thiết kế và sử dụng chúng một cách thận trọng.
Vlad


2

Mẫu thiết kế thường mô hình hóa những thứ chỉ ở một cấp độ so với những gì môi trường hiện có cung cấp. Nếu bạn lấy C với thư viện tiêu chuẩn của nó làm môi trường thì một mẫu thiết kế nổi bật là Hướng đối tượng.


2

Hệ thống tệp ảo là ví dụ hoàn hảo để học Mẫu thiết kế.

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.