什么是硬编码

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 
#include 

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 
#include 

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 

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;
}

总结

相比硬编码,更好的编程实践是将这些值作为配置项或参数传递给代码,使其更具灵活性和可配置性。这样可以避免在修改这些值时需要修改源代码,而只需修改配置文件或参数即可。这样使得代码更易于维护、测试和部署。


再思考

为什么不推荐使用硬编码?因为如果你把写好的有硬编码的程序交给客户,那么当客户想修改程序的一些设置时就需要去动源代码才能修改,一般来说不会提供源码给客户,就算提供源码给客户,客户也要花很大的精力才能找到相应的源代码,而且客户还可能会因为对源码不熟悉而改错。

你可能感兴趣的:(我的博客,开发语言,c++)