C语言中有“设计模式”吗?[关闭]

fbcarpbf  于 2023-03-29  发布在  其他
关注(0)|答案(7)|浏览(121)

就目前的情况而言,此问题不适合我们的问答格式。我们希望答案能得到事实、参考资料或专业知识的支持,但此问题可能会引发辩论、争论、民意调查或广泛讨论。如果您认为此问题可以改进并可能重新讨论,请访问visit the help center以获取指导。
10年前关闭了。
我知道设计模式通常与面向对象编程有关,但您在编写C程序时是否经常使用一些模式?
我对经典OO模式的简单翻译不感兴趣,请不要提到达夫的设备。- )

eagi6jfj

eagi6jfj1#

我最喜欢的是Adam Tornhill的“Patterns in C”系列:

另外:我一直认为goto是装饰器模式的一个伟大的穷人工具。

更新:我强烈推荐使用Rustrust-lang.org)或Zigziglang.org)而不是C,除非你需要使用c。Rust拥有c的所有优点,包括速度和与c的二进制库兼容性,但编译器处理了大部分复杂性,以确保代码是内存安全的,不包含数据竞争。它也是可移植的,有一个标准的库,用于常见的任务,并且更容易为各种设计模式编程。

j2cgzkjk

j2cgzkjk2#

设计模式可以被看作是缺失的语言特性。Design Patterns: Elements of Reusable Object-Oriented Software的介绍指出:
编程语言的选择很重要,因为它会影响一个人的观点。我们的模式假设Smalltalk/C++级别的语言特性,这种选择决定了什么可以轻松实现,什么不能轻松实现。* 如果我们假设过程语言,我们可能会包括称为“继承”,“封装”和“多态”的设计模式。* 同样,我们的一些模式直接由不太常见的面向对象语言支持。例如,CLOS有多个方法,这减少了对Visitor等模式的需要。
用斜体印出的句子是对你问题的回答。

mwkjh3gx

mwkjh3gx3#

通过回调实现多态,例如标准库的qsort函数。它所需要的只是一种比较两个元素的方法,并且它可以对它们的数组进行排序。
你可以使用一组函数(vtables)来表示类型的相关属性,这样泛型例程就可以有效地处理它。例如,在打开的文件或网络端口上进行读、写等调用。

anauzrmj

anauzrmj4#

从我的头顶

8cdiaqws

8cdiaqws5#

是的,有。惰性初始化,单例,对象池,对象状态等都可以很容易地用纯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;
}
yjghlzjz

yjghlzjz6#

设计模式通常只对现有环境提供的一个层次进行建模。如果你把C及其标准库作为环境,那么一个杰出的设计模式就是面向对象。

polkgigr

polkgigr7#

虚拟文件系统是学习设计模式的一个很好的例子。

相关问题