首页 > 其他分享 >如何识别和避免魔鬼数字在代码中的不良影响

如何识别和避免魔鬼数字在代码中的不良影响

时间:2024-08-05 22:50:37浏览次数:6  
标签:魔鬼 数字 int System 不良影响 println 识别 public

如何识别和避免魔鬼数字在代码中的不良影响

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊聊编程中的一个常见问题——魔鬼数字(Magic Numbers)。魔鬼数字是指那些在代码中直接使用的数值常量,它们没有任何解释或说明,导致代码的可读性和维护性变差。我们将探讨如何识别魔鬼数字及其带来的不良影响,并提供一些避免使用魔鬼数字的技巧。

魔鬼数字的危害

魔鬼数字会导致代码难以理解和维护。例如,假设你在代码中看到一个神秘的数字42,你可能不知道它的意义。如果这个数字被多次使用,你将很难修改它,因为你不确定每个出现的地方是否应该修改。

来看一个Java的例子:

package cn.juwatech.example;

public class MagicNumberExample {
    public static void main(String[] args) {
        int totalAmount = 100;
        int discount = totalAmount * 42 / 100; // 42 代表什么?
        System.out.println("Discount amount: " + discount);
    }
}

在上面的代码中,42是一个魔鬼数字。它的意义不明确,导致代码难以理解。如果需要修改这个折扣比例,你必须找到所有的42并替换它们,这非常容易出错。

如何识别魔鬼数字

识别魔鬼数字的关键在于寻找那些不具有明显上下文意义的数字。通常,这些数字会出现在算术运算、条件判断和数组索引等地方。

package cn.juwatech.example;

public class MagicNumberDetection {
    public static void main(String[] args) {
        int[] scores = {85, 90, 78, 92};
        int passingScore = 75;
        
        for (int score : scores) {
            if (score >= passingScore) {
                System.out.println("Passed");
            } else {
                System.out.println("Failed");
            }
        }
    }
}

在上面的代码中,75是一个魔鬼数字,因为它的意义没有在代码中明确说明。

避免魔鬼数字的方法

使用常量是避免魔鬼数字的一个有效方法。通过为这些数字赋予有意义的名字,可以提高代码的可读性和可维护性。

package cn.juwatech.example;

public class AvoidMagicNumbers {
    private static final int DISCOUNT_PERCENTAGE = 42;
    private static final int PASSING_SCORE = 75;

    public static void main(String[] args) {
        int totalAmount = 100;
        int discount = totalAmount * DISCOUNT_PERCENTAGE / 100;
        System.out.println("Discount amount: " + discount);

        int[] scores = {85, 90, 78, 92};
        
        for (int score : scores) {
            if (score >= PASSING_SCORE) {
                System.out.println("Passed");
            } else {
                System.out.println("Failed");
            }
        }
    }
}

在上面的代码中,我们用DISCOUNT_PERCENTAGE和PASSING_SCORE来代替魔鬼数字42和75。这样,代码的意义变得清晰了许多。

使用枚举类型

在某些情况下,使用枚举类型(enum)也是一个不错的选择,尤其是当魔鬼数字代表特定的一组值时。

package cn.juwatech.example;

public class EnumExample {
    public enum DiscountType {
        NONE(0),
        SILVER(10),
        GOLD(20),
        PLATINUM(30);

        private final int percentage;

        DiscountType(int percentage) {
            this.percentage = percentage;
        }

        public int getPercentage() {
            return percentage;
        }
    }

    public static void main(String[] args) {
        int totalAmount = 100;
        DiscountType discountType = DiscountType.GOLD;
        int discount = totalAmount * discountType.getPercentage() / 100;
        System.out.println("Discount amount: " + discount);
    }
}

在这个例子中,我们用枚举类型DiscountType来表示不同的折扣类型,每个类型都有对应的折扣百分比。

使用配置文件

当需要频繁修改某些数值时,可以考虑将这些数值放在配置文件中,而不是硬编码在程序中。这样可以更方便地进行调整而无需修改代码。

package cn.juwatech.example;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ConfigExample {
    private static final String CONFIG_FILE = "config.properties";
    private static int discountPercentage;
    private static int passingScore;

    static {
        try (InputStream input = ConfigExample.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) {
            Properties prop = new Properties();
            if (input == null) {
                System.out.println("Sorry, unable to find " + CONFIG_FILE);
                return;
            }
            prop.load(input);
            discountPercentage = Integer.parseInt(prop.getProperty("discount.percentage"));
            passingScore = Integer.parseInt(prop.getProperty("passing.score"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        int totalAmount = 100;
        int discount = totalAmount * discountPercentage / 100;
        System.out.println("Discount amount: " + discount);

        int[] scores = {85, 90, 78, 92};
        
        for (int score : scores) {
            if (score >= passingScore) {
                System.out.println("Passed");
            } else {
                System.out.println("Failed");
            }
        }
    }
}

在这个例子中,折扣百分比和及格分数被存储在配置文件config.properties中,使得修改这些值变得更加容易。

总结

魔鬼数字会导致代码难以理解和维护。通过使用常量、枚举类型和配置文件,可以有效地避免魔鬼数字的使用,从而提高代码的可读性和可维护性。希望通过本文的讲解,你能更好地识别和避免魔鬼数字的使用,从而编写出更高质量的代码。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

标签:魔鬼,数字,int,System,不良影响,println,识别,public
From: https://www.cnblogs.com/szk123456/p/18344195

相关文章

  • python项目学习 mediapipe手势识别 opencv可视化显示
    importcv2importmediapipeimportnumpydefget_angle(vector1,vector2):#角度计算angle=numpy.dot(vector1,vector2)/(numpy.sqrt(numpy.sum(vector1*vector1))*numpy.sqrt(numpy.sum(vector2*vector2)))#cos(angle)=向量的点乘/向量的模angle=nump......
  • 中文手写体识别(ocr)测试
    记录一下,以下是测试中文手写体识别结果图展示(对于潦草的字迹效果一般),后期会开放模型,有java和python版本:......
  • 深度学习与图像识别(误差反向传播)
    误差反向传播法一 一个高效计算权重以及偏置量的梯度方法ReLU反向传播实现classRelu:def_init_(self):self.x=Nonedefforward(self,x):self.x=np.maximum(0,x)out=self.xreturnoutdefbackward(self,dout):dx=doutdx[self.x<=......
  • HanLP和BERT-BiLSTM-CRF在命名实体识别上的区别
    HanLP和BERT-BiLSTM-CRF在命名实体识别(NamedEntityRecognition,NER)方面的主要区别体现在模型架构、特征提取能力、训练方式以及应用场景的适应性上。1.模型架构HanLP:HanLP是一个开源的自然语言处理工具包,它提供了包括命名实体识别在内的多种中文文本处理功能。HanLP内部......
  • 基于神经网络的手写数字识别及其ZYNQ实现
        基于MNIST数据集的手写数字识别是神经网络(NeuralNetwork)的经典应用。    本文将讨论一种名为“ZYNET”的全连接神经网络框架,它可以自动生成针对FPGA的硬件实现架构。我们以手写数字识别为例,在ZYNQ平台上对该架构进行验证。本章包括以下几个部分:1环境配......
  • <数据集>COCO2017行人识别数据集<目标检测>
    数据集格式:VOC+YOLO格式图片数量:10000张标注数量(xml文件个数):10000标注数量(txt文件个数):10000标注类别数:1标注类别名称: ['person']序号类别名称图片数框数1person1000041131使用标注工具:labelImg标注规则:对类别进行画水平矩形框图片示例:标注示例:......
  • 最新计算机专业开题报告案例57:基于人脸识别的考生身份验证系统的设计与实现
    计算机毕业设计100套微信小程序项目实战java项目实战需要源码可以滴滴我目录一、研究意义与应用价值1.1人脸识别技术概述1.2Python在人脸识别技术中的应用1.3研究意义二、研究现状2.1国内研究现状2.2国外研究现状三、主要参考资料四、研究的主要内容4.1功......
  • 身份证OCR识别API
    身份证OCR识别API是一种能够自动识别身份证上文字信息的技术,广泛应用于需要快速录入身份证信息的业务场景中。目前,市场上有多家公司提供这项服务,包括微信、腾讯云、华为云和阿里云等。微信的身份证OCR识别接口支持小程序调用,能够识别身份证正反面的所有字段,如姓名、性别、民族......
  • 基于matlab的汽车牌照识别程序
    摘要:本次作业的任务是设计一个基于matlab的汽车牌照识别程序,能够实现车牌图像预处理,车牌定位,字符分割,然后通过神经网络对车牌进行字符识别,最终从一幅图像中提取车牌中的字母和数字,给出文本形式的车牌号码。关键词:车牌识别,matlab,神经网络1引言随着我国交通运输的不断发展,......
  • 利用MATLAB打造混凝土结构裂缝识别系统(二)
    文章目录前言一、操作说明二、导入图像三、选择裂缝识别方法1.“单裂缝识别”方法2.“多裂缝识别”方法四、结果输出与保存实际识别效果展示墙体裂缝:道路裂缝:衬砌裂缝:桥面裂缝:房屋楼板裂缝:前言本节主要介绍所设计的混凝土结构裂缝识别系统各个组件的具体操作与......