第1章 面试的流程
第2章 面试需要的基础知识
第3章 高质量的代码
第4章 解决面试题的思路
第5章 优化时间和空间效率
第6章 面试中的各项能力
第7章 两个面试案例
3.3 代码的完整性
在面试的过程中,面试官会非常关注应聘者考虑问题是否周全。面试官通过检查代码是否完整来考查应聘者的思维是否全面。通常面试官会检查应聘者的代码是否完成了基本功能、输入边界值是否能得到正确的输出、是否对各种不合规范的非法输入做出了合理的错误处理。
1.从3方面确保代码的完整性
应聘者在写代码之前,首先要把可能的输入都想清楚,从而避免在程序中出现各种各样的质量漏洞。也就是说在编码之前要考虑单元测试。如果能够设计全面的单元测试用例并在代码中体现出来,那么写出的代码自然也就是完整正确的了。通常我们可以从功能测试、边界测试和负面测试三方面设计测试用例,以确保代码的完整性(如图3.2所示)。
图3.2 从功能测试、边界测试、负面测试3个方面设计测试用例,以保证代码的完整性
首先要考虑的是普通功能测试的测试用例。我们首先要保证写出的代码能够完成面试官要求的基本功能。比如面试题要求完成的功能是把字符串转换成整数,我们就可以考虑输入字符串123来测试自己写的代码。这里要把零、正数和负数都考虑进去。
考虑功能测试的时候,我们要尽量突破常规思维的限制。面试的时候我们经常受到惯性思维的限制,从而看不到更多的功能需求。比如面试题12打印1到最大的n位数,很多人觉得这题很简单。最大的3位数是999、最大的4位数是9999,这些数字很容易就能算出来。但是最大的n位数都能用int型表示吗?超出int的范围我们可以考虑long long类型,超出long long能够表示的范围呢?面试官是不是要求考虑任意大的数字?如果面试官确认题目要求的是任意大的数字,那么这个题目就是一个大数问题,此时我们需要特殊的数据结构来表示数字,比如用字符串或者数组来表示大的数字,以确保不会溢出。
其次需要考虑各种边界值的测试用例。很多时候我们的代码中都会有循环或者递归。如果我们的代码是基于循环,那么结束循环的边界条件是否正确?如果是递归,递归终止的边界值是否正确?这些都是边界测试时要考虑的用例。还是以字符串转换成整数的问题为例,我们写出的代码应该确保能够正确转换最大的正整数和最小的负整数。
最后还需要考虑各种可能的错误的输入,也就是通常所说的负面测试的测试用例。我们写出的函数除了要顺利地完成要求的功能之外,当输入不符合要求的时候还能做出合理的错误处理。在设计把字符串转换成整数的函数的时候,我们就要考虑当输入的字符串不是一个数字,比如1a2b3c,我们怎么告诉函数的调用者这个输入是非法的。
前面我们说的都是要全面考虑当前需求对应的各种可能输入。在软件开发过程中,永远不变的就是需求会一直改变。如果我们在面试的时候写出的代码能够把将来需求可能的变化都考虑进去,在需求发生变化的时候能够尽量减少代码改动的风险,那我们就向面试官展示了自己对程序可扩展性和可维护性的理解,通过面试就是水到渠成的事情了。请参考面试题14调整数组顺序使奇数位于偶数前面中关于可扩展性和可维护性的讨论。
2.3种错误处理的方法
通常我们有3种方式把错误信息传递给函数的调用者。第一种方式是函数用返回值来告知调用者是否出错。比如很多Windows的API就是这个类型。Windows中很多API的返回值为0表示API调用成功,而返回值不为0表示在API调用的过程中出错了。微软为不同的非零返回值定义了不同的意义,调用者可以根据这些返回值判断出错的原因。这种方式最大的问题是使用不便,因为函数不能直接把计算结果通过返回值赋值给其他变量,同时也不能把这个函数计算的结果直接作为参数传递给其他函数。
第二种方式是当发生错误时设置一个全局变量。此时我们可以在返回值中传递计算结果了。这种方法比第一种方法使用起来更加方便,因为调用者可以直接把返回值赋值给其他变量或者作为参数传递给其他函数。Windows的很多API运行出错之后,也会设置一个全局变量。我们可以通过调用函数GetLastError分析这个表示错误的全局变量,从而得知出错的原因。但这个方法有个问题:调用者很容易就会忘记去检查全局变量,因此在调用出错的时候忘记做相应的错误处理,从而留下安全隐患。
第三种方式是异常。当函数运行出错的时候,我们就抛出一个异常,我们还可以根据不同的出错原因定义不同的异常类型。因此函数的调用者根据异常的类型就能知道出错的原因,从而做相应的处理。另外,我们能显式划分程序正常运行的代码块(try模块)和处理异常的代码块(catch模块),逻辑比较清晰。异常在高级语言如C#中是强烈推荐的错误处理方式,但有些早期的语言比如C语言还不支持异常。另外,当抛出异常的时候,程序的执行会打乱正常的顺序,对程序的性能有很大的影响。
上述3种错误处理的方式各有其优缺点(如表3.1所示)。那么,面试的时候我们该采用哪种方式呢?这要看面试官的需求。在听到面试官的题目之后,我们要尽快分析出可能存在哪些非法的输入,并和面试官讨论该如何处理这些非法输入。
表3.1 返回值、全局变量和异常三种错误处理方式的优缺点比较
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论