我正在开发一个处理不同状态的恒温器固件,一个OLED,并对一些按钮做出反应,以及其他任务。
我设法以我非常满意的方式绑定OLED视图,加热器状态和按钮,使用回调取决于我的状态。例如:
static PushButtonState pb_state = PB_LONG_CLICK_CONFIRMED;
...
state_current->click_callback(pb_state);
state_current->oled_update();
state_current
是:
typedef struct {
VoidCallback thermo_logic;
VoidCallback oled_update;
ClickCallback click_callback;
} StateFunctions;
StateFunctions state_time_to_off {
ThermoLogicTimeToOff,
OledUpdateTimeToOff,
ClickTimeToOff
};
StateFunctions *state_current = &state_time_to_off;
使用这种方法,我避免在代码周围切换外壳,以了解当前状态。
最后,我有ClickTimeToOff
的以下代码:
void ClickTimeToOff(PushButtonState click_type) {
if (click_type == PB_SHORT_CLICK_CONFIRMED) {
td.remaining_time_s += TIME_INCREMENT1_S;
if (td.remaining_time_s > TIME_TO_OFF_MAX_S) {
td.remaining_time_s = TIMER_DISABLED;
}
} else if (click_type == PB_LONG_CLICK_CONFIRMED) {
oled.clear();
SetThermoState(&state_time_to_on);
} else if (click_type == PB_VERYLONG_CLICK_CONFIRMED) {
/* TBD */
} else {
/* Nothing */
}
}
可以轻松地将其拆分为3个单独的函数,而不是click_callback
,以short_click_callback
,long_click_callback
和verylong_click_callback
。
我这样做是为了遵循Write Short Functions指南,但我开始觉得我的代码太过分散了。在一个相对较小的项目中有近30个功能。
关于小功能应该如何,是否有任何经验法则?如果使用这种回调机制,我应该避免什么?
很抱歉,如果这个问题过于宽泛,但我一直在徘徊,我虽然可以在这里找到答案。