我知道设计模式通常与面向对象编程有关,但是你是否在使用C编程时经常使用一些模式?
我对古典的面向对象模式的简单翻译不感兴趣,请不要提到Duff设备。;-)
我知道设计模式通常与面向对象编程有关,但是你是否在使用C编程时经常使用一些模式?
我对古典的面向对象模式的简单翻译不感兴趣,请不要提到Duff设备。;-)
我最喜欢的是Adam Tornhill的"C语言设计模式"系列:
此外:我总是认为goto
是装饰器模式中一个很好的穷人工具。
更新:我强烈建议使用Rust(rust-lang.org)或Zig(ziglang.org),除非需要使用 C。 Rust 具有 C 的所有优点,包括速度和与 C 的二进制库兼容性,但编译器处理大部分复杂性以确保代码是内存安全的且不包含数据竞争。它还具有可移植性,为常见任务提供标准库,并且更容易实现各种设计模式。
通过回调实现多态,例如标准库的qsort
函数。它只需要一种比较两个元素的方式,就可以对数组进行排序。
您可以使用函数集合(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;
}
设计模式通常模拟的是距离现有环境仅一级的事物。如果您以C语言及其标准库作为环境,那么杰出的设计模式就是面向对象编程。
虚拟文件系统是学习设计模式的完美示例。
goto
与装饰器有什么关系,您能详细说明一下吗? - Gui Prá