首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >硬编码和魔法值之间的区别

硬编码和魔法值之间的区别

作者头像
小锋学长生活大爆炸
发布于 2021-06-11 10:34:56
发布于 2021-06-11 10:34:56
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

以前被称为每日WTF的网站有一篇题为“软编码”的文章,其中包含以下摘录:

大多数程序员认为“硬编码”是一件坏事:它是一种类似黑客的、不优雅的、全面的惰性代码。因此,许多程序员尽其所能来避免它。不幸的是,这种回避的追求往往会导致一条更糟糕的道路:复杂、卷积和全面不可维护的代码。我喜欢把这称为软编码。 在讨论软编码的细节之前,我想简要地定义一下硬编码。它是一种将“不应该出现在源代码中的东西”直接嵌入到源代码中的实践。定义故意含糊不清:虽然大多数人都同意数据库连接字符串和日志文件目录不属于源代码,但存在许多灰色区域。以下面的代码为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void attachSupplementalDocuments()
{
  if (stateCode == "AZ" || stateCode == "TX") {
    //SR008-04X/I are always required in these states
    attachDocument("SR008-04X");
    attachDocument("SR008-04XI");
  }

  if (ledgerAmnt >= 500000) {
    //Ledger of 500K or more requires AUTHLDG-1A
    attachDocument("AUTHLDG-1A");
  }

  if (coInsuredCount >= 5  && orgStatusCode != "CORP") {
    //Non-CORP orgs with 5 or more co-ins require AUTHCNS-1A
    attachDocument("AUTHCNS-1A");
  }
}

我已经能感觉到你们中的一些人在畏缩:神奇的数字;字符串文字;哇,这可是一大堆硬编码啊!然而,在这个例子中没有一个字符是硬编码的:在上面的代码中没有“不应该在源代码中”的东西。该功能只是用非常清晰和特定的代码实现了非常清晰和特定的业务需求。少一点就会被软编码。

我认为,每日WTF扩展到描述最佳实践,而不是简单地对糟糕的代码幸灾乐祸,这是一个值得称赞的目标。我猜这是Jeff Atwood在他的《What’s Wrong With the Daily WTF》中发表的一些评论引起的。然而,我在本文中遇到的问题是,它将硬编码和使用魔法数字(或魔法字符串)之间的区别混为一谈了。

维基百科对硬编码的定义如下:

硬编码是指将输出或配置数据直接嵌入程序或其他可执行对象的源代码或数据的固定格式的软件开发实践,而不是从外部来源获取数据,或者用给定的输入在程序本身中生成数据或格式化。

例如:固定安装路径 如果一个Windows程序被编程为始终安装到C:\Program Files\Appname,而有人出于空间或组织的原因试图将它安装到不同的驱动器,它可能无法安装或在安装后运行。

例如:启动盘 一些“复制保护”程序在启动时查找软盘上的特定文件,以验证它们不是盗版。如果这台电脑被更新到一台没有软盘驱动器的新电脑上,程序就无法运行,因为软盘无法插入。

维基百科对魔法值的定义如下:

“神奇数字”这个术语也指在源代码中直接使用数字而不作解释的糟糕编程实践。在大多数情况下,这使得程序更难阅读、理解和维护。尽管大多数指南都对数字0和1做了例外,但将代码中的所有其他数字定义为命名常量是一个好主意。

这是可取的,有以下几个原因:

  • 它更容易阅读和理解。
  • 改变数字的值更容易,因为它没有冗余地重复。更改一个神奇数字的值是容易出错的,因为相同的值经常在程序的不同位置使用多次
  • 它促进了参数化。

硬编码是不好的,因为它假定应该灵活的信息实际上是固定不变的。另一方面,使用神奇数字是一个代码维护问题,这并不一定意味着程序是不灵活的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用AudioToolbox编码AAC
前言 使用VideoToolbox硬编码H.264 使用VideoToolbox硬解码H.264 这次在编码H.264视频流的同时,录制并编码AAC音频流。 介绍 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。 抽样:对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号; 量化:用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,通常是用二进制表示; 编码:用一组二进制码组来表示每
落影
2018/04/27
2.2K0
使用AudioToolbox编码AAC
动态生成key免杀
为了避免杀软检测到代码中的shellcode,可以对shellcode进行加密,执行时输入key,使用本地分离、远程加载等方式。后面几种很容易实现,效果也很好,但是操作麻烦,而且除了远程加载外都不能使用在钓鱼中;如果只用第一种方式,这种方法的好处是可以避免使用独立的程序,并且可以在不暴露key的情况下解密shellcode。不过,由于加密算法和密钥都是硬编码的,想靠加密算法如des、ase、rc4等免杀很难,它们可能会存在被杀软检测并逆推还原出原shellcode等问题。为了提高静态免杀能力,可以在运行代码时动态生成key,而不是在代码中硬编码它。
Creaper
2023/11/20
7670
动态生成key免杀
即时通讯安全篇(十五):详解硬编码密码的泄漏风险及其扫描原理和工具
密码是对服务、系统和数据的访问权限进行授权的数字身份凭证,常见的密码有API密钥、非对称私钥、访问Token等。硬编码密码(Hardcoded Secret),或称嵌入式密码(Embedded Secret),是指将密码以明文方式直接写入代码中。这种处理方式极大地提高了攻击者命中密码的概率,使服务或系统暴露在风险中,容易造成严重损失。
JackJiang
2025/02/20
3870
即时通讯安全篇(十五):详解硬编码密码的泄漏风险及其扫描原理和工具
Redis :01---Redis简介和安装
· 与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此 Redis可以满足很多的应用场景,
用户3479834
2021/02/03
3960
26 TIPS IN PYTHON
python之所以如此受欢迎的原因之一是因为它可读性和表现力强。 人们经常开玩笑说Python是“可执行伪代码”。但是,当你可以编写这样的代码时,很难用其他方式反驳:
我被狗咬了
2019/09/23
1.7K0
26 TIPS IN PYTHON
PsiXBot:模块化.NET僵尸网络的进化
本文中我们将分享我们对模块化恶意软件 PsiXBot 的分析。该恶意软件于 2017 年首次出现,最近一段时间核心代码与模块有了很大改变。其中包括键盘记录与 Outlook 和浏览器凭据窃取,随着这些新开发项目的完成以及在野观察到的第一批大规模投放,PsiXBot 已正式在恶意软件生态中崭露头角。
FB客服
2020/04/18
8360
linux常见面试题
Linux是一种基于UNIX的操作系统,最初是由Linus Torvalds引入的。它基于Linux内核,可以运行在由Intel,MIPS,HP,IBM,SPARC和Motorola制造的不同硬件平台上。Linux中另一个受欢迎的元素是它的吉祥物,一个名叫Tux的企鹅形象。
心跳包
2020/08/31
3.2K0
数据存储的趣事
随着更新、更好、更快的存储介质的到来,一个字节的数据能够以多种不同的方式进行存储。字节是数字信息的单位,通常指八位,比特位是一个信息单位,可以表示为0或1,表示逻辑状态。让我们跟随时光的脚步简单地走一走,先了解一下比特和字节的起源。
半吊子全栈工匠
2021/01/13
1.1K0
数据存储的趣事
字符集和字符编码(Charset & Encoding)
计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如’a’用什么表示,称为”编码”;反之,将存储在计算机中的二进制数解析显示出来,称为”解码”,如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致’a’解析成’b’或者乱码。
空空云
2018/09/27
2K0
字符集和字符编码(Charset & Encoding)
精述字符编码
带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK,GB18030,BIG5,BMP,Code Page,BOM,MBCS,Little Endian,Big Endian,内码,外码。
恋喵大鲤鱼
2018/08/03
1.6K0
精述字符编码
如何用WebAssembly为Web应用提速20倍
翻译:疯狂的技术宅 原文:https://www.smashingmagazine.com/2019/04/webassembly-speed-web-app/
疯狂的技术宅
2019/04/23
8810
如何用WebAssembly为Web应用提速20倍
最全Linux的发行版简介,一文读懂各发行版之间的联系和区别
发行版及版本比较 三大家族: Fedora是基于RHEL,CentOS,Scientific Linux, 和Oracle Linux的社区版本。相比RHEL,Fedora打包了显著的更多的软件包。其中一个原因是,多样化的社区参与Fedora的建设;它不只是一家公司。在这个过程中,CentOS用于活动,演示和实验,因为它是对最终用户免费提供的,并具有比Fedora的一个更长的发布周期(通常每隔半年左右发布一个新版本)。 SUSE, SUSE Linux Enterpri
小小科
2018/05/02
8.5K0
最全Linux的发行版简介,一文读懂各发行版之间的联系和区别
常见密码和编码总结 CTF中Crypto和Misc必备
可以分作三部分组成 第一部分是:ASCII非打印控制字符 第二部分是:ASCII打印字符; 第三部分是:扩展ASCII打印字符
中龙技术
2022/09/30
8.5K0
常见密码和编码总结 CTF中Crypto和Misc必备
免杀 | 利用Python免杀CS Shellcode
2019年,告别了coder的世界,告别了从前的生活。我决定暂时抛开金钱至上的价值体系,以一个Fucking loser的身份去寻找人生中的三大哲学问题,我是谁,我在哪儿,我在做什么。褪去了互联网行业的尔虞我诈,轻浮缥缈。在这个铺天盖地的泛娱乐时代,我决定去看看大海,去感受下海水的味道,没错,它确实是咸的。当沙滩上的沙子铺满全身的那一刻,我,拥有了几分钟童年。在途中,偶遇了黄河,没错,它确实很黄,并且波涛汹涌。也在这途中,缘分使我进入了曾经告别的安全行业。
HACK学习
2020/02/26
4.6K0
Clover引导简明教程
选择 Boot macOS with selected options 启动 出现错误画面拍照发群里寻求帮助。
慕白
2020/01/02
17.5K1
Clover引导简明教程
Linux 系统结构详解
Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所
小小科
2018/05/03
3.9K0
Linux 系统结构详解
肝了很久!一文了解操作系统 I/O
我们之前的文章提到了操作系统的三个抽象,它们分别是进程、地址空间和文件,除此之外,操作系统还要控制所有的 I/O 设备。操作系统必须向设备发送命令,捕捉中断并处理错误。它还应该在设备和操作系统的其余部分之间提供一个简单易用的接口。操作系统如何管理 I/O 是我们接下来的重点。
cxuan
2020/06/28
1.3K0
肝了很久!一文了解操作系统 I/O
第三届“中科实数杯”团体赛wp
团体赛题目整体分为两部分:磁盘镜像分析 & 安卓模拟器分析,难度上第一部分比较简单,第二部分涉及到很多安卓相关知识,相对比较困难
回天
2023/04/25
2.2K0
第三届“中科实数杯”团体赛wp
一文读懂 MD5 算法
消息摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。消息摘要算法也被称为哈希(Hash)算法或散列算法。
阿宝哥
2020/02/17
4.1K0
100天学会python
目前我使用的Python 3.7.x的版本是在2018年发布的,Python的版本号分为三段,形如A.B.C。其中A表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(例如:修复了某个Bug),只要有修改就增加C。如果对Python的历史感兴趣,可以阅读名为《Python简史》的网络文章。
她的店里只卖樱花
2023/01/06
3.5K0
100天学会python
相关推荐
使用AudioToolbox编码AAC
更多 >
交个朋友
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入[架构及运维] 腾讯云技术交流站
云架构设计 云运维最佳实践
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档