2023年9月21日,周四下午
昨天在某个地方看到了“硬编码”,当时不明白是什么意思,于是今天就研究了一下
目录
- 硬编码
- 定义
- 缺点
- 举例说明什么是硬编码
- 1. 直接在代码中写入文件路径:
- 2. 在代码中直接指定常量值:
- 3. 将固定的字符串直接嵌入到代码中:
- 正确的做法
- 1. 使用配置文件:
- 2. 使用环境变量:
- 3. 使用命令行参数:
- 4. 使用配置管理工具:
- 举例说明
- 1、使用配置文件:
- 2、使用环境变量:
- 3、使用命令行参数:
- 总结
硬编码
定义
"硬编码"(hardcoding)是一种将值或参数直接写入代码中的做法,而不是将其作为可配置或可变的变量或参数。这意味着在编写代码时,将常量值直接嵌入到代码中,而不是以某种可配置或可变的方式来引用它。
缺点
硬编码通常被认为是一种不好的编程实践,因为它会导致代码的可维护性和可扩展性受到影响。当需要更改这些值时,必须直接修改源代码,这可能会导致代码变得脆弱并引入错误。
举例说明什么是硬编码
以下是一些常见的硬编码示例:
1. 直接在代码中写入文件路径:
std::string filePath = "/path/to/file.txt";
2. 在代码中直接指定常量值:
int timeout = 3000;
3. 将固定的字符串直接嵌入到代码中:
printf("Hello, World!");
正确的做法
正确的方法是避免硬编码,而是使用配置文件、环境变量或其他外部参数来存储这些值。这样做可以使代码更加灵活和可配置,提高代码的可维护性和可扩展性。
以下是几种常见的替代硬编码的方法:
1. 使用配置文件:
将常量值或固定参数存储在配置文件中,并在代码中读取这些值。这样,在需要修改这些值时只需更新配置文件,而不需要修改代码。常见的配置文件格式有INI、JSON、YAML等。
2. 使用环境变量:
将常量值存储在环境变量中,并在代码中读取这些变量。通过设置环境变量,可以在不修改代码的情况下更改这些值。在不同的环境中,可以为相同的代码使用不同的环境变量值。
3. 使用命令行参数:
将需要配置的值作为命令行参数传递给代码。这样,当运行程序时,可以通过命令行参数传递相应的值,而不必硬编码到代码中。
4. 使用配置管理工具:
使用专门的配置管理工具(例如Spring Boot的属性文件、Django的设置文件等)来管理应用程序的各种配置项。这些工具使得配置值的管理更加方便和灵活。
通过使用这些方法,可以将常量值和固定参数与代码分离,提高代码的可维护性和可配置性。这样,在需要更改这些值时,只需修改配置文件、环境变量或命令行参数,而不需要修改源代码。
举例说明
1、使用配置文件:
可以使用 C++ 的文件读取和解析功能来读取配置文件。例如,使用标准库中的 ifstream 类来读取文件,并通过解析文件中的内容来获取配置参数。这样,你可以将常量值或固定参数存储在配置文件中,并在代码中使用这些参数。
#include <fstream>
#include <string>int main() {std::ifstream configFile("config.txt");if (configFile.is_open()) {std::string parameter;// 逐行读取配置文件while (getline(configFile, parameter)) {// 处理读取到的参数// ...}configFile.close();}// 其他代码逻辑// ...return 0;
}
2、使用环境变量:
你可以使用 C++ 的 getenv 函数来读取环境变量的值,并在代码中使用这些变量。通过设置环境变量,可以在不同的环境中使用不同的变量值。
#include <iostream>
#include <cstdlib>int main() {const char* parameter = std::getenv("PARAMETER");if (parameter != nullptr) {// 使用环境变量的值std::cout << "The value of PARAMETER is: " << parameter << std::endl;}// 其他代码逻辑// ...return 0;
}
3、使用命令行参数:
使用 C++ 的 argc 和 argv 参数,你可以从命令行传递参数给程序,并在代码中使用这些参数。
#include <iostream>int main(int argc, char* argv[]) {if (argc > 1) {// 使用命令行参数的值std::cout << "The value of the first command line argument is: " << argv[1] << std::endl;}// 其他代码逻辑// ...return 0;
}
总结
相比硬编码,更好的编程实践是将这些值作为配置项或参数传递给代码,使其更具灵活性和可配置性。这样可以避免在修改这些值时需要修改源代码,而只需修改配置文件或参数即可。这样使得代码更易于维护、测试和部署。