设计模式一 工厂模式 (1)

来源:互联网 发布:淘宝集分宝在哪里查看 编辑:程序博客网 时间:2024/04/29 08:26

面试题目:请用任意一种语言以面向对象方式编写一个计算器代码

最初始代码

public void DoOperation()

{

            //输入
            Console.Write("请输入数字A");
            string A = Console.ReadLine();
            Console.Write("请选择计算符号+,-,* ,/");
            string B = Console.ReadLine();
            Console.Write("请输入数字C");
            string C = Console.ReadLine();
            string D = "";

            //判断计算过程
            if (B == "+")
            {
                D = Convert.ToString(Convert.ToInt32(A) + Convert.ToInt32(B));
            }

            if (B == "-")
            {
                D = Convert.ToString(Convert.ToInt32(A) - Convert.ToInt32(B));
            }

            if (B == "*")
            {
                D = Convert.ToString(Convert.ToInt32(A) * Convert.ToInt32(B));
            }

            if (B == "/")
            {
                D = Convert.ToString(Convert.ToInt32(A) / Convert.ToInt32(B));
            }

 

            //输出结果
            Console.ReadLine("结果是:" + D);

}

            上述代码存在初学者最基本的几个问题点
            1:代码的规范性 A  B  C  D
            2:对于if 的判断分支对计算机而言每个分支都要去做判断,等于做了三次无效工.
            3:除法分支没有做最基本的分母零校验


            修改后代码如下:

         /// <summary>
        /// 计算加减乘除的计算器方法
        /// </summary>
 public static void DoOperation()
 {

             //输入
            Console.Write("请输入数字A");
            string strNumberA = Console.ReadLine();
            Console.Write("请选择计算符号+,-,* ,/");
            string strOperate = Console.ReadLine();
            Console.Write("请输入数字C");
            string strNumberB = Console.ReadLine();
            string strResult= "";

            //判断计算过程
            switch(strOperate)
            {
                case "+":
                    strResult = Convert.ToString(Convert.ToInt32(strNumberA) + Convert.ToInt32(strNumberB));
                    break;

                case "-":
                    strResult = Convert.ToString(Convert.ToInt32(strNumberA) + Convert.ToInt32(strNumberB));
                    break;

                case "*":
                    strResult = Convert.ToString(Convert.ToInt32(strNumberA) + Convert.ToInt32(strNumberB));
                    break;

                case "/":
                    if(strNumberB != "0")
                    {
                        strResult = Convert.ToString(Convert.ToInt32(strNumberA) + Convert.ToInt32(strNumberB));
                    }
                    else
                    {
                        strResult ="除数不能为0";
                    }
                    break;

            }

            //输出结果
            Console.ReadLine("结果是:" + strResult);

  }
   

但是就上面而言是否达到了面试官的要求了呢?面向对象 这里有对象这个概念吗?以上写法都是程序员根据自己的思维逻辑思路写下来的,虽然结果出来了但是不是面试官要的。

 

个人体会:目前的我也一直出现在这个层次,真的非常的可怕.一旦碰到问题就直觉的用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程,其实是用计算机的方式去思考,譬如上述程序,输入两个数字 输出一个结果,这本身没有错误,但是这样的思维却使得我们的程序只为满足实现当前的需求,程序不容易维护,不容易扩展,更不让容易复用,从而达不到高质量代码的要求.

下一节我们就针对上述问题引出面向对象方法