Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 过程语言有设计模式吗?_Design Patterns_Procedural Programming - Fatal编程技术网

Design patterns 过程语言有设计模式吗?

Design patterns 过程语言有设计模式吗?,design-patterns,procedural-programming,Design Patterns,Procedural Programming,在我的经验中,我经常看到一些设计模式,比如访问者模式、策略模式等等,。。。在像Java这样的面向对象语言中。。。但是我在过程语言中没有看到太多的模式,比如C。。。我想知道这些模式是否存在于过程语言中 这本书《设计模式:可重用面向对象软件的元素》是一本具有里程碑意义的书,它将设计模式的注意力引入了计算机编程、设计和体系结构的实践中。当时占主导地位的编程范式是面向对象的软件开发,这本书明确针对该范式,而不是其他范式。尽管你可能会认为本书中的一些设计模式适用于其他范例,但这并不是本书的重点。因此,在设

在我的经验中,我经常看到一些设计模式,比如访问者模式、策略模式等等,。。。在像Java这样的面向对象语言中。。。但是我在过程语言中没有看到太多的模式,比如C。。。我想知道这些模式是否存在于过程语言中

这本书《设计模式:可重用面向对象软件的元素》是一本具有里程碑意义的书,它将设计模式的注意力引入了计算机编程、设计和体系结构的实践中。当时占主导地位的编程范式是面向对象的软件开发,这本书明确针对该范式,而不是其他范式。尽管你可能会认为本书中的一些设计模式适用于其他范例,但这并不是本书的重点。因此,在设计师和程序员中流行的是那本书中概述的一组设计模式。从那时起,其他作者、博客作者和其他网站记录了其他人。毫无疑问,有一些设计模式适用于各种web站点上描述的过程语言,但是,正如我所说,当编程社区谈到设计模式时,他们大多指的是那本书中概述的模式。我知道这不是一个真正的答案,因为我不知道过程语言的任何文档化模式在哪里,我肯定有一些。我想也许我应该说明这本书的重要性,以及它最初针对的范例。

过程语言确实有设计模式。但是由于基于类的OOP通常被忽略了过程方法,因此它们没有得到广泛的认可

我用C语言开发了高性能的软件,有几种重复出现的模式。因此,我将提供一些我经常看到的模式

句柄

这就是过程编程中封装的方式。构造函数不返回结构或对象。但是句柄:它通常是一个不透明的指针,或者只是一个整数。你不能做任何有趣的事情,因为它只是一个数字。细节完全隐藏了。但您可以将此句柄传递给处理它的函数:

示例:

  • 在Windows上,该函数返回HWND。它是窗口的句柄,可以传递给其他函数,如ShowWindow、DestroyWindow等
  • Linux上的系统调用。返回just和int。这是一个文件句柄
上下文

在过程语言中,对象通常称为上下文。上下文是一个包含某些系统状态的结构,就像对象的成员一样。在OOP中编写
object.method(参数)
。在过程编程中,您编写
函数(addressOfContext,parameter)
。内部函数直接使用上下文结构,而公共函数只接受句柄,实现将其解析为实际的上下文结构

回调

或函数指针。函数的用户传递其函数的地址以向系统添加自定义行为。这就是多态性在过程编程中的实现方式。这允许编写通用函数

一个值得注意的例子是C函数。这将获取元素数组的地址。获取一个元素的大小和数组中的元素数,以及执行比较的比较器函数。这是完全通用的实现,允许对所有类型的数据进行排序

设置结构

当一个函数可以通过多种方式参数化时。通常使用设置结构。 规范通常要求这些结构默认为零填充,并且只填充相关的成员。如果某些成员相互排斥,则将其置于联盟中。这种设置结构的典型示例是来自WinAPI的

可变大小数据

这是一个C模式,而不是一般的设计模式。有时对象可能持有任意大小的二进制有效负载。这种模式通常发生在从二进制文件读取数据时,而二进制文件可能包含多种类型的数据块。这是由这样的结构完成的

typedef struct
{
    int someData;
    int otherData;
    int nPayloadLength;
    unsigned char payload[1];
} VariableSized;
在代码中执行以下操作:

VariableSized *vs = malloc(sizeof(VariableSized) + extraLength);
这将分配比结构大的内存,从而为可变长度的负载留出空间。其第5个字节可由例如
vs->payload[4]
访问

这样做的好处是可以在一次
free
调用中释放整个对象。它保证在内存中有一个连续的块。因此,它比在堆的其他地方分配相应的缓冲区更好地利用了缓存

面向对象设计模式的过程对应项

在过程语言中,OOP模式从未以其名称被调用。所以我只能在这里猜测

创作模式

  • 抽象工厂:抽象工厂通常是一个单体。在这种情况下,根本不使用此模式,而是使用条件编译。否则,设置结构将提供创建函数
  • Builder:使用设置结构
  • 工厂方法:回调用于创建
  • 强>懒初始化:在C++中,静态局部变量用于此目的。在C语言中,可以在性能不关键的地方使用
    if(!initialized){initialize();initialized=1;}
    模式。对于性能关键的代码,根本不使用延迟加载。用户必须找到一个地方来初始化上下文
  • 原型:在程序世界中,我们只需将句柄返回到库存对象。WinAPI中的函数就是一个例子。对于可变对象,出于性能原因,通常使用写时拷贝机制
  • 单例