one*_*sse 76 c design-patterns
我知道设计模式通常与OO编程有关,但是你有一些在编程C时经常使用的模式吗?
我对经典OO模式的简单翻译不感兴趣,请不要提及Duff的设备.;-)
Coo*_*J86 76
我最喜欢的是Adam Petersen的"C模式"系列:
另外:我一直认为这goto
是一个伟大的穷人的装饰模式的工具.
更新:我强烈建议使用Rust(rust-lang.org)而不是C,除非您需要使用c.锈拥有所有的C,包括速度和用C二进制库的兼容性的优势,但是编译器处理许多复杂性,以确保代码的存储安全,并且不包含数据争.它也是可移植的,具有用于常见任务的标准库,并且更容易针对各种设计模式进行编程.
设计模式可被视为缺少语言功能.设计模式的介绍:可重用的面向对象软件的元素:
编程语言的选择很重要,因为它会影响一个人的观点.我们的模式假设具有Smalltalk/C++级语言功能,并且该选择决定了哪些可以轻松实现,哪些不能轻松实现.如果我们假设过程语言,我们可能会包含称为"继承","封装"和"多态"的设计模式.同样,我们的一些模式直接由不太常见的面向对象语言支持.例如,CLOS有多种方法,可以减少对访问者等模式的需求.(斜体矿)
斜体句是你问题的答案.
是的,有.惰性初始化,单例,对象池,对象状态等很容易在纯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;
}
Run Code Online (Sandbox Code Playgroud)
通过回调进行多态性,例如标准库的qsort
功能.它需要的只是一种比较两个元素的方法,它可以对它们的数组进行排序.
通过使用函数集(vtable)来表示类型的相关属性,以便通用例程可以有效地处理它,您可以比这更复杂.例如,读取,写入等调用打开的文件或网络端口.
归档时间: |
|
查看次数: |
47781 次 |
最近记录: |