我正在尝试创建一个菜单概念,稍后可以在 8 位 MCU 和 2x16 LCD 显示屏上使用。这意味着我无法使用向量或其他奇特的库,而且我想避免动态分配一些内存。
这个想法是让代码反映菜单结构。这个概念应该适用于深度为 3 到 4 层的菜单。
菜单结构示例:
- Display
`-> Brightness
`-> Back
`-> Config
- Effects
`-> Static Light
`-> Back
`-> Start
`-> Stop
`-> Pulsing Light
`-> Back
`-> Start
`-> Stop
- Games
`-> Snake
`-> Back
`-> Play
`-> TicTacToe
`-> Back
`-> Play
我想如何构建它(可能这就是另一种语言的方式):
class IPageView {}
class NavViewPage : IPageView {
public:
NavigationViewPage(const char* title, const IViewPage* pages[]);
}
void main() {
NavViewPage masterPage = NavViewPage("Master", (const IViewPage*[]){
&NavViewPage("Display", (const IViewPage*[]){
&NavViewPage("Brightness", (const IViewPage*[]){
&NavViewPage("Back", (const IViewPage*[]){}),
&NavViewPage("Config", (const IViewPage*[]){})
})
}),
&NavViewPage("Effects", (const IViewPage*[]){
&NavViewPage("Static Light", (const IViewPage*[]){}),
&NavViewPage("Pulsing Light", (const IViewPage*[]){})
}),
&NavViewPage("Games", (const IViewPage*[]){
&NavViewPage("Snake", (const IViewPage*[]){}),
&NavViewPage("TicTacToe", (const IViewPage*[]){})
})
});
return 0;
}
希望你明白了。单独初始化每个对象,然后将它们传递给它们的父对象会降低可读性/减少菜单结构的概述(这样我在我的原型中使用它,并且已经感觉有点难以保持菜单结构的概述) .
我知道,如果菜单有更多的深度或更多的元素,上面的方法也会变得一团糟,但仍然有可能分割一些菜单元素并单独初始化它们(我会用完在菜单变得复杂之前闪存和 RAM 内存:D).
我也已经考虑过可变参数函数(我的意思是,如果“avr-gcc”不支持它们,我仍然可以创建多个接受 1、2、3 或 4 个对象的构造函数)。但我不确定这是否是在代码中实现草图结构的更好或唯一方法。
最后的问题是:你知道我有什么可能性来解决这个问题吗?目标是编写菜单结构易于理解、易于维护且内存使用相对较少的代码。
不要过分评价我。 C++ 不是我的主要语言,所以我每周只能使用 C++ 几个小时 :P
好吧,到目前为止我还没有找到任何好的解决方案,所以我想我会采用以下解决方案:
void staticLightEffectAction(uint8_t action);
void pulsingLightEffectAction(uint8_t action);
void changeDisplayBrightnessAction(uint8_t brightness);
namespace viewPagesConf {
namespace mainSubs {
namespace displaySubs {
NavViewPage brightnessConfig = NavViewPage(changeDisplayBrightnessAction);
}
NavViewPage display = NavViewPage("Display", (IViewPage*[]){
&displaySubs::brightnessConfig,
nullptr
});
namespace effectsSubs {
StartStopViewPage staticLight = StartStopViewPage("Static Light", staticLightEffectAction);
StartStopViewPage pulsingLightLight = StartStopViewPage("Pulsing Light", pulsingLightEffectAction);
}
NavViewPage effects = NavViewPage("Effects", (IViewPage*[]){
&effectsSubs::staticLight,
&effectsSubs::pulsingLightLight,
nullptr
});
namespace gamesSubs {
StartStopViewPage snake = StartStopViewPage("Snake");
StartStopViewPage ticTacToe = StartStopViewPage("TicTacToe");
}
NavViewPage games = NavViewPage("Games", (IViewPage*[]){
&gamesSubs::snake,
&gamesSubs::ticTacToe,
nullptr
});
}
NavViewPage master = NavViewPage("Master", (IViewPage*[]){
&mainSubs::display,
&mainSubs::effects,
&mainSubs::games,
nullptr
});
}
IViewPage* currentPage = &viewPagesConf::master;
我不知道这种结构是否会降低可读性,但这是迄今为止我得到的最好的结构。命名空间应该避免当菜单深度增加时变量名称变大