Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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

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
C 如何在嵌入式UNIX系统中抽象网络服务API_C_Design Patterns_Embedded_Abstract - Fatal编程技术网

C 如何在嵌入式UNIX系统中抽象网络服务API

C 如何在嵌入式UNIX系统中抽象网络服务API,c,design-patterns,embedded,abstract,C,Design Patterns,Embedded,Abstract,我正在为路由器使用嵌入式LINUX系统。有一个web GUI供用户配置选项。当用户填写web表单时,该表单将提交给web服务器函数,该函数负责验证用户输入,将配置保存在数据库中,并使用C标准库和bash脚本重新启动某些服务。还有一个命令行接口,可以通过SSH调用。这个CLI会再次验证用户输入,将配置保存到数据库中,并使用bash脚本重新启动某些服务 我想将一些业务逻辑抽象为更紧密的层。例如,我正在考虑为DHCP服务器使用抽象数据类型。ADT接口将公开概念实体上的操作(启动/停止服务,设置要提供给

我正在为路由器使用嵌入式LINUX系统。有一个web GUI供用户配置选项。当用户填写web表单时,该表单将提交给web服务器函数,该函数负责验证用户输入,将配置保存在数据库中,并使用C标准库和bash脚本重新启动某些服务。还有一个命令行接口,可以通过SSH调用。这个CLI会再次验证用户输入,将配置保存到数据库中,并使用bash脚本重新启动某些服务

我想将一些业务逻辑抽象为更紧密的层。例如,我正在考虑为DHCP服务器使用抽象数据类型。ADT接口将公开概念实体上的操作(启动/停止服务,设置要提供给LAN客户端的IP地址池),并隐藏操作实现细节(设置DHCP服务器的脚本)

因此,为DHCP服务器提供这段ADT:

static int enable;
static struct in_addr lan_ip_pool_start;
static struct in_addr lan_ip_pool_end;
static char* opt12_hostname;
.....

int DhcpServerStart ()
{
    ....
    ....
}
对于上面的方法,它可以在调用时更新enable变量,更新数据库并实现代码来fork和exec DHCP服务器二进制文件,并将正确的参数传递给它。 但是我认为我可以通过提取更多不相关的职责来获得更多的好处

所以我想用一个新的API来抽象数据库,也许我可以用另一个API来抽象shell脚本。通过这种方式,我可以迁移数据库和脚本,而无需更改域对象的实现:

#include <databaseapi.h>
#include <shellcfg.h>

static int enable;
static struct in_addr lan_ip_pool_start;
static struct in_addr lan_ip_pool_end;
static char* opt12_hostname;
.....

int DHCPServerStart ()
{
    database_saveDHCPServerState(1);
    shell_DHCPServerStart();
}
#包括
#包括
静态int使能;
静态结构在\u addr lan\u ip\u pool\u start;
地址局域网ip池端的静态结构;
静态字符*opt12_主机名;
.....
int DHCPServerStart()
{
数据库_saveDHCPServerState(1);
shell_DHCPServerStart();
}
我对上述方法一点也不满意。我认为更新数据库并不是DHCP服务器作为概念对象应该考虑的事情。同时,我不确定是应该抽象shell脚本来设置网络服务,还是应该由代表特定业务实体的每个ADT来实现

另一方面,当系统启动时,处理系统初始化的函数将实例化所有业务实体,因此我考虑将所有实体包含在一个全局“类”/ADT中。也许这个“类”可以公开一个接口,让用户界面设置任何服务,然后这个全局对象应该负责更新数据库,并通过使用表示服务的特定ADT启动一些服务