gpt4 book ai didi

data-structures - Erlang 中 "mutable"记录的最佳策略

转载 作者:行者123 更新时间:2023-12-04 15:36:27 26 4
gpt4 key购买 nike

我开发了我认为会有很多用户的系统。每个用户都有一个在应用程序内表示为记录的配置文件。为了存储用户的个人资料,我执行以下操作 base64:encode_to_string(term_to_binary(Profile)) ,所以基本上配置文件以序列化方式存储。

到目前为止一切都很好。现在问题来了:

有时我确实计划通过添加和删除其中的某些字段来扩展配置文件功能。我的问题是处理这些代码更改的最佳策略是什么?

我目前看到的方法是做这样的事情:

Profile = get_profile(UserName),
case is_record(Profile, #profile1) of
true ->
% do stuff with Profile#profile1
ok;
_ ->
next
end,
case is_record(Profile, #profile2) of
true ->
% do stuff with Profile#profile2
ok;
_ ->
next
end,

我想知道我的任务是否有更好的解决方案?

附加信息:我使用的是简单的 KV 存储。它不能存储 Erlang 类型,这就是我使用 State#state.player#player.chips#chips.br 的原因

最佳答案

它很大程度上取决于记录数量的比例、更改频率和可接受的中断。由于可维护性,我更喜欢将配置文件升级到最新版本。你也可以制作像 mnesia 那样即时升级的系统。最后有可能为所有版本保留代码,我绝对不喜欢。这是维护的噩梦。

反正什么时候is_record/2我更喜欢看守时允许

case Profile of
X when is_record(X, profile1) ->
% do stuff with Profile#profile1
ok;
X when is_record(X, profile2) ->
% do stuff with Profile#profile2
ok
end

注意没有 catch all 子句,因为你会用未知的记录类型做什么?这是错误所以快速失败!

您还有许多其他选择,例如黑客喜欢:
case element(1,Profile) of
profile1 ->
% do stuff with Profile#profile1
ok;
profile2 ->
% do stuff with Profile#profile2
ok
end

或类似的东西
{_, F} = lists:keyfind({element(1,Profile), size(Profile)},
[{{profile1, record_info(size, profile1)}, fun foo:bar/1},
{{profile2, record_info(size, profile2)}, fun foo:baz/1}]),
F(Profile).

以及许多其他可能性。

关于data-structures - Erlang 中 "mutable"记录的最佳策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7991060/

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