Существуют ли какие-либо "шаблоны проектирования" в C? [закрытый]
Я знаю, что шаблоны проектирования обычно связаны с программированием OO, но есть ли у вас какой-то шаблон, который вы часто используете при программировании C?
меня не интересуют простые переводы классических шаблонов OO, и, пожалуйста, не упоминайте устройство Даффа. ; -)
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; }