新的一年即将开始,也意味着新的跳槽季即将到来,很多小伙伴要开始为自己的面试做准备了,那么在你面试时,面试官出了这样一道题,小伙伴们该怎么答呢?
面试题:请用C#实现一个计算器控制台程序,要求是任意输入两个数字和运算符得到计算结果。
如果小伙伴在读大学期间,编程语言学的比较好,这种题目,简直小意思,开写!
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入数字A:");
string A = Console.ReadLine();
Console.WriteLine("请选择运算符号(+、-、*、/):");
string B = Console.ReadLine();
Console.WriteLine("请输入数字B:");
string C = Console.ReadLine();
string D = "";
if (B=="+")
{
D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(B));
}
if (B == "-")
{
D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(B));
}
if (B == "*")
{
D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(B));
}
if (B == "/")
{
D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(B));
}
Console.WriteLine("结果是:" + D);
}
}
于是乎三下五除二解决了这道面试题。开开心心的回家等Offer去了。过了一天、两天,十天半个月了,期望中的Offer还没收到,这究竟是怎么回事呢?小伙伴们就会想,当初考试的时候我就是这么写的,没问题啊!
一、找出代码中的问题
原因出在哪里呢?好!那我从面试官的角度去帮小伙伴们分析一下。先不说面试官究竟想考察你哪方面的知识吧,就单单从这段代码来说就存在不少的问题。
1、命名不够规范:
观察上面的代码,通篇命名都是 string A, B, C, D;,类似这种没有任何意义的命名方式在正式开发中是不允许出现的,因为可读性不高,与其他人合作会很困难。
2、判断分支冗余:
类似这种从头到尾都是if语句判断分支的使用是不合理的,计算机在每一个分支处都要进行判断,无疑加大了性能损耗,虽然这种损耗微不足道,但是毕竟不是最好的处理方式。
3、业务逻辑漏洞:
(1)如果用户写除法时除数为0,此时又当如何?不用想,必然有问题,我们不能要求用户去注意除数不能输入0 ,而是要在程序中去杜绝它。
(2)如果用户随意输入一个字符串,而非数字,也必然会引起系统崩溃跳出。
及以上三点,小伙伴们说说这样一段简单的代码就有这么多问题,如果你是面试官,能让他通过吗?反正我是肯定不会让他通过的。于是乎,改吧!
二、改进1:增强代码健壮性
在代码进化的过程中,我们首先考虑的是代码的健壮性,至少保证程序不出错,少出错,不崩溃为第一前提:
class Program
{
private static void Main(string[] args)
{
try
{
Console.WriteLine("请输入左边数字数字:");
string numberLeft = Console.ReadLine();
Console.WriteLine("请选择运算符号(+、-、*、/):");
string operate = Console.ReadLine();
Console.WriteLine("请输入右边数字:");
string numberRight = Console.ReadLine();
string result = "";
switch (operate)
{
case "+":
result = Convert.ToString(Convert.ToDouble(numberLeft) + Convert.ToDouble(numberRight));
break;
case "-":
result = Convert.ToString(Convert.ToDouble(numberLeft) - Convert.ToDouble(numberRight));
break;
case "*":
result = Convert.ToString(Convert.ToDouble(numberLeft) * Convert.ToDouble(numberRight));
break;
case "/":
if (numberRight != "0")
{
result = Convert.ToString(Convert.ToDouble(numberLeft) / Convert.ToDouble(numberRight));
}
else
{
Console.WriteLine("除数不能为0");
}
break;
}
Console.WriteLine("结果是:" + result);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("输入有误:" + ex.Message);
}
}
}
改成这样,总该没有问题了吧!遵循了命名规范,优化了条件语句,避免了除数为0的情况,如果用户乱输入字符串,系统也会报错且不崩溃了。
对!写成这样,代码层面是没有太大问题了,虽然还是可以改进,例如用户输入非数字时给出提示,但是小伙伴们真的摸准考官的心思了吗?如果是这样的代码,换了是我,我只会给他开4k以下的工资。欲知如何让小伙伴们的工资突破8k甚至10k呢?且听下回分解!
小伙伴们,代码的进化是一个漫长的过程。随着我们的接触的项目不断增加,视野不断开拓,对代码的认识也会不断加深,但这是一个漫长的过程。小伙伴们要多思考,多留意才能不断提升自己。切勿出现段子里所说的:一程序员对老板说:“我有十五年的开发经验,为何只给我6k的工资?”,老板淡定的回答道:“你不是有十五年的开发经验,而是一个经验用了十五年!”


