虽然实体设计原则主要应用于面向对象系统,但也有一些实体概念可应用于过程编程,如SRP或DIP。但是当我研究POSIX API中的一些可用函数时,我注意到有些原则是不受尊重的,尽管它可能是这样的。
我将以SRP为例,系统调用sigaction:
SRP指出,在我们的情况下,一个功能必须有一个单一的责任,这意味着改变我们系统规范的单一部分是可以改变功能规范的一件事。
sigaction是一个系统调用,用于更改进程在接收到信号时采取的操作。
sigaction可用于安装表单的基本处理程序:

void (*sa_handler)(int)

这意味着处理程序只接收执行其操作的信号数。系统调用还可用于安装窗体的处理程序:
void (*sa_sigaction)(int, siginfo_t*, void*)

这让我们获得更多关于处理信号的信息。由于调用者放置的标志,这两个窗体都与同一个系统调用一起安装。
在我看来,sigaction违反了SRP原则,因为它有责任实现两种类型的处理程序安装。
所以我的问题是:POSIX API是否违反了可靠的原则,如果是,为什么?

最佳答案

恕我直言,我认为你的例子有点言过其实(它也忽略了固体中的D)。
POSIX可能违反了可靠的原则(或者可能没有)。。。但另一方面,POSIX对什么是可以分离的,什么是属于一起的有着成熟的理解(这种理解来自实际应用)。
换言之,问题在于“什么是单一责任”的范围,而且POSIX有数十年的经验帮助它划清界限。
在您的示例中,您声明sigaction必须实现这两种类型的东西,但这是一个谬论。
sigaction只有一个职责-它需要注册回调。回调类型实际上是不相关的,因为责任在“注册”中。
如果数组push函数是类型不可知的,它是否违反SRP原则?不。它只负责一项任务——向阵列推进。彼此彼此。
如果我按照你的逻辑,为每个回调类型实现一个不同的函数,我会发现自己一遍又一遍地编写相同的代码,只是有一些细微的变化——这违反了DRY原则,这清楚地表明这些函数分担相同的责任,应该是统一的。

关于c - POSIX API和SOLID设计原则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48341881/

10-11 22:53
查看更多