C++ 如何提取要在屏幕上显示的信息?
我正在编写一个应用程序,要求我将信息写入TFT显示器(有点像gameboy显示器)。 我正在逐行将信息输出到显示器。我现在这样做的方式要求我对每个不同的屏幕都有一个功能。 比如: 每个功能都遵循以下逻辑:C++ 如何提取要在屏幕上显示的信息?,c++,architecture,abstraction,reusability,C++,Architecture,Abstraction,Reusability,我正在编写一个应用程序,要求我将信息写入TFT显示器(有点像gameboy显示器)。 我正在逐行将信息输出到显示器。我现在这样做的方式要求我对每个不同的屏幕都有一个功能。 比如: 每个功能都遵循以下逻辑: void displaWelcomeMessage() { writeline(0, "Hi David"); writeline(1, "Welcome"); writeline(2, "Back!"); } 问题:我讨厌每个屏幕都有不同的功能。它根本不可伸缩,想象一下如果我有
void displaWelcomeMessage()
{
writeline(0, "Hi David");
writeline(1, "Welcome");
writeline(2, "Back!");
}
问题:我讨厌每个屏幕都有不同的功能。它根本不可伸缩,想象一下如果我有500个不同的屏幕。
如何将写入显示器的过程抽象化?因此,我最终得到了一个通用函数,负责向显示器写入数据
多谢各位
更新 按照“无用”和Michael.p的建议,我最终可能会做的是将每条消息的格式存储在一个文件中: DisplayMessages.cfg 在代码中,我将执行以下操作:
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++;
}
}
使用Message=std::vector;
无效登录(){
//做些事情。。。
Q弦线
消息Welcome消息;
line=getMessageStructureFromCfg(“欢迎您的消息”\u 1”).arg(用户名);//加载“Hi%name”,并用用户名的内容替换%name
welcomeMessage.pushBack(行);//将第一行推送到welcomeMessage
line=getMessageStructureFromCfg(“欢迎_消息_2”);//加载“欢迎”
welcomeMessage.pushBack(行);//将第二行推送到welcomeMessage
line=getMessageStructureFromCfg(“欢迎消息”\u 3”);//加载“返回!”
welcomeMessage.pushBack(行);//将第三行推送到welcomeMessage
显示消息(welcomeMessage);
}
无效显示消息(消息常量和消息){
int i=0;
用于(自动和联机:msg){
写线(i,行);
i++;
}
}
谢谢大家的帮助
PS:如果包含消息结构的文件使用JSON而不是纯文本,则可以进行进一步的改进。这样,您就可以迭代每条消息的子成员(行)并相应地进行处理
如何提取要在屏幕上显示的信息
与提取任何信息的方式相同——将数据从代码中移出并放入数据结构中
displayXMessage()
函数对固定的硬编码字符串文本序列执行固定的调用序列。因此,通过将数据作为参数传递,以通常的方式将算法与数据分离:
using Message = std::vector<std::pair<int, std::string>>;
void displayMessage(Message const &msg) {
for (auto &line : msg) {
writeline(line.first, line.second);
}
}
我认为通过学习设计模式,您将找到解决所有此类问题的方法。尤其是在这种情况下。似乎就是你要找的;然后,您必须选择最适合您尝试执行的模式。在任何情况下,您都可以在许多函数(方法)或许多类中编写代码,但您可以定义一个接口(纯虚拟类)调用
Displayer
,其中包含一个方法,例如:display
,然后在许多类中实现它,例如:WelcomeMessageDisplayer
,“InsertCoinMessageDisplayer”。。。然后您将所有对象视为Displayer
。问题是,目前我有50条不同的显示消息(50种不同的功能)。这意味着我将有50个不同的班级。必须有更好的方法才能做到这一点。你能把这些信息存储在一个文件中吗?然后你可以把它们放进一个向量中,然后根据需要迭代它们,我喜欢这个想法。这样,我就不必为每条消息设置一个函数(或为每条消息设置一个类)。我更新了我的帖子,你仍然有一些交错的数据和逻辑(getMessageStructureFromCfg
/push_-back
行)。你的目标可能是只通过fetchAndDisplay(“欢迎信息”)
自动完成循环。有人能解释一下为什么投票失败吗?设计模式正是为了解决这类问题而设计的,比如类指数多重性等等。它为一个常见问题提供了一个适应性强的解决方案。可能是因为设计模式不应该帮助您设计代码:它们应该帮助您描述和传达您提出的设计。它们是通用解决方案的名称,而不是要遵循的配方。进一步思考(尽管我没有投反对票),我看不出结构模式在这里有什么相关性。这实际上是一个简单的代码级重构,而不是一个体系结构。你是对的,尽管我仍然认为这些非常常见的解决方案显然适合他的问题以及他可能遇到的任何类似问题。因此,在我看来,学习这些名称和模式的描述可能会帮助他更好地理解如何进行抽象,并为他提供工具来改进构建代码的方式。我承认这可能会深入到一个简单的问题的答案。它不一定太深,我只是认为这是错误的方法。模式提供了一种命名解决方案的语言,但您仍然需要首先解决问题。非常喜欢您的方法!非常感谢。请看我的更新
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++;
}
}
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);