Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 2

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

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

Выделение курсивом - это ответ на ваш вопрос.

Ответ 3

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

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

#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;
}

Ответ 4

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

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

Ответ 6

Шаблоны проектирования часто моделируют вещи, которые являются всего лишь одним уровнем от того, что предлагает существующая среда. Если вы берете C со своей стандартной библиотекой в ​​качестве среды, то выдающимся шаблоном проектирования является ориентация объектов.

Ответ 7

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