您如何抽象要在屏幕上显示的信息?
How do you abstract the information to be displayed in a screen?
我正在编写一个应用程序,需要我将信息写入 TFT 显示器(有点像 gameboy 显示器)。
我正在逐行将信息输出到显示器。我现在做这件事的方式要求我为每个不同的屏幕都有一个功能。
喜欢:
void displayWelcomeMessage();
void displayInsertCoinMessage();
void displayGoodByeMessage();
每个函数都遵循以下逻辑:
void displaWelcomeMessage()
{
writeline(0, "Hi David");
writeline(1, "Welcome");
writeline(2, "Back!");
}
问题:我讨厌每个屏幕都有不同的功能。它根本不可扩展,想象一下如果我有 500 个不同的屏幕。
如何抽象写入显示器的过程?这样我就得到了一个负责写入显示器的通用函数。
谢谢
更新
根据 "Useless's" 和 Michael.P 的建议,我最终可能要做的是将每条消息的格式存储在一个文件中:
DisplayMessages.cfg
WELCOME_MESSAGE_1 = "Hi %name"
WELCOME_MESSAGE_2 = "Welcome"
WELCOME_MESSAGE_3 = "back!"
在代码中我会做类似的事情:
using Message = std::vector<QString>;
void login(){
//Do Stuff...
QString line
Message welcomeMessage;
line=getMessageStructureFromCfg("WELCOME_MESSAGE_1").arg(userName); // loads "Hi %name" and replaces %name with the content of userName
welcomeMessage.pushBack(line); // pushes the first line to welcomeMessage
line=getMessageStructureFromCfg("WELCOME_MESSAGE_2"); // loads "Welcome"
welcomeMessage.pushBack(line); // pushes the second line to welcomeMessage
line=getMessageStructureFromCfg("WELCOME_MESSAGE_3"); // loads "back!"
welcomeMessage.pushBack(line); // pushes the third line to welcomeMessage
displayMessage(welcomeMessage);
}
void displayMessage(Message const &msg) {
int i = 0;
for (auto &line : msg) {
writeline(i, line);
i++;
}
}
谢谢大家的帮助!
PS:如果包含消息结构的文件使用 JSON 而不是纯文本,则可以进行进一步的改进。这样你就可以迭代每条消息的子成员(行)并相应地处理
How do you abstract the information to be displayed in a screen?
与抽象任何信息的方式相同 - 将数据从代码中移出并放入数据结构中。
您的 displayXMessage()
函数对固定序列的硬编码字符串文字执行固定序列的调用。因此,通过将数据作为参数传递,以通常的方式将算法从数据中分离出来:
using Message = std::vector<std::pair<int, std::string>>;
void displayMessage(Message const &msg) {
for (auto &line : msg) {
writeline(line.first, line.second);
}
}
并使用适当的数据调用它:
Message welcomeMsg { {0, "Hi David"},
{1, "Welcome"},
{2, "Back!"}
};
displayMessage(welcomeMsg);
我认为您会通过学习设计模式找到所有这些问题的解决方案。在这种情况下尤其如此。 Strucural patterns 好像是你要找的;然后你将不得不选择最适合你正在尝试做的模式。
我正在编写一个应用程序,需要我将信息写入 TFT 显示器(有点像 gameboy 显示器)。 我正在逐行将信息输出到显示器。我现在做这件事的方式要求我为每个不同的屏幕都有一个功能。 喜欢:
void displayWelcomeMessage();
void displayInsertCoinMessage();
void displayGoodByeMessage();
每个函数都遵循以下逻辑:
void displaWelcomeMessage()
{
writeline(0, "Hi David");
writeline(1, "Welcome");
writeline(2, "Back!");
}
问题:我讨厌每个屏幕都有不同的功能。它根本不可扩展,想象一下如果我有 500 个不同的屏幕。 如何抽象写入显示器的过程?这样我就得到了一个负责写入显示器的通用函数。
谢谢
更新
根据 "Useless's" 和 Michael.P 的建议,我最终可能要做的是将每条消息的格式存储在一个文件中:
DisplayMessages.cfg
WELCOME_MESSAGE_1 = "Hi %name"
WELCOME_MESSAGE_2 = "Welcome"
WELCOME_MESSAGE_3 = "back!"
在代码中我会做类似的事情:
using Message = std::vector<QString>;
void login(){
//Do Stuff...
QString line
Message welcomeMessage;
line=getMessageStructureFromCfg("WELCOME_MESSAGE_1").arg(userName); // loads "Hi %name" and replaces %name with the content of userName
welcomeMessage.pushBack(line); // pushes the first line to welcomeMessage
line=getMessageStructureFromCfg("WELCOME_MESSAGE_2"); // loads "Welcome"
welcomeMessage.pushBack(line); // pushes the second line to welcomeMessage
line=getMessageStructureFromCfg("WELCOME_MESSAGE_3"); // loads "back!"
welcomeMessage.pushBack(line); // pushes the third line to welcomeMessage
displayMessage(welcomeMessage);
}
void displayMessage(Message const &msg) {
int i = 0;
for (auto &line : msg) {
writeline(i, line);
i++;
}
}
谢谢大家的帮助!
PS:如果包含消息结构的文件使用 JSON 而不是纯文本,则可以进行进一步的改进。这样你就可以迭代每条消息的子成员(行)并相应地处理
How do you abstract the information to be displayed in a screen?
与抽象任何信息的方式相同 - 将数据从代码中移出并放入数据结构中。
您的 displayXMessage()
函数对固定序列的硬编码字符串文字执行固定序列的调用。因此,通过将数据作为参数传递,以通常的方式将算法从数据中分离出来:
using Message = std::vector<std::pair<int, std::string>>;
void displayMessage(Message const &msg) {
for (auto &line : msg) {
writeline(line.first, line.second);
}
}
并使用适当的数据调用它:
Message welcomeMsg { {0, "Hi David"},
{1, "Welcome"},
{2, "Back!"}
};
displayMessage(welcomeMsg);
我认为您会通过学习设计模式找到所有这些问题的解决方案。在这种情况下尤其如此。 Strucural patterns 好像是你要找的;然后你将不得不选择最适合你正在尝试做的模式。