我已经到了现在我写了很多Erlang代码的阶段,我可以看到一些风格(坏或好)悄悄进入我写作的方式.这个特别的习惯我想要一些意见 - 将案例样式语句转换为函数模式匹配更好(更可读/更快/更好)?
例如
比较(一个人为的例子)
case {Size > 100000, Type} of
{true, ets } ->
%% Do something to convert to dets
something;
{false, dets} ->
%% do something to convert to ets
somethingelse;
_ ->
ignoreit
end;
Run Code Online (Sandbox Code Playgroud)
同
...
maybeChangeStorage(Size, Type)
...
maybeChangeStorage(Size, ets) when Size > 10000 ->
something;
maybeChangeStorage(Size, dets) when Size < 10000 ->
somethingelse;
maybeChangeStorage(_,_) ->
ignoreit.
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,我更喜欢后者,但我对其他观点感兴趣.
我的应用程序在erlang集群中运行 - 通常有两个或更多节点.节点之间有活跃的监控(使用erlang:monitor_node)工作正常 - 我可以检测并响应已启动的节点现在已关闭的事实.
但是,我如何才能发现该节点已重新启动并重新开始运营?我当然可以定期ping节点直到它重新启动,但有没有更好的方法让我错过了?流程组是实现这一目标的更好方法吗?
(已编辑添加)
我认为执行像选举主管这样的技术的答案是我缺少的思考过程.我会调查并将此问题标记为已完成....
我有一个Arduino应用程序(实际上是一个库),其中包含许多状态标志 - 最初我只是将它们声明为int(在这种情况下,uint8_t为8位无符号字符).但我可以将它们全部合并为一个整数,并使用位掩码操作来设置和测试状态.
前者的一个例子:
if (_shift == HIGH)
{
_shift = LOW;
}
else
{
_shift = HIGH;
}
Run Code Online (Sandbox Code Playgroud)
后者的一个例子
#define SHIFT_BIT 0
if (bitRead(_flags, SHIFT_BIT) == HIGH)
{
bitWrite(_flags, SHIFT_BIT, LOW);
}
else
{
bitWrite(_flags, SHIFT_BIT, HIGH);
}
Run Code Online (Sandbox Code Playgroud)
前者读得更好,但后者更有效(空间和时间).在这种情况下,空间和时间效率是否总能获胜?或者这是一种只在需要时才会发生的优化?
(添加)
为了完整性,这里是bitWrite等宏的接线定义:
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
Run Code Online (Sandbox Code Playgroud)