就目前的情况而言,此问题不适合我们的问答格式。我们希望答案能得到事实、参考资料或专业知识的支持,但此问题可能会引发辩论、争论、民意调查或广泛讨论。如果您认为此问题可以改进并可能重新讨论,请访问visit the help center以获取指导。
10年前关闭了。
我知道设计模式通常与面向对象编程有关,但您在编写C程序时是否经常使用一些模式?
我对经典OO模式的简单翻译不感兴趣,请不要提到达夫的设备。- )
就目前的情况而言,此问题不适合我们的问答格式。我们希望答案能得到事实、参考资料或专业知识的支持,但此问题可能会引发辩论、争论、民意调查或广泛讨论。如果您认为此问题可以改进并可能重新讨论,请访问visit the help center以获取指导。
10年前关闭了。
我知道设计模式通常与面向对象编程有关,但您在编写C程序时是否经常使用一些模式?
我对经典OO模式的简单翻译不感兴趣,请不要提到达夫的设备。- )
7条答案
按热度按时间eagi6jfj1#
我最喜欢的是Adam Tornhill的“Patterns in C”系列:
另外:我一直认为
goto
是装饰器模式的一个伟大的穷人工具。更新:我强烈推荐使用Rust(rust-lang.org)或Zig(ziglang.org)而不是C,除非你需要使用c。Rust拥有c的所有优点,包括速度和与c的二进制库兼容性,但编译器处理了大部分复杂性,以确保代码是内存安全的,不包含数据竞争。它也是可移植的,有一个标准的库,用于常见的任务,并且更容易为各种设计模式编程。
j2cgzkjk2#
设计模式可以被看作是缺失的语言特性。Design Patterns: Elements of Reusable Object-Oriented Software的介绍指出:
编程语言的选择很重要,因为它会影响一个人的观点。我们的模式假设Smalltalk/C++级别的语言特性,这种选择决定了什么可以轻松实现,什么不能轻松实现。* 如果我们假设过程语言,我们可能会包括称为“继承”,“封装”和“多态”的设计模式。* 同样,我们的一些模式直接由不太常见的面向对象语言支持。例如,CLOS有多个方法,这减少了对Visitor等模式的需要。
用斜体印出的句子是对你问题的回答。
mwkjh3gx3#
通过回调实现多态,例如标准库的
qsort
函数。它所需要的只是一种比较两个元素的方法,并且它可以对它们的数组进行排序。你可以使用一组函数(vtables)来表示类型的相关属性,这样泛型例程就可以有效地处理它。例如,在打开的文件或网络端口上进行读、写等调用。
anauzrmj4#
从我的头顶
8cdiaqws5#
是的,有。惰性初始化,单例,对象池,对象状态等都可以很容易地用纯C实现。
示例(延迟初始化)
yjghlzjz6#
设计模式通常只对现有环境提供的一个层次进行建模。如果你把C及其标准库作为环境,那么一个杰出的设计模式就是面向对象。
polkgigr7#
虚拟文件系统是学习设计模式的一个很好的例子。