软件构造Lab4心得
Lab4是要求面向正确性和健壮性编程,要求在Lab3的基础之上,增强代码的正确性和健壮性。
啥是正确性??啥是健壮性??
实话是说,没上这门课之前,其它老师也经常会提到这两个词,但是一直都认为这两个词就是一个意思,讲完课之后才开始理解这两个词实际是在从不同的角度衡量代码的质量:
正确性是代码能否针对规约的做出正确反应的度量,是在前置条件满足的情况下,代码能否满足相应的后置条件,这是代码的基本要求,没有正确性,其它性质再好也没用;而健壮性是代码能否针对规约之外的情况作出反应的度量,是代码能否具有一定的容错能力的度量,这是用户的基本需求。所以说,一个能够满足市场的软件这两个性质应该都要非常好。
怎么正确??怎么健壮??
感觉很长时间以来,自己的代码肯定是在关注正确性,但是往往是在关注算法的正确性,单纯的在考虑怎么怎么实现某个算法,但是在OOP里面,好像不仅仅关注算法,还很关注信息间的交互,关注他人对该段信息的访问。就像在计算机系统当中,谁谁谁对这个文件可写,谁谁谁对这个文件可读,OOP中对某个类也很关注,一般而言,都不太愿意通过其它的类的方法修改自己的类的信息,也就是说,自己类的信息对其他类而言我们希望是只读的,即信息封装。为什么这个会跟正确性挂钩,这个在不可变类型的危害里面可以知道。那为了减少这种情况的发生,我们会用private、final关键字,会用防御式拷贝,会返回不可变类型,这一系列的防御式方法不仅仅可以解决信息封装与隐藏的问题,还可以有助于提高程序的正确性。此外还有断言、异常等机制。同样,断言、异常处理机制也可以提高程序的健壮性。同时,还有测试。老师一般会要求我们要把所有的方法都写测试,可能是考虑到多人工作的时候方便,但是我觉得测试不是为了测试而测试,有的基本代码本省就不太会出错,像简单的get方法,这样的好像就没必要再单独去测试它了。【可能有一天写代码栽到一个这样的错上就不会这么想了】
另外,再记录一个在piazza上的问题:
为啥要自定义异常类??自定义异常类的好处??
在java 里使用异常的经验法则是:优先选择使用java自带的异常类型,且能够对所发生的异常进行准确的描述。如果程序中产生的异常比较特殊,用java的标准异常类型无法准确描述,那就需要自定义异常类型了。在代码中使用自定义类型,会让其他程序员看着所捕获的异常类的名字就能想象到发生的问题。如果用标准类型(极端情况:代码中全是Exception 类),那么其他程序员靠这个异常名完全想象不出发生了什么,只能靠运行时输出的异常消息才能作出判断。这对代码的可读性、可理解性、可维护性都很糟糕。想象一种场景,某方法抛出了一个异常,经过n次的传递,到了一个距离该方法非常远的客户端程序那里才被捕获,这时候客户端程序员发现捕获了一个很通用的Exception类型,他的体验会非常糟糕。所以,在使用异常的时候还应该特别注意异常的命名,以方便获取信息。