Ответ 1
Моя любимая серия "Шаблоны в С" от Адам Петерсен:
Также: я всегда думаю о goto
как о великом бедном человеке для шаблона декоратора.
Я знаю, что шаблоны проектирования обычно являются тем, что связано с программированием OO, но есть ли у вас некоторый шаблон, который вы часто используете при программировании C?
Мне не интересны простые переводы классических шаблонов OO и, пожалуйста, не упоминайте устройство Duff.; -)
Моя любимая серия "Шаблоны в С" от Адам Петерсен:
Также: я всегда думаю о goto
как о великом бедном человеке для шаблона декоратора.
Шаблоны проектирования можно рассматривать как недостающие языковые функции. Введение Шаблоны проектирования: Элементы многоразового объектно-ориентированного программного обеспечения гласит:
Выбор языка программирования важно, потому что это влияет на точка зрения. Наши модели предполагают Возможности языка Smalltalk/С++, и этот выбор определяет, что может и не может быть легко реализована. Если мы приняли процедурные языки, мы возможно, включили шаблоны проектирования "Наследование", "Инкапсуляция", и "Полиморфизм". Аналогичным образом, некоторые из наши шаблоны поддерживаются непосредственно менее распространенные объектно-ориентированные языки. CLOS имеет несколько методов для например, что уменьшает необходимость такой как посетитель. (курсив мой)
Выделение курсивом - это ответ на ваш вопрос.
Да, есть. Ленивая инициализация, 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;
}
Полиморфизм через обратные вызовы, например. стандартная библиотека qsort
. Все, что ему нужно, это способ сравнения двух элементов, и он может сортировать массив из них.
Вы можете быть гораздо более сложным, чем это, используя наборы функций (vtables) для представления соответствующих свойств типа, чтобы общая процедура могла обрабатывать его с пользой. Например, чтение, запись и т.д. Вызывает открытый файл или сетевой порт.
Сверху головы
Шаблоны проектирования часто моделируют вещи, которые являются всего лишь одним уровнем от того, что предлагает существующая среда. Если вы берете C со своей стандартной библиотекой в качестве среды, то выдающимся шаблоном проектирования является ориентация объектов.
Виртуальная файловая система - прекрасный пример для изучения шаблона проектирования.