zoukankan      html  css  js  c++  java
  • 学会自己查错--完善各种可能情况!

    最近看了一篇文章(http://mp.weixin.qq.com/s/6X8peCZXUWrroVBMBD5eyg),说的是一个前端技术经理对大部分前端面试者的分类,他以一个简单的面试题举例:

    编写一个函数,用js,该函数有一个参数n(数字类型),其返回值是一个数组,该数组内是n个随机且不重复的整数,且整数取值范围是[2,32]。

    如果愿意,你们也可以停下来,先把这个函数编写出来。

    他把所有答案进行了总结,分成了:可用、健壮、‘可靠、宽容、精益求精5个方面。看完这个文章,我感觉到我之前考虑问题都是那么简单,其实还特别多情况是我忽略的。

    实现了基本功能,可以达到可用阶段,你没有看错!仅仅是最低的阶段。

    要想到健壮,就要做兼容性,参数的判断,包括类型,取值范围等。这些都是需求方不可能告诉你的。

    然后是可靠,就是无论输入是什么,你一定要用相应的输出,就算是抛出错误也行。

    宽容,就是尽可能的扩大你的参数允许范围,比如要的是一个数字, 我们可以扩大到字符串类型的数字。

    最后是精益求精,就是无论代码多好,多宽容,都要想办法做到更加好,更加完善。

    对于这个函数。我本能的只想着实现功能而已,这个不难。但是却没有想到是:

    1.函数的参数是否存在,你需要进行校检。

    2.函数参数是否为数字。

    3.参数的取值范围。

    完成这三个可以达到健壮。

    4.如果n是一个字符串数字,应该任何处理。

    5.如果n是一个浮点数,带小数的话,类似1.9004,函数应该怎么办。

    6.注释!也是对阅读你代码的其他人的一种宽容。

    再完成这3个可以达到宽容。

    能达到宽容的境界,一般都是比较完善的代码了。下面是我修改了我可用的代码之后的最终代码:

     1 /*
     2 randomArray函数是主函数,先对传入的参数进行判断是否符合numbe类型并且是,然后生成随机数,最后判断生成的随机数
     3 是否在数组内已经存在,不存在就push进去,否则,重新生成随机数重来一遍。
     4 */
     5 function randomArray(n){
     6     if(typeof n=="undefined")throw new Error("randomArray函数没有参数!");
     7     if(typeof parseInt(n) == "number"){//判断参数是不是数字的字符串形式并且对浮点数会自动向下取整
     8         n = parseInt(n);
     9     }
    10     if(isNaN(n)) return [];//判断参数是不是数字形式
    11     if(n<1||n>31)return [];//判断参数是不是在1到31范围内
    12     var arr = [];
    13     for(var i=0;i<n;i++){
    14         var ranNum = ranNumFrom2To32();
    15 if(checkNumInArr(ranNum,arr)){ 16 arr.push(ranNum); 17 }else{ 18 i--; 19 } 20 } 21 return arr; 22 } 23 24 /* 25 生成一个2到32的随机数 26 */ 27 function ranNumFrom2To32(){ 28 return Math.floor(Math.random()*31)+2; 29 } 30 /* 31 查看数组内是否已经存在num。返回布尔值。 32 */ 33 function checkNumInArr(num,arr){ 34 if(arr.length!=0){ 35 for(var j in arr){ 36 if(arr[j]==num){ 37 return false; 38 } 39 } 40 return true; 41 } 42 else{ 43 return true; 44 } 45 } 46 47 //测试 48 var Arr = randomArray("10"); 49 alert(Arr);

    其实,一句话,细节决定成败,想完成这个功能,大部分人都可以,但是细节的东西,我们都会忽略。

  • 相关阅读:
    Managing C++ Objects: 管理C++对象 —— 一些建议准则
    像Java一样管理对象:T&形式仅仅用在参数传递
    Visual Studio的语法着色终于调得赏心悦目
    j.u.c: Java并发包的5大块
    笔记:Java Language Specification
    线程与锁
    分布式系统涉及的基本问题
    微服务为什么是一种趋势
    js实现复制功能
    css label两端对齐
  • 原文地址:https://www.cnblogs.com/178-533/p/7486362.html
Copyright © 2011-2022 走看看