什么是硬编码

2023-09-21 17:09:48

2023年9月21日,周四下午

昨天在某个地方看到了“硬编码”,当时不明白是什么意思,于是今天就研究了一下


目录


硬编码

定义

"硬编码"(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;
}

总结

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


再思考

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

更多推荐

MySQL 索引(一)

1.数据访问方式在MySQL中,通常有两种方式访问数据库表的行数据:顺序访问和索引访问。1.1.顺序访问顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。实现比较简单,但是当表中有大量数据的时候,效率非常低下。1.2.索引访问索引访问是通过遍历索引来直接访问表中记录行的方式。索

简单的手机电脑无线传输方案@固定android生成ftp的IP地址(android@windows)

文章目录abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法手机浏览电脑文件公网局域网everythingpythonhttp.server高级:固定android设备IP准备检查模块是否生效windows访问ftp服务器快捷方式命令行方式双击启动方式普通快捷方式映射新的网络位

[TI] [Textual Inversion] An image is worth an word

自己的理解:根据几个图像,找出来一个关键字可以代表它们,然后我们可以再用这个关键字去生成新的东西。提出关键字1Introductionword->token->embeddingTextualInversion过程需要:①afixed,pre-trainedtext-to-imagemodel(一个固定的预训练模型)②

网络安全(黑客)自学

前言我是去年8月22日才正式学习网络安全的,因为在国营单位工作了4年,在广东一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才24周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,一

Java版本spring cloud + spring boot企业电子招投标系统源代码

项目说明随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化平台提高招投标工作的公开性和透明性;通过电子化招投标,使得招标采购的质量更高、速度

竞赛选题 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录0前言1背景2算法原理2.1动物识别方法概况2.2常用的网络模型2.2.1B-CNN2.2.2SSD3SSD动物目标检测流程4实现效果5部分相关代码5.1数据预处理5.2构建卷积神经网络5.3tensorflow计算图可视化5.4网络模型训练5.5对猫狗图像进行2分类6最后0前言🔥优质竞赛项目系列,今天要分享

close和fclose

在Linux系统中,close函数并不会主动调用fsync接口。close函数只是关闭了文件描述符,而不保证数据被写入到磁盘。如果你想确保数据被写入到磁盘,你需要在close函数之前调用fsync函数。这是因为Linux使用了缓存机制来提高磁盘的读写性能,当你写入数据时,数据首先被写入到缓存中,然后在适当的时候(例如缓

CCG超级标记

1.定义组合范畴语法(CombinatoryCategorialGrammar,CCG)是一种用于自然语言语法分析的语言学理论和计算模型。它是一种形式文法,旨在描述句子的结构和语法规则(通过简练的描述形式表现出句子中各成分的句法语义关系)。CCG的关键思想是使用组合范畴(category)来表示词汇和短语的语法信息,然

【强化学习】01—— 强化学习简介

文章目录两种机器学习类型强化学习定义强化学习交互过程强化学习系统要素历史(History)状态(State)策略(Policy)奖励(Reward)价值函数(ValueFunction)模型(Model)迷宫例子强化学习智能体分类参考两种机器学习类型监督学习/无监督学习/强化学习/机器学习之间的关系预测根据数据预测所需

Rocketmq--消息发送和接收演示

使用Java代码来演示消息的发送和接收<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.2</version></dependency>1

服务器搭建(TCP套接字)-基础版(客户端)

一、socket1.1、vimman查看socket:!mansocket1.2、依赖的头文件#include<sys/types.h>#include<sys/socket.h>1.3、原型intsocket(intdomain,inttype,intprotocol);domain说明AF_INETIPV4协议AF

热文推荐