长度换算App

1.业务需求

我们需要一个长度换算器,目前仅需要毫米、厘米、分米、米、千米对毫米的换算。
对于用户来说,1米和1000毫米是对等的。

任务:请完成这个功能的设计和书写。不需要ui,只需要换算器能够完成1米和1000毫米这种不同数据是否对等的判断即可。

提示1:请用OO的思想完成这个任务。
提示2:对于使用者来说,我们的期望是类似 new xx(1) 等同于 new xx(1000)这种自然的编程模型或使用方式。

2. 设计思路

看到这个小程序要求,我第一时间就会去想千米,米,分米,厘米毫米之间转换关系

1km=103m=103x10=103x102cm=103x103mm

我第一时间想到的,能完成这个换算无非就是每次让用户去选择或者输入两个规范的单位以及需要换算的数字,这样我就只需要去判断单位从而进行换算,但是如果说要满足用面向对象思想的话,而且期望是类似 new xx(1) 等同于 new xx(1000)要求的话,我理解一下认为,就是用户给的是new xx(1)这个对象,而我需要反馈给用户的是new xx(1000)这个对象,那么也就是用户给我了两个对象一个是属性里有长度数字,和单位,另一个则只有单位,长度只需要通过之前所说的去换算就OK了,开干

3.代码

3.1 实体类

说实话面向对象面向对象,那肯定得先有对象对吧.

package com.cn.fast.model;

/**
 * @Author MrLiu
 * @Date 2022/9/25 11:02
 * @Version 1.0
 */
public class Distance {
    private Double length;
    private String unit;

    public Double getLength() {
        return length;
    }

    public void setLength(Double length) {
        this.length = length;
    }

    public String getUnit() {
        return unit;
    }

    public void setUnit(String unit) {
        this.unit = unit;
    }
}

3.2 枚举

使用枚举去将各个单位间精度换算得大小记录下来,我是以KM作为基准,那么1km=1*1000m,以此类推

package com.cn.fast.service;

/**
 * @Author MrLiu
 * @Date 2022/9/25 14:17
 * @Version 1.0
 */
public enum MyUnit {
    MY_KM("km",1),
    MY_M("m",1000),
    MY_DM("dm",10000),
    MY_CM("cm",100000),
    MY_MM("mm",1000000);

    private String unit;
    private double accuracy;

    MyUnit(String unit, double accuracy) {
        this.unit=unit;
        this.accuracy=accuracy;
    }

    public String getUnit() {
        return unit;
    }

    public double getAccuracy() {
        return accuracy;
    }
}

3.3 核心业务

当然我们肯定得先知道用户是想进行哪两个单位之间的换算,在这之间我们还需要去做一些基本的合法判断

public static String lengthObject() {
        //待转换单位
        System.out.println("请选择输入单位,如(km,m,dm,cm,mm):");
        String beforeUnit = inputMethod();
        //数据大小
        System.out.println("请输入长度大小(数据小数,整数之外都为非法字符):");
        double lengthData;
        while (true) {
            Scanner scanner1 = new Scanner(System.in);
            try {
                lengthData = Double.parseDouble(scanner1.nextLine());
                break;
            } catch (Exception e) {
                System.out.println("请输入合法数据!");
            }
        }
        //目标单位
        System.out.println("请输入目标单位单位");
        String afterUnit = inputMethod();

        Distance beforeDistance = new Distance();
        beforeDistance.setLength(lengthData);
        beforeDistance.setUnit(beforeUnit);

        Distance afterDistance = new Distance();
        afterDistance.setUnit(afterUnit);

        String result = lengthConversion(beforeDistance, afterDistance);
        return result;
    }
     //控制台输入
    public static String inputMethod() {
        String[] units = {"km", "m", "dm", "cm", "mm"};
        Scanner scanner = new Scanner(System.in);
        String unit = scanner.nextLine();
        if (!Arrays.stream(units).anyMatch(e -> e.equals(unit))) {
            System.out.println("请输入指定单位!");
            lengthObject();
            return null;
        }
        return unit;
    }

得到用户想要换算的长度,单位,后我们需要开始进行换算操作了

//通过获取精度转换
    public static String lengthConversion(Distance beforeDistance, Distance afterDistance) {
//        1km=10^3m=10^4=10^5cm=10^6mm
        if (afterDistance.getUnit().equals(beforeDistance.getUnit())) {
            afterDistance.setLength(beforeDistance.getLength());
            return "换算结果:" + beforeDistance.getLength() + beforeDistance.getUnit() + "=" + beforeDistance.getLength() + afterDistance.getUnit();
        }
        double newAccuracy = unitConversion(beforeDistance.getUnit(), afterDistance.getUnit());
        afterDistance.setLength((beforeDistance.getLength()) * newAccuracy);
        return "换算结果:" + beforeDistance.getLength() + beforeDistance.getUnit() + "=" + afterDistance.getLength() + afterDistance.getUnit();
    }

查找原始精度并返回处理

    public static double unitConversion(String beforeUnit, String afterUnit) {
        MyUnit[] myUnits = MyUnit.values();
        double beforeAccuracy = getAccuracy(myUnits, beforeUnit);
        double afterAccuracy = getAccuracy(myUnits, afterUnit);

        if (beforeAccuracy != 0 & afterAccuracy != 0) {
            double newAccuracy = afterAccuracy / beforeAccuracy;
            System.out.println(newAccuracy);
            return newAccuracy;
        }
        return 0;
    }
    //获取精度方法
    public static double getAccuracy(MyUnit[] myUnits, String unit) {
        for (int i = 0; i < myUnits.length; i++) {
            if (myUnits[i].getUnit().equals(unit)) {
                double accuracy = myUnits[i].getAccuracy();
                return accuracy;
            }
        }
        return 0;
    }

4.测试

其实我们因该做单元测试的,单元测试能够帮我们去快速发现问题,但是作者懒

4.1 单位合法性

大家不要学博主,要去写测试类去测试,我是偷偷懒,以至于还有bug等你们去测试发现哈哈…
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 总结

其实在最初我考虑的是通过不断去用if判断然后啥啥啥的,后来感觉太麻烦,所以就用了枚举,我只需要一个for循环去拿每个单位各自的精度(这里我是以km为准),然后通过精度相除就能得到两个单位之间换算的乘数.

有些地方还是有欠缺,懒不想写了。


关注我带你学习一些小玩意.

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coping0606

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值