`

也说魔数与魔字符串

阅读更多

         看了叙远兄写的.net中的魔字符串,还有birdsome的评论,颇有启发。
         所谓魔数和魔字符串就是在代码中直接使用某一个数字或者字符串,而不是常量。譬如一个很简单的根据职位计算薪水的方法:

public int getSalary(String title, int grade) {
    
if ("Programmer".equals(title)) 
        
return grade * 500 + 700;
    
else if ("Tester".equals(title))
        
return grade * 500 + 800;
    
else if ("Analyst".equals(title))
        
return grade * 800 + 1000;
}

        在这个方法里面,"Programmer","Tester"和"Analyst"是所谓的魔字符串(Magic String),而500, 700,800和1000就是所谓的魔数(Magic Number)了。 咋一看,代码这样写也没有什么问题,但是,仔细思考一下就会发现,如果这种随手捻来的字符串和数字散布于程序当中,随处可见的话,是会有很多弊病的。我们先来分析三个魔字符串。虽然三个Magic String的意义很明显,并不影响到代码的可读性,但是这样却增加了出错的概率,并且忽略了具体的语义环境。我们很容易就会想到,像"Programmer"这个单词散布在多个方法中,一个大小写的笔误就会产生bug。同时,"Programmer"在计算薪水的方法中代表着职位,但是在统计公司订阅的杂志的方法中,也许就要代表一本杂志的名称了。然而这种语义环境是无法通过一个单纯的"Programmer"就能体现出来的。
        而Magic Number的问题就更大了,首先是影响了代码的可读性,谁会知道500和800是薪水基数,700是补贴呢?而且更糟糕的是,如果薪水基数发生改变的时候,那么就得找人把这些500,700,800的数字找出来一个一个地update,那可是一件够郁闷的事情了。
        如果我们拥有一个常量定义的interface,代码就会变漂亮起来了:

public int getSalary(String title, int grade) {
    
if (Constants.TITLE_PROGRAMMER.equals(title)) 
        
return grade * Constants.BASE_SALARY_LOW + Constants.ALLOWANCE_LOW;
    
else if (Constants.TITLE_TESTER.equals(title))
        
return grade * Constants.BASE_SALARY_LOW + Constants.ALLOWANCE_MEDIUM;
    
else if (Constants.TITLE_ANALYST.equals(title))
        
return grade * Constants.BASE_SALARY_HIGH + Constants.ALLOWANCE_HIGH;
}

        从以上的分析,在一个Project里面,避免使用魔数(Magic Number)和魔字符串(Magic String)是相当必要的。通过定义的常量去access特定的字符串和数字也已经是软件开发的standard。那么是不是所有的数字和字符串都应该定义成常量呢?或许有朋友会认为所有的数字和字符串都应该定义成常量,但是我觉得,每个字符串确实是应该定义成常量的,但是对于数字而言,如果数字本身的语义没有得到延伸,那么就不应该定义成常量。譬如数组的index就不应该定义成变量。 像这样的代码:

String building = address[Constants.ONE]; 
            // 在Constants这个interface中,ONE的定义为 final int ONE = 1;

        你一定会觉得这样的代码就是画蛇添足, 因为ONE就是1,它没有其他特别的含义,不像上面代码中的500和700。而且如果真的要这样定义的话,出现了有上百个元素的数组的时候,那么你就得定义上百个没有任何意义的常量了。是不是很FT呢?
        总之,任何策略的使用,还是一个度最重要。

分享到:
评论

相关推荐

    截取指定长度的字符串

    在编程领域,字符串操作是一项基础且重要的任务。"截取指定长度的字符串"这个主题涉及到的是如何从一个字符串中提取出特定长度的部分。这在处理用户输入、数据展示、信息提取等多个场景中都非常常见。接下来,我们将...

    MLDN魔乐JAVA_08字符串题目、引用传递.rar

    本资料"MLDN魔乐JAVA_08字符串题目、引用传递.rar"着重讲解了两个核心主题:字符串操作和引用传递。在此,我们将深入探讨这两个关键知识点。 一、字符串操作 1. 字符串创建:在Java中,字符串是对象,可以通过`new...

    C#动态执行字符串,可以将字符串作为表达式执行

    可以动态解析并执行字符串 参见http://blog.csdn.net/hsrzq/archive/2009/08/17/4456361.aspx 别忘了引用EvalGuy命名空间!

    json字符串转换c++类对象

    总的来说,将JSON字符串转换为C++类对象需要选择合适的JSON库,设计类结构来映射JSON键值,解析JSON字符串,并利用库提供的功能将JSON对象转换为C++对象。在实际应用中,还需要注意错误处理和适应各种复杂的JSON结构...

    Python入门之字符串

    例如,`'aaa' + '3'` 是合法的,而`'aaa' + 3`则会出错,因为尝试将字符串与整数相加。 在字符串中查找特定字符或子串,可以使用`find()`函数,它返回第一次出现的索引,若未找到则返回-1。`index()`函数与`find()`...

    java基本类型转换字符串截取注入过滤

    java类型转换,字符串截取工具类,sql注入过滤工具类,基本类型转换可以设置异常时的默认值,字符串截取指定位置,长度,sql注入过滤

    StringNumber:JSON.parse stringify将大数字转换为字符串

    字串号码JSON.parse / stringify将大数字转换为字符串。 基于 。 尽管大多数JSON解析器都假定数字值具有与IEEE 754 double相同的精度限制,但JSON规范并未说明任何数字精度。 十进制(可选地,科学的)表示法中的...

    信奥赛c++程序算法篇100题

    - **知识点**:字符串与时间计算。需要理解如何解析字符串表示的时间,并计算两个时间之间的差值。 - **代码示例**: ```cpp #include #include using namespace std; int main() { string time1, time2; ...

    python七种方法判断字符串是否包含子串

    ### Python七种方法判断字符串是否包含子串 在Python编程中,经常需要处理字符串相关的操作,其中判断一个字符串是否包含另一个子串是最基本且常见的需求之一。本文将详细介绍七种不同的方法来完成这一任务,并对每...

    利用C++仿照string设计实现自己的字符串类型课程设计实验报告

    总的来说,这个实验旨在通过设计一个自定义的字符串类,让学生深入理解C++中对象的生命周期、内存管理、运算符重载、继承和多态性等核心概念。通过这样的实践,能够提高编程能力和对C++语言特性的掌握。

    字符串处理的魔法:aardio的文本操作艺术

    aardio是一种动态语言,同时也是混合语言,支持静态类型操作,能够直接调用C语言、C++等静态语言的API接口函数。它支持多种API调用约定,例如stdcall、cdecl、thiscall、fastcall、regparm(n)等。aardio具有独特的...

    本地化:一种在项目中翻译字符串的简单方法

    本土化在项目中翻译字符串的简单方法在我的博客上可以找到更详细的描述: : 和 。 这些帖子描述了该系统的早期版本。最初设定从本地化->显示本地化菜单中打开本地化窗口。 单击以加载本地化文件按钮a)如果存在,将...

    PHP魔众网盘系统 v2.1.0

    魔众网盘系统提供了一套在线网盘管理系统,支持多用户、分享等功能,支持...·[新功能] 随机字符串新增大写和小写可读字符串 ·[新功能] 用户新增Meta信息,用于底层临时存储部分关联信息 ·[新功能] Request新增i

    magic-increment:字符串的递增和递减

    字符串的递增和递减。 安装 在浏览器中: < script src =" magic-increment.js " > </ script > 或者 < script src =" magic-increment.min.js " > </ script > 对象MagicIncrement将...

    python-boolean:一些方便的工具,用于解析布尔字符串,以及从布尔字符串获取最小乘积

    在自由许可下,一些简洁的函数可以读取表示布尔表达式的字符串并返回各种方便的形式。 它使用进行繁重的解析,并使用George Prekas根据Robert Dick和Pat Maupin的代码(全部包含在qm.py )编写的Quine-McCluskey...

    MLDN魔乐JAVA_07作业讲解、String.rar

    在Java中,String是一个非常重要的类,它用于处理文本字符串,并在各种编程任务中频繁使用。这份资料可能是为学习者提供了关于String类的使用方法、特性以及相关编程作业的解答,旨在帮助他们深入理解和应用这一关键...

    实现string算法的魔 鬼 曲 线

    魔鬼曲线(Dragon Curve)是一种著名的分形图案,它的生成过程可以通过字符串算法来实现。让我们深入探讨一下这个主题。 魔鬼曲线,也被称为李斯滕斯坦曲线(Lindenmayer system),是由荷兰数学家费伦茨·李斯滕...

    魔法老人javascript特效

    根据给定的信息,本文将对“魔法老人javascript特效”这一主题进行深入解析,重点解读其JavaScript代码中的关键知识点,包括但不限于:如何创建ActiveX对象、角色动画控制、以及字符串操作等。 ### 一、理解标题:...

    CE5.5魔鬼作坊进化版

    1. **内存扫描**:CE5.5魔鬼作坊进化版允许用户根据游戏中的数值类型(如整数、浮点数、字符串等)进行快速或深度扫描,找到与特定数值相关的内存地址。 2. **地址跟踪**:一旦找到可能的内存地址,你可以设置数据...

Global site tag (gtag.js) - Google Analytics