栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ID生成器代码重构问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ID生成器代码重构问题

背景: 为每个i请求生成一个ID
即ID生成器:本机名的最后一个字段+当前时间戳精确到毫秒+8位随机字符串

通用方面
1.IdGenerator设计成了实现类,违反基于接口而非实现编程的设计思想,如果我们需要设计两个ID生成器算法就需要将IdGenerator改为接口并为不同的算法实现不同的实现类。
2.静态方法generate()测试难度更大。
3.没有编写单元测试代码
4.代码完全没有注释,不易理解,尤其是随机字符串部分
业务方面
1.没有涉及共享变量,所以代码线程安全。
2.接口只有generate()一个,不存在不易用问题。
3.多线程环境下调用generate()不存在并发问题。
4.每次生成 ID 都需要获取本机名,获取主机名会比较耗时,所以,这部分可以考虑优化一下。
5.randomAscii 的范围是 0~122,但可用数字仅包含三段子区间(09,az,A~Z),可优化。

代码结构
基于Maven下的程序

主函数

package org.example;

public class Main {
    public static void main(String[] args) {
        System.out.println(IdGenerator.generate());
    }

}

实现类IdGenerator

package org.example;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IdGenerator {
    private static final Logger logger = LoggerFactory.getLogger(IdGenerator.class);

    public static String generate() {
        String id = "";
        try {
            String hostName = InetAddress.getLocalHost().getHostName();
            String[] tokens = hostName.split("\.");
            if (tokens.length > 0) {
                hostName = tokens[tokens.length - 1];
            }
            char[] randomChars = new char[8];
            int count = 0;
            Random random = new Random();
            while (count < 8) {
                int randomAscii = random.nextInt(122);
                if (randomAscii >= 48 && randomAscii <= 57) {
                    randomChars[count] = (char)('0' + (randomAscii - 48));
                    count++;
                } else if (randomAscii >= 65 && randomAscii <= 90) {
                    randomChars[count] = (char)('A' + (randomAscii - 65));
                    count++;
                } else if (randomAscii >= 97 && randomAscii <= 122) {
                    randomChars[count] = (char)('a' + (randomAscii - 97));
                    count++;
                }
            }
            id = String.format("%s-%d-%s", hostName,
                    System.currentTimeMillis(), new String(randomChars));
        } catch (UnknownHostException e) {
            logger.warn("Failed to get the host name.",e);
        }

        return id;
    }
}

pom.xml依赖配置


        
            org.apache.logging.log4j
            log4j-core
            2.13.1
        
        
            log4j
            log4j
            1.2.17
        
        
            org.slf4j
            slf4j-api
            1.7.32
        
        
            org.slf4j
            slf4j-log4j12
            1.7.25
        

原链接:34 | 实战一(上):通过一段ID生成器代码,学习如何发现代码质量问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992901.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号