小菜编程成长记(一 面试受挫——代码无错就是好?)第2/3页

 更新时间:2006年10月17日 00:00:00   作者:  

三 复制VS复用

小菜:“我明白了,他说用任意一种面向对象语言实现,那意思就是要用面向对象的编程方法去实现,对吗?OK,这个我学过,只不过当时我没想到而已。”

大鸟:“所有编程初学者都会有这样的问题,就是碰到问题就直觉的用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程。这其实是用计算机的方式去思考,比如计算器这个程序,先要求输入两个数和运算符号,然后根据运算符号判断选择如何运算,得到结果,这本身没有错,但这样的思维却使得我们的程序只为满足实现当前的需求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。”

小菜:“鸟哥呀,我有点糊涂了,如何才能容易维护,容易扩展,又容易复用呢,能不能具体点?”

大鸟:“比如说,我现在要求你再写一个windows的计算器,你现在的代码能不能复用呢?”

小菜:“那还不简单,把代码复制过去不就行了吗?改动又不大,不算麻烦。”

大鸟:“小菜看来还是小菜呀,有人说初级程序员的工作就是Ctrl+C和Ctrl+V,这其实是非常不好的编码习惯,因为当你的代码中重复的代码多到一定程度,维护的时候,可能就是一场灾难。越大的系统,这种方式带来的问题越严重,编程有一原则,就是用尽可能的办法去避免重复。想想看,你写的这段代码,有哪些是和控制台无关的,而只是和计算器有关的?”

四 业务的封装

小菜:“你的意思是分一个类出来? 哦,对的,让计算和显示分开。”

大鸟:“准确的说,就是让业务逻辑与界面逻辑分开,让它们之间的耦合度下降。只有分离开,才容易达到容易维护或扩展。”

小菜:“让我来试试看。”
复制代码 代码如下:

class Program
{
static void Main(string[] args)
{
try
{
Console.Write("请输入数字A:");
string strNumberA = Console.ReadLine();
Console.Write("请选择运算符号(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("请输入数字B:");
string strNumberB = Console.ReadLine();
string strResult = "";

strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA),Convert.ToDouble(strNumberB),strOperate));

Console.WriteLine("结果是:" + strResult);

Console.ReadLine();

}
catch (Exception ex)
{
Console.WriteLine("您的输入有错:" + ex.Message);
}
}
}

public class Operation
{
public static double GetResult(double numberA,double numberB,string operate)
{
double result = 0d;
switch (operate)
{
case "+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
}
return result;
}
}


小菜:“鸟哥,我写好了,你看看!”

大鸟:“哈,孺鸟可教也,:),写得不错,这样就完全把业务和界面分离了。”

小菜心中暗骂:“你才是鸟呢。” 口中说道:“如果你现在要我写一个Windows应用程序的计算器,我就可以复用这个运算类(Operation)了。”

大鸟:“不单是Windows程序,Web版程序需要运算可以用它,PDA,手机等需要移动系统的软件需要运算也可以用它呀。”

小菜:“哈,面向对象不过如此。下会写类似代码不怕了。”

大鸟:“别急,仅此而已,实在谈不上完全面向对象,你只用了面向对象三大特性的一个,还两个没用呢?”

小菜:“面向对象三大特性不就是封装、继承和多态吗,这里我用到的应该是封装。这还不够吗?…………我实在看不出,这么小的程序如何用到继承。至于多态,其它我一直也不太了解它到底有什么好处,如何使用它。”

大鸟:“慢慢来,有的东西好学了,你好好想想吧,我要去“魔兽”了,改时聊。”

相关文章

  • c# 重载WndProc,实现重写“最小化”的实现方法

    c# 重载WndProc,实现重写“最小化”的实现方法

    在做“亦歌桌面版”的时候,发现当打开歌词状态下,用最小化隐藏窗体到托盘的话(如下code #1),在调出发现歌词缩小了(虽然显现的窗体大小跟刚才一样),从这点看调用该方法其实窗体大小是改变了的(这个过程只是不可视而已)。
    2009-02-02
  • c# 删除所有的空文件夹的小例子

    c# 删除所有的空文件夹的小例子

    c# 删除所有的空文件夹的小例子,需要的朋友可以参考一下
    2013-03-03
  • C#简易图片格式转换器实现方法

    C#简易图片格式转换器实现方法

    这篇文章主要介绍了C#简易图片格式转换器实现方法,涉及C#基于WinForm操作图片的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C#实现绘制面形图表的方法详解

    C#实现绘制面形图表的方法详解

    这篇文章主要介绍了C#实现绘制面形图表的方法,对于C#初学者很好的掌握C#图形绘制有一定的借鉴价值,需要的朋友可以参考下
    2014-07-07
  • Unity中的静态批处理和动态批处理操作

    Unity中的静态批处理和动态批处理操作

    这篇文章主要介绍了Unity中的静态批处理和动态批处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#图像处理之浮雕效果实现方法

    C#图像处理之浮雕效果实现方法

    这篇文章主要介绍了C#图像处理之浮雕效果实现方法,可实现图片转换成浮雕效果的功能,需要的朋友可以参考下
    2015-04-04
  • C#中Stopwatch的使用及说明

    C#中Stopwatch的使用及说明

    这篇文章主要介绍了C#中Stopwatch的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 详解WPF如何显示具有层级关系的数据

    详解WPF如何显示具有层级关系的数据

    这篇文章主要为大家详细介绍了在WPF中如何显示具有层级关系的数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • WinForm实现的图片拖拽与缩放功能示例

    WinForm实现的图片拖拽与缩放功能示例

    这篇文章主要介绍了WinForm实现的图片拖拽与缩放功能,结合具体实例形式分析了WinForm鼠标事件响应及图片元素动态操作相关实现技巧,需要的朋友可以参考下
    2017-05-05
  • C# 数组中的 indexOf 方法及使用

    C# 数组中的 indexOf 方法及使用

    这篇文章主要介绍了C# 数组中的 indexOf 方法以及indexof方法的使用讲解,需要的朋友可以参考下
    2018-02-02

最新评论