Существуют ли какие-либо "шаблоны проектирования" в C? [закрытый]


Я знаю, что шаблоны проектирования обычно связаны с программированием OO, но есть ли у вас какой-то шаблон, который вы часто используете при программировании C?

меня не интересуют простые переводы классических шаблонов OO, и, пожалуйста, не упоминайте устройство Даффа. ; -)

7 62

7 ответов:

мой любимый" шаблоны в C " серии по Адам Петерсен:

также: я всегда думаю о goto как инструмент большого бедняка для картины декоратора.

обновление: я настоятельно рекомендую использовать Руст (rust-lang.org) вместо C, за исключением случаев, когда вам необходимо использовать c. Rust имеет все преимущества c, включая скорость и совместимость двоичной библиотеки с c, но компилятор обрабатывает большую часть сложности, чтобы гарантировать, что код является безопасным для памяти и не содержит гонки данных. Он также портативен, имеет стандартную библиотеку для общих задач и гораздо легче программируется для различных шаблонов проектирования.

шаблоны проектирования можно рассматривать как отсутствующие языковые функции. Введение шаблоны проектирования: элементы объектно-ориентированного проектирования гласит:

выбор языка программирования важно, потому что это влияет на точка зрения. Наши шаблоны предполагают Возможности языка на уровне Smalltalk / C++, и этот выбор определяет, что может и не может быть легко реализован. если мы приняли процедурные языки, мы может иметь включенные шаблоны проектирования называется "наследование", " инкапсуляция," и "полиморфизм." аналогично, некоторые из наши картины поддержаны сразу мимо менее распространенные объектно-ориентированные языки. CLOS имеет мульти-методы, для пример, который уменьшает потребность в картина как посетитель. (выделено)

предложение, выделенное курсивом, является ответом на ваш вопрос.

полиморфизм через обратные вызовы, например, стандартная библиотека . Все, что ему нужно, это способ сравнить два элемента, и он может сортировать массив из них.

вы можете быть гораздо более сложным, чем это, используя наборы функций (vtables) для представления соответствующих свойств типа, чтобы общая процедура могла обрабатывать его с пользой. Например, читать, писать и т. д. вызывает открытый файл или сетевой порт.

Да, есть. Ленивая инициализация, синглтон, пул объектов, состояние объекта и т. д. легко реализуются в чистом С.

пример (ленивая инициализация)

#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 со своей стандартной библиотекой в качестве среды, то выдающийся шаблон проектирования-это объектная ориентация.

виртуальная файловая система является идеальным примером для изучения шаблона проектирования.