2010-11-06 3 views
53

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

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

ответ

56

Мой любимый "Закономерности в C" серии по Adam Petersen:

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

+7

Не могли бы вы рассказать о том, что 'goto' имеет отношение к декораторам? –

+0

Это замечательная маленькая серия Адама Торнхилла (был Петерсен). Доступна его [полная книга] (https://leanpub.com/patternsinc). Этот небольшой набор шаблонов займет у вас долгий путь. –

4

Да, есть. Ленивая инициализация, синглтон, пул объектов, состояние объекта и т.д. легко реализуется в чистом 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; 
} 
+0

Да, они, вероятно, есть, но как вы обычно реализуете один из этих шаблонов в C? – onemasse

+0

добавлен пример для ленивого init – Vlad

+2

. Лучше сказать, что вы ** не должны ** реализовывать плохие шаблоны проектирования (например, одиночные, как глобальные переменные) на языке C или на любом другом языке. –

1

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

4

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

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

+0

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

7

Дизайн Шаблоны можно рассматривать как недостающие функции языка. Введение Design Patterns: Elements of Reusable Object-Oriented Software гласит:

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

Приговор курсивом является ответом на ваш вопрос.

0

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

Смежные вопросы