Preface
At the beginning of programming , There are often situations where different functions are performed according to different conditions , It's usually done with if-else perhaps switch-case The way , If there are many situations to distinguish , There will be many else if perhaps case Code processing , After the whole function is realized , At first glance, the code may have a lot of else if perhaps case, To avoid that , This part introduces a development method -- Table drive method .
The table driven method is a way for you to find information in a table , Instead of using logical statements (if or case) The way to find them out . in fact , Any information can be picked from the table . In the simple case , Logical statements tend to be simpler and more direct . But with the complexity of the logical chain , The watch becomes more and more attractive . The point of table driven programming is The separation of logic and data .
It can be simply understood that different data are processed in the same way , The table driven method has the following characteristics :
- High readability , The data processing flow is clear at a glance .
- Easy to maintain , Just add 、 Delete the data index and method to realize the function .
- To streamline the code , Reduce cycle complexity . Reduce if-else、switch-case Use .
- To some extent, it can improve the running speed of the program .
Realization
First , Take a simple example , No table driven code , Get the string according to the input number .
void GetTimeString(int weak, char *pszTime)
{
if (weak == 1)
{
sprintf(pszTime, " Monday ");
}
else if (weak == 2)
{
sprintf(pszTime, " Tuesday ");
}
else if (weak == 3)
{
sprintf(pszTime, " Wednesday ");
}
else if (weak == 4)
{
sprintf(pszTime, " Thursday ");
}
else if (weak == 5)
{
sprintf(pszTime, " Friday ");
}
else if (weak == 6)
{
sprintf(pszTime, " Saturday ");
}
else if (weak == 7)
{
sprintf(pszTime, " Sunday ");
}
else
{
sprintf(pszTime, " Unknown ");
}
}
After using the table driven method , The code is streamlined , Readability enhancements (if-else Too much will cause the screen not to see at a glance ), And to a certain extent, it improves the running speed of the program ( if 7 You don't need to do it many times if Judge )
void GetTimeString(int weak, char *pszTime)
{
const char *arrpszTime[7] = {" Monday ", " Tuesday ", " Wednesday ", " Thursday ", " Friday ", " Saturday ", " Sunday "};
if (weak >= 1 && weak <= 7)
{
sprintf(pszTime, "%s", arrpszTime[weak - 1]);
}
else
{
sprintf(pszTime, " Unknown ");
}
}
Applicable scenario
After learning simple table driven programming , But in the actual development, I still don't know under what circumstances , So when is it suitable for table driven development ?
1、 Common are driver development , For example, multiple identical driver chips are used , But the pins are different , Maybe some people debug one of the drivers , Will copy a copy and then modify the pin, etc , This is undoubtedly a waste Flash Space , At this time, the table drive mode is used to take the pins as data , Drive as logic , Use only one driver code , It can infinitely expand multiple driver chips .
2、EEPROM Data processing , Usually include address 、 Data values 、 Maximum 、 Minimum and default values, etc , The way they handle it is the same , The data to be saved can be made into an array table , Process this data through the same function .
3、 Key 、 menu 、LED And other modules can be processed in a table driven way , For example, the key will pin 、 Press level 、 Current status, etc. as data , The menu takes each option, function pointer, etc. as data .
4、 Other situations that can be converted into data after thinking .
Code reference :
Key :https://gitee.com/const-zpc/FML_KEY.git( Key management table , Contains pins 、 Press level 、 Current status, etc )
menu :https://gitee.com/const-zpc/menu.git( Menu options table , Contains the name of the menu option 、 Sub menu 、 A function pointer 【 Subsequent actions 】 etc. )
OLED:https://gitee.com/const-zpc/STM32_OLED.git ( Font data sheet , Include font index 、 Font data, etc )
ESP8266:https://gitee.com/const-zpc/esp8266.git (AT Instruction data sheet , Contains instructions 、 Expected response 、 Time and function pointers 【 Subsequent actions 】 etc. )