还是那几句话:
学无止境,精益求精
十年河东,十年河西,莫欺少年穷
学历代表你的过去,能力代表你的现在,学习代表你的将来
废话不多说,直接进入正题:
现在给你一道面试题,如下:
请用C++,C#,Java或VB.NET等任意一种面向对象语言实现一个计算机控制台程序,要求输入任意两个数字和一个运算符号,得到结果。
你会怎样设计这道程序呢?下面我列举各个面试人员的答卷并作分析(各位看官:看看有没有和你思路一样的答卷):
面试人员菜鸟一的答卷如下:
class Program { static void Main(string[] args) { Console.Write("请输入数字A:"); string A = Console.ReadLine(); Console.Write("请输入运算符号B:"); string B = Console.ReadLine(); Console.Write("请输入数字C:"); string C = Console.ReadLine(); double D=0; if (B == "+") { D = Convert.ToDouble(A) + Convert.ToDouble(C); } if (B == "-") { D = Convert.ToDouble(A) - Convert.ToDouble(C); } if (B == "*") { D = Convert.ToDouble(A) * Convert.ToDouble(C); } if (B == "/") { D = Convert.ToDouble(A) / Convert.ToDouble(C); } Console.WriteLine("结果为" + D); Console.ReadKey(); } }
针对菜鸟一的代码,我们作如下分析:
1、变量/函数命名不规范
2、判断分支意味着加减乘除四个判断都必须做,使计算机做了三次无用的判断
3、运算除法时,如果被除数为零时,会异常
总之:上述方法易读性差,易维护性差,不可重构,不可复用,不可扩展,不灵活。因此菜鸟一未被公司录用。
.
面试人员菜鸟二的答卷如下:
static void Main(string[] args) { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请输入运算符号:"); string strOperate = Console.ReadLine(); Console.Write("请输入数字B:"); string strNumberB = Console.ReadLine(); double strResult = 0; switch (strOperate) { case "+": strResult = Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB); break; case "-": strResult = Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB); break; case "*": strResult = Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB); break; case "/": if (strNumberB != "0") { strResult = Convert.ToDouble(strNumberA) / Convert.ToDouble(strNumberB); } else { Console.WriteLine("除数不能为零"); Console.ReadKey(); return; } break; } Console.WriteLine("结果为" + strResult); Console.ReadKey(); }
针对菜鸟二的答卷,我们作如下分析:
1、变量/函数命名基本规范
2、判断分支只运行一次
3、除法运算判断了被除数不能为零的情况
虽说基本实现了计算器加减乘数的功能
但是:
出题人的意思是利用面向对象语言设计一道计算器程序,菜鸟二的程序看似完美,但是并没有使用面向对象思想,因此:菜鸟二的面试结果亦是未被录取。
呜呜,那么怎么设计这道程序才能打动面试官呢?
现在我们深入分析菜鸟二的答卷
如下:
1、业务与输出没有分离
就如同ASP程序和ASP.NET的对比一样。在ASP程序中,页面的HTML代码和业务逻辑CS代码混在一起,看上去十分不舒服,而且容易出错!而,ASP.NET做了输出与业务的分离,也就是Aspx文件和Aspx.cs文件是分开了的!
2、