我知道设计模式通常与OO编程相关,但是您在编程C时是否经常使用某些模式?
我对经典OO模式的简单翻译不感兴趣,请不要提及Duff的设备。;-)
Answers:
我最喜欢的是亚当·托恩希尔(Adam Tornhill)的“ C模式”系列:
另外:我一直认为goto
这是装饰图案的可怜人的工具。
更新:我强烈建议使用Rust(rust-lang.org)而不是C,除非您需要使用c。Rust具有c的所有优点,包括速度和与c的二进制库兼容性,但是编译器处理了许多复杂性,以确保代码是内存安全的并且不包含数据竞争。它也是便携式的,具有用于执行常见任务的标准库,并且对于各种设计模式更容易编程。
设计模式可以视为缺少语言功能。设计模式简介:可重用的面向对象软件的元素指出:
编程语言的选择很重要,因为它会影响一个人的观点。我们的模式假定使用Smalltalk / C ++级别的语言功能,并且该选择确定了可以轻松实现的内容。如果我们采用过程语言,则可能包括称为“继承”,“封装”和“多态”的设计模式。同样,不太常见的面向对象语言直接支持我们的某些模式。例如,CLOS具有多种方法,可以减少对访问者之类的模式的需求。(斜体)
斜体字是您问题的答案。
通过回调的多态性,例如标准库的qsort
功能。它所需要的只是一种比较两个元素的方法,并且可以对它们进行排序。
通过使用函数集(vtables)表示类型的相关属性,您可以比这复杂得多,以便泛型例程可以对其进行有用的处理。例如,在打开的文件或网络端口上的读取,写入等调用。
是的,有。延迟初始化,单例,对象池,对象状态等都可以在纯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;
}
从我的头顶
goto
与装饰器有什么关系?