什么是硬编码

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js的服务器端渲染(SSR):为什么和如何

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

开户期权必看!期权有什么好的平台,优势在哪里?

有50W满足上述期权开户条件的可以选择在证券或者期货券商端口开通,不过都只能线下去柜台营业部开通。不满足可以选择第三方期权分仓开户,下文介绍开户期权必看&#xff01;期权有什么好的平台&#xff0c;优势在哪里&#xff1f;本文来自&#xff1a;期权酱 一、开户期权基础知…

js中如何实现一个简单的防抖函数?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 防抖函数⭐ 使用示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

并发编程——Future CompletableFuture

文章目录 Future介绍FutureTask使用FutureTask 分析CompletableFutureCompletableFuture的应用CompletableFuture 示例 总结 Future介绍 Java创建线程的方式&#xff0c;一般常用的是Thread&#xff0c;Runnable。如果需要当前处理的任务有返回结果的话&#xff0c;需要使用Ca…

Linux——(第十一章)软件包管理

目录 一、RPM 1.概述 2.RPM查询指令 3.RPM卸载指令 4.RPM安装命令 二、YUM 1.概述 2.YUM常用命令 一、RPM 1.概述 RPM&#xff08;RedHat Package Manager&#xff09;&#xff0c;RedHat软件包管理工具&#xff0c;类似windows里面的setup.exe是Linux这系列操作系统里…

Hadoop初识及信息安全(大数据的分布式存储和计算平台)

目录 什么是Hadoop Hadoop的特点 Hadoop优点 Hadoop的缺点 Hadoop的重要组成 信息安全 什么是Hadoop Hadoop 是一个适合大数据的分布式存储和计算平台。 Hadoop的广义和狭义区分&#xff1a; 狭义的Hadoop:指的是一个框架&#xff0c;Hadoop是由三部分组成&#xff1a;H…

机器视觉-标定篇

3D结构光标定 结构光视觉的优点&#xff1a; 非接触、信息量大、测精度高、抗干扰能力强。 结构光视觉传感器参数的标定包括&#xff1a;摄像机参数标定、结构光平面参数标定。 结构光视觉测量原理图 我们不考虑镜头的畸变&#xff0c;将相机的成像模型简化为小孔成像模型…

ClickHouse面向列的数据库管理系统(原理简略理解)

目录 官网 什么是Clickhouse 什么是OLAP 面向列的数据库与面向行的数据库 特点 为什么面向列的数据库在OLAP场景中工作得更好 为什么ClickHouse这么快 真实的处理分析查询 OLAP场景的关键属性 引擎作用 ClickHouse引擎 输入/输出 CPU 官网 https://clickhouse.com…

Flink-CDC 抽取SQLServer问题总结

Flink-CDC 抽取SQLServer问题总结 背景 flink-cdc 抽取数据到kafka 中&#xff0c;使用flink-sql进行开发&#xff0c;相关问题总结flink-cdc 配置SQLServer cdc参数 1.创建CDC 使用的角色, 并授权给其查询待采集数据数据库 -- a.创建角色 create role flink_role;-- b.授权…

Direct3D融合技术

该技术能使我们将当前要进行光栅化的像素的颜色与先前已已光栅化并处于同一位置的像素的颜色进行合成&#xff0c;即将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成(混合)&#xff0c;利用该技术我们可得到各种各样的效果&#xff0c;尤其是透明效果。 在融合…

zookeeper未授权漏洞复现及处理

一、漏洞详情 Zookeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服…

华为云云耀云服务器L实例评测|云耀云服务器L实例的购买及使用体验

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例的购买及使用体验 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、云耀云服务器L实例支持的镜像2.1 镜像类型2.2 系统镜像2.3 应用镜像 三、购买云…

前端悬浮菜单的实现方法及完整代码示例

前言 悬浮菜单作为网页设计中常见的交互元素&#xff0c;通常被用于展示常用功能或导航链接。 在前端开发领域中&#xff0c;我们可以利用纯CSS技术实现一个简单的悬浮菜单。 本文将详细介绍实现悬浮菜单的方法&#xff0c;并提供一个完整的代码示例。 实现方法 要实现一个悬浮…

nginx中的location指令用法

在Nginx中&#xff0c;location指令用于定义如何处理特定类型的请求。它通常用于定义不同的URL匹配规则和相应的处理方式。 以下是location指令的一般用法 location [|~|~*|^~] /uri/ {# 处理指令 }&#xff1a;表示精确匹配。只有当请求的URL与指定的URL完全匹配时&#xff…

docker学习:dockerfile和docker-compose

学习如何使用dockerfile 以下内容&#xff0c;部分来自gpt生成&#xff0c;里面的描述可能会出现问题&#xff0c;但代码部分&#xff0c;我都会进行测试。 1. 需求 对于一个docker&#xff0c;例如python&#xff0c;我们需要其在构建成容器时&#xff0c;就有np。有以下两种方…

Qt重写QTreeWidget实现拖拽

介绍 此文章记录QTreeWidget的重写进度&#xff0c;暂时停滞使用&#xff0c;重写了QTreeWidget的拖拽功能&#xff0c;和绘制功能&#xff0c;自定义了数据结构&#xff0c;增加复制&#xff0c;粘贴&#xff0c;删除&#xff0c;准备实现动态刷新数据支持千万数据动态刷新&a…

Prometheus-Rules 实战

文章目录 1 node rules2 nginx rule2.1 Nginx 4xx 错误率太多2.2 Nginx 5xx 错误率太多2.3 Nginx 延迟高 3 mysql rule3.1 MySQL 宕机3.2 实例连接数过多3.3 MySQL高线程运行3.4 MySQL 从服务器 IO 线程没有运行3.5 MySQL 从服务器 SQL 线程没有运行3.6 MySQL复制滞后3.7 慢查询…

天津专升本文化课考试计算机应用基础考试大纲(2023年9月修订)

天津市高等院校“高职升本科”招生统一考试计算机应用基础考试大纲&#xff08;2023年9月修订&#xff09; 一、考试性质 天津市高等院校“高职升本科”招生统一考试是由合格的高职高专毕业生参加的选拔性 考试。高等院校根据考生的成绩&#xff0c;按照已确定的招生计划&am…

transformer系列2---transformer架构详细解析

transformer详细解析 Encoder1 输入1.1 Embedding 词嵌入1.1.1 Embedding 定义1.1.2 几种编码方式对比1.1.3 实现代码 1.2 位置编码1.2.1 使用位置编码原因1.2.2 位置编码方式1.2.3 位置编码代码 2 注意力 Attention2.1 自注意力self-attention2.1.1 QKV含义2.1.2 自注意力公式…

Innodb底层原理与Mysql日志机制

MySQL内部组件结构 Server层 主要包括连接器、词法分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&#xff0c;所有跨存储引擎的功能都在这一层实现&#xff0c…