gpt4 book ai didi

erlang - 在erlang中隐藏公共(public)接口(interface)后面的不同实现

转载 作者:行者123 更新时间:2023-12-02 13:48:26 26 4
gpt4 key购买 nike

我有一段 erlang 代码,它应该从数据库读取一些值并且应该支持几个数据库。我希望我的代码在某种程度上不依赖于数据库,因此我实现了两个不同的 gen_servers,它们都使用相同的原子(db_handler)注册。我决定应该开始读取 .app 文件的版本。

这两个 gen_server 公开了一个公共(public)的 handle_call,因此我可以在应用程序的其他部分使用类似的内容:

gen_server:call(db_handler, {do_something, "value1", "value2"})

这是可行的,但它仍然与新数据库的每个和任何 future 实现都应该是 gen_server 这一事实密切相关。

我正在考虑使用!运算符并处理handle_info中的命令,但我仍然认为可以有更好的解决方案(也许通过另一个模块?)。

有人能给我一些关于在 erlang 中处理此类事情的更好方法的见解吗?

最佳答案

为每个数据库服务器添加一个公共(public)接口(interface)来抽象调用:

-module(db_server1).

...

do_something([Value1,Value2]) -> gen_server:call(db_handler, {do_something, "value1", "value2"}).

...

另一个不使用gen服务器

-module(db_server2).

...

do_something([Value1,Value2]) -> something_else({do_something, "value1", "value2"}).

...

创建一个新进程(gen_server :o),该进程接收用于选择数据库服务器并将其存储在其状态中的参数作为初始化参数(例如 db_server2),

对于每个 do_something 函数,实现如下函数:

do_something(Value1,Value2) -> gen_server:call(db_handler, {do_something, ["value1", "value2"]}).

...

handle_call({Func, Args}, _From, DB_server) ->
R = DB_server:F(Args),
{reply, R, DB_server}.

对于非阻塞接口(interface)也是如此,使用强制转换或等效方法

关于erlang - 在erlang中隐藏公共(public)接口(interface)后面的不同实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22973555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com