代码应该是多少例程碎片?

时间:2018-01-30 17:31:56

标签: c++ arduino generic-programming

我正在开发一个处理不同状态的恒温器固件,一个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_callbacklong_click_callbackverylong_click_callback

我这样做是为了遵循Write Short Functions指南,但我开始觉得我的代码太过分散了。在一个相对较小的项目中有近30个功能。

关于小功能应该如何,是否有任何经验法则?如果使用这种回调机制,我应该避免什么?

很抱歉,如果这个问题过于宽泛,但我一直在徘徊,我虽然可以在这里找到答案。

0 个答案:

没有答案