c++ - C 的 SOLID 原则实现

标签 c++ c c++11 solid-principles design-principles

我知道 SOLID 原则是为面向对象的语言编写的。

我在书中找到:Robert Martin 的“嵌入式 C 的测试驱动开发”,本书最后一章中的以下句子:

“应用开闭原则和 Liskov 替换原则使设计更加灵活。”

因为这是一本 C 的书(没有 c++ 或 c#),所以应该有一种方法来实现这些原则。

在 C 中实现这一原则是否存在任何标准方法?

最佳答案

开闭原则指出,一个系统应该被设计成对扩展开放,同时保持对修改的封闭,或者它可以在不修改的情况下使用和扩展。 Dennis 提到的 I/O 子系统是一个相当常见的示例:在可重用系统中,用户应该能够指定如何读取和写入数据,而不是假设数据只能写入文件。

实现这一点的方式取决于您的需要:您可以允许用户传入一个打开的文件描述符或句柄,这已经启用了除了文件之外的套接字或管道的使用。或者您可以允许用户传入指向应该用于读取和写入的函数的指针:这样您的系统可以在操作系统允许的情况下用于加密或压缩数据流。

Liskov 替换原则指出应该始终可以用子类型替换类型。在 C 语言中,您通常没有子类型,但您可以在模块级别应用该原则:代码应该设计成使用模块的扩展版本,如更新版本,不应该破坏它。一个模块的扩展版本可能会使用一个 struct,它比原始版本有更多的字段,enum 中有更多的字段,以及类似的东西,所以你的代码不应该假设传入的结构有一定的大小,或者枚举值有一定的最大值。

这方面的一个例子是如何在 BSD 套接字 API 中实现套接字地址:有一个“抽象”套接字类型 struct sockaddr 可以代表任何套接字地址类型,以及一个具体的套接字类型每个实现,例如用于 Unix 域套接字的 struct sockaddr_un 和用于 IP 套接字的 struct sockaddr_in。处理套接字地址的函数必须传递一个指向数据的指针具体地址类型的大小。

关于c++ - C 的 SOLID 原则实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17648266/

相关文章:

qt - 我应该在基于 C++11 范围的 QHash::keys() 上使用 qAsConst

c++ - C++ 中的 Unicode 和 std::string

c++ - 至少有时将 uint8_t 转换为 signed int 是不正确的吗?

c - 将 "too many"参数传递给外部函数是否安全?

c - 逐行读取文本文件并放入单独的字符串: line1, line2、line3等

c++11 - 由时钟和稳定时钟测量的时间差异

c++ - QtCore、QMutex类、锁函数——栈溢出失败

c++ - 从 C++ STL 集合中获取通用 key_type

c - 如何计算 proc 文件的性能

c++ - 使用可以在多个不同位置定义的函数之类的 C++ 类