C中有"设计模式"吗?

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二进制库的兼容性的优势,但是编译器处理许多复杂性,以确保代码的存储安全,并且不包含数据争.它也是可移植的,具有用于常见任务的标准库,并且更容易针对各种设计模式进行编程.

  • 你能详细说明'goto`与装饰器有什么关系吗? (8认同)
  • 这是 Adam Tornhill(原 Petersen)的一个很棒的小系列。他的[全书](https://leanpub.com/patternsinc) 可用。这一小组模式将使您在 C 语言中走得更远。 (2认同)
  • Rust 并不完全等同于 C。它足够不同,不能等同。例如,您可以从几乎任何语言调用 C 代码,但必须在 Rust 中关闭名称修饰。诚然,生锈也会阻止有效的程序通过借用检查器保留理论保证。我也喜欢生锈,但认为这值得反驳。 (2认同)

Vij*_*hew 9

设计模式可被视为缺少语言功能.设计模式的介绍:可重用的面向对象软件的元素:

编程语言的选择很重要,因为它会影响一个人的观点.我们的模式假设具有Smalltalk/C++级语言功能,并且该选择决定了哪些可以轻松实现,哪些不能轻松实现.如果我们假设过程语言,我们可能会包含称为"继承","封装"和"多态"的设计模式.同样,我们的一些模式直接由不太常见的面向对象语言支持.例如,CLOS有多种方法,可以减少对访问者等模式的需求.(斜体矿)

斜体句是你问题的答案.


Vla*_*lad 5

是的,有.惰性初始化,单例,对象池,对象状态等很容易在纯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)

  • @R.:我真的不认为单身人士本身就是一个糟糕的模式.它在某些情况下可以有用且高效,在某些情况下可能对代码质量有害.但开发人员必须**知道设计模式的优缺点,并明智地使用它们. (3认同)
  • 更好的一点是,你不应该在C中实现糟糕的设计模式(如单身人士,也就是全局变量),或者任何语言. (2认同)

Edm*_*und 5

通过回调进行多态性,例如标准库的qsort功能.它需要的只是一种比较两个元素的方法,它可以对它们的数组进行排序.

通过使用函数集(vtable)来表示类型的相关属性,以便通用例程可以有效地处理它,您可以比这更复杂.例如,读取,写入等调用打开的文件或网络端口.