HIT软件构造 (chapter01 )学习java中关于specification and robustness的思考

背景

近日在补充java有关知识,今天上课时老师留了一道课堂练习,做完后有感而发,以下是有关 specification and robustness 的一些拙见。
题目很简单,主要有两个要求:两个数组一个存成绩,另一个存权重后计算加权平均,如何判断输入是否合法?

自身实践

这是我课堂例题练习的代码:

import java.util.Scanner;
public class practice001 {
    public static void main(String[] args) {
        Scanner myscanner = new Scanner(System.in);        
        double[] array1;
        double[] array2;

        do {
            System.out.println("请输入第一个数组的元素(用空格分隔):");
            array1 = readArray(myscanner);
            System.out.println("请输入第二个数组的元素(用空格分隔):");
            array2 = readArray(myscanner);
        } while (!isConditionMet(array1, array2));

        System.out.println("条件满足,可以继续执行其余操作");
        //......
    }

    public static double[] readArray(Scanner myscanner) {
        String input = myscanner.nextLine();
        String[] parts = input.split(" ");
        double[] array = new double[parts.length];
        for (int i = 0; i < parts.length; i++) {
            array[i] = Double.parseDouble(parts[i]);
        }
        return array;
    }

    public static boolean isConditionMet(double[] array1, double[] array2) {
        double sum = 0;
        if(array1.length!=array2.length){
            System.out.println("二者数量不相等,请重新输入数组:");
            return false;
        }
        else{
            for (int i = 0; i < array2.length; i++) {
                sum += array2[i] ;
            }if (sum == 1) {
                    return true;
                }
        }
        System.out.println("每项占比之和不满足100%,请重新输入数组:");
        return false;
    }
}

技术名词解释

在此程序中采取了do while循环,isConditionMet用来判断,直到条件满足,才可进行接下来的代码。对于数组的读入代码,加过注释后如下所示:

public static double[] readArray(Scanner myscanner) {
    // 从键盘输入获取一行字符串
    String input = myscanner.nextLine();
    // 将输入的字符串按空格分割成数组元素
    String[] parts = input.split(" ");
    // 创建一个整数数组,大小为输入的字符串数组的长度
    double[] array = new double[parts.length];
    // 遍历字符串数组中的每个元素
   for (int i = 0; i < parts.length; i++) {
            array[i] = Double.parseDouble(parts[i]);
        }
    // 返回存储输入数组
    return array;
}

技术细节

1.split() :
input.split() 是 Java 中字符串类(String)的一个方法,它的作用是将字符串按照指定的分隔符进行分割,并返回一个字符串数组。
具体来说,split() 方法接收一个字符串参数,这个参数是一个正则表达式,用来描述分隔符的规则。方法会根据这个规则将原始字符串分割成多个子串,并将这些子串存储到一个字符串数组中。

例如:
字符串 input = “hello world”,然后调用 input.split(" "),它将使用空格作为分隔符,将字符串分割成 “hello” 和 “world” 两个子串,并存储到一个字符串数组中,然后返回这个数组。
使用逗号或空格分隔的例子:

public class Main {
    public static void main(String[] args) {
        String str = "apple,banana orange";
        String[] parts = str.split("[,\\s]+");
        
        // 打印拆分后的部分
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

2.Double.parseDouble(parts[i]):
Double.parseDouble(parts[i]);是 Java 中的一个方法调用,用于将字符串转换为Double类型。在这个上下文中,它是将字符串数组 parts 中的每个元素(字符串)转换为Double类型。

具体来说,Double.parseDouble();是一个静态方法,它接受一个字符串作为参数,并尝试将这个字符串解析为一个Double。如果解析成功,就返回对应的整数值;如果解析失败(例如字符串不是一个合法的整数表示),就会抛出一个 NumberFormatException 异常。

例如,假设 parts[i] 是一个字符串 “123.5”,调用 Double.parseDouble(parts[i]); 将返回Double 123.5。如果 parts[i] 是一个非法的Double表示,比如 “abc”,那么调用Double.parseDouble(parts[i]); 将抛出 NumberFormatException 异常。

在上述代码中,Double.parseDouble(parts[i]); 用于将从键盘输入的字符串转换为Double,这样就可以将用户输入的数组元素存储到数组中。

感悟

作为一名软工的学生,在日常做作业、做项目中我们总会遇到各种各样的要求和条件即为specification,如何解决好这些问题。我想这需要我们跳出来看待这些问题,也需要我们设身处地的为用户考虑。通过本次练习我了解了尽可能满足specification and robustness的困难之处。此代码的robustness还很欠缺,需要我长期以往的改进和维护。因此我意识到,尽可能满足用户提的要求尤为考验我们自身实力。我们需要提升自己思考问题的方式,并且更周全、细致的考虑一切可能的结果,不要让“一位程序员走进酒吧,然后点了一份炒饭,酒吧就爆炸了”的事情再次发生。这需要我们的代码具有极强的robustness和我们在测试中尽可能的对自己的代码狠一些。今天课上有一句话很触动我:永远不要把你的那堆“破烂”当宝贝,要对他们狠一些,越早出问题越好。(ps:这是我第一篇blog,有不足之处还请大家见谅)

  • 41
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值