2010-11-06 32 views
53

我知道设计模式通常是与OO编程相关的东西,但是当您编程C时,您是否有一些经常使用的模式?C中有没有“设计模式”?

我对古典OO模式的简单翻译不感兴趣,请不要提及达夫的设备。 ;-)

回答

56

我最喜欢的是系列中的 “用C模式”,由Adam Petersen

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

+7

你能详细说明goto与装饰器有什么关系吗? – 2015-08-14 16:48:56

+0

这是Adam Tornhill(彼得森)的精彩小系列。他的[完整书籍](https://leanpub.com/patternsinc)可用。这一小组模式将在C中占据很长一段路。 – 2017-10-31 10:56:33

4

是的,有。延迟初始化,单身,对象池,对象状态等,很容易在纯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; 
} 
+0

是的,他们可能是,但你通常如何在C中实现这些模式之一? – onemasse 2010-11-06 14:14:29

+0

添加例如用于延迟初始化 – Vlad 2010-11-06 14:29:32

+2

更好的一点是,你**应该不是**落实不好的设计模式(如单身,又名全局变量)在C,或与此有关的任何语言。 – 2010-11-06 16:00:11

1

设计模式往往是从什么现有环境只是一个级别车型的东西提供。如果你将C的标准库作为环境,一个杰出的设计模式是面向对象。

4

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

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

+0

我喜欢使用回调。您可以创建一个通用数据结构遍历函数,该函数在每个元素上执行回调函数。 – onemasse 2010-11-06 14:11:23

7

设计模式可被视为缺少语言功能。的Design Patterns: Elements of Reusable Object-Oriented Software的简介指出:

编程语言的选择是 重要的,因为它影响着一个人的 的观点。我们的模式假设 Smalltalk/C++级别的语言功能, 和那个选择决定什么可以 和不能轻易实现。 如果 我们假定程序语言,我们 可能包含名为“继承”,“封装”, 和“多态性”的设计模式 。同样,我们的一些 模式直接支持 不太常见的面向对象的 语言。 CLOS具有多种方法,例如 示例,这样可以减少对访问者等 模式的需求。 (我加

这句话用斜体字是回答你的问题。

0

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