模块化程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•
{
•
double result = 0;
•
result = NumberA + NumberB;
•
return result;
•
}
•}
• class OperationSub : Operation
•{
•
public override double GetResult()
•
{
•
double result = 0;
程序进行合理的模块化分割。 • 分割的依据如下: • 第一,分析目前团队人数,团队技术实力分配。
• 在一个团队中,每个人的技术研究方向和实力都很难保持一致,这也就导致 了“合理”分配的困难。模块化分割的时候必须充分考虑分割出的模块能够 分配给最适合去完成它的人!
简单程序小例子
这是一个十分简单的计算器小例子:程序的功能只有输入两个数和运算 符,然后计算出运算结果。这是程序一,直接编写。
•
string strOperate = Console.ReadLine();
•
Console.Write("请输入数字B:");
•
string strNumberB = Console.ReadLine();
•
string strResult = "";
•
strResult =
Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA),Con
• class Program
•{
•
static void Main(string[] args)
•
{
•
Console.Write("请输入数字A:");
•
string A = Console.ReadLine();
•
Console.Write("请选择运算符号(+,-,*,/):");
•
string B = Console.ReadLine();
set{_numberB = value;}
}
public virtual double GetResult()
{
double result = 0;
return result;
}
• class OperationAdd : Operation
•{
•
public override double GetResult()
•
{
•
Console.WriteLine("您的输入有错:" + ex.Message);
•
}
•
}
•}
模块化二
从两个程序的对比中能够看出程序在改进之后比原先的程序结构更加清
晰了,也更容易增加新功能和拓展了,但是能否还能继续进一步改进呢?
我们继续往下看,继续利用模块化的思想对程序进行改进。
• Operation运算类
•
break;
•
case "*":
• Convert.ToDouble
strResult = Convert.ToString(Convert.ToDouble(strNumberA) * (strNumberB));
•
break;
•
case "/":
•
if(strNumberB != "0")
• Convert.ToString(Convert.ToDouble(strNumberA) /
•
if(B == "/")
•
D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C));
•
Console.WriteLine("结果是:" + D);
•
}
•}
模块化一
这么简单的迷你小程序可以模块化吗?其实程序真的无论大小,都是完 全可以进行模块化处理的,下面我们就来看看第一个改进后的版本。
•
result = numberA + numberB;
•
break;
•
case "-":
•
result = numberA - numberB;
•
break;
•
case "*":
•
result = numberA * numberB;
•
break;
•
case "/":
•
result = numberA + numberB;
vert.ToDouble(strNumberB),strOperate));
•
Console.WriteLine("结果是:" + strResult);
•
Console.ReadLine();
•
}
•
catch(Exception ex)
•
{
•
Console.WriteLine("您的输入有错:" + ex.Message);
•
{
•
case "+":
• Convert.ToDouble
strResult = Convert.ToString(Convert.ToDouble(strNumberA) + (strNumberB));
•
break;
•
case "-":
• Convert.ToDouble
strResult = Convert.ToString(Convert.ToDouble(strNumberA) (strNumberB));
• 没有模块化设计的程序是极其难以阅读和改进的,即便是程序的作者 本人,在一段时间后,也很难重新对程序进行修改。
第二,模块化程序设计个人认为是编程的核心所在,即便现在有了“面 向对象”的编程,可以面向对象的编程在某种程度上也是对模块化的 一种延伸,使得程序的组织结构更加富有层次感,立体感和降低程序 的耦合度!
• class Program
•{
•
static void Main(string[] args)
•
{
•
tryห้องสมุดไป่ตู้
•
{
•
Console.Write("请输入数字A:");
•
string strNumberA = Console.ReadLine();
• /):");
Console.Write("请选择运算符号(+,-,*,
•
string strOperation = Console.ReadLine();
•
Console.Write("请输入数字B:");
•
string strNumberB = Console.ReadLine();
•
string strResult = "";
• switch(strOperation)
• 第二,很多情况下程序模块化设计需要“浪费”很多时间,例如增加 了代码的数量,增加了构思的时间。
• 第三,很多编程学习者体验到了他们不用模块化设计,到最后也可以 顺利完成程序,程序可以正常运行。
• 那么既然不用模块化设计更加便利和快速,为什么还需要模块化的程 序设计呢?为什么不把所有的程序代码都写在一个main()函数中呢? 为什么不按照傻瓜式的流水线从头到尾写代码,而是要去考虑一个一 个模块的功能呢?
模块化设计
模块化设计,这个概念几乎是在每个刚 接触软件编程设计学习时就会被不断提醒的。 但是真正地去理解和使用模块化,将其应用于 所编写的程序上的变成学习者却不多。这是为 什么呢?
原因大概如下:
第一,大多数的编程学习者在一开始接 触和学习到的程序很小,代码量很少,甚至只 有几十行。对于这样短小的程序进行模块化设 计的确是有难度的(不过哪怕是再短小的程序, 都可以实现模块化设计!)。
•
}
•}
模块化三
是不是再次感觉程序的模块更加清晰了,可是这会是这个简单的小程序 的模块化的终点吗?我们继续往下看,继续升级和改进的版本:
• public class Operation
•{
•
private double _numberA = 0;
•
private double _numberB = 0;
• 第三,几乎所有商用程序都必须使用模块化程序设计理念!这里很想 使用“全部”代替“几乎”,因为真的很难想像没有模块化的商用软 件!
• 那么究竟如何进行模块化的程序设计呢?
• 其实不得不说很遗憾,虽然极尽全力地想从互联网上搜索出详尽的资 料,希望能够得到一个商用软件的模块化设计流程,但是因为各公司 之间的商业保密和竞争,这部分的资料实在是少得可怜。这在很大程 序上也造成了编程学习者难以学习真正的模块化程序设计!编程初学 者难以了解一个商用软件(比如说暴风影音,QQ等)究竟是如何进 行多人合作编写的,究竟是如何进行模块化划分的!
• public class Operation
•{
•
public static double GetResult(double numberA,double numberB,string operate)
•
{
•
double result = 0d;
•
switch(operate)
•
{
•
case "+":
• • • • • • • • • • • • • • • •}
public
public double NumberA
{
get{return _numberA;}
set{_numberA = value;}
}
public
public double NumberB
{
get{return _numberB;}
模块化程序设计的优点
• 第一,把所有代码都统统写在一个main()函数中是疯狂的做法(虽然 大部分的编程教学书籍都这样做)!为什么会疯狂呢,很多学习者都 是这样写的,而且最后程序成功执行!
• 这样的想法在很多时候都会萌生,因为学习者刚开始编写的大多数程 序都是“一次性”的快餐程序!学习者一旦完成了程序,就根本不需 要回头修改,或者是以后再阅读。
•
Console.Write("请输入数字B:");
•
string C = Console.ReadLine();
•
string D = "";
•
if(B == "+")
•
D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C));
•
result = NumberA - NumberB;
•
return result;
•
}
•}
• class OperationMul : Operation
•{
•
public override double GetResult()
•
{
•
double result = 0;
•
result = NumberA * NumberB;
•
if(B == "-")
•
D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C));
•
if(B == "*")
•
D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C));
strResult =
Convert.ToDouble(strNumberB));
•
else
•
strResult = "除数不能为0";
•
break;
•
}
•
Console.WriteLine("结果是:" + strResult);
•
Console.ReadLine();
•
•
}
•
catch(Exception ex)
• 模块化程序设计并不仅仅只是多写函数,多分文件这么简单!
如何进行模块化程序设计
• 鉴于收集到资料实在有限和个人水平有限,这里只能够浅谈一点,当 作抛砖引玉。
• 所谓模块化,就是要把一个整体的设计进行“合理”的拆分成很多小 部分。
• 在这个过程中,其实“合理”是最难的! • 当程序的设计思路被提出,然后准备着手设计的时候,首先就是要对
•
break;
•
}
•
return result;
•
}
•}
• 客户端代码:
• static void Main(string[] args)
•{
•
try
•
{
•
Console.Write("请输入数字A:");
•
string strNumberA = Console.ReadLine();
•
Console.Write("请选择运算符号(+,-,*,/):");
•
result = NumberA / NumberB;
•
return result;
•
}
•}
• 简单运算工厂类:
• public class OperationFactory
•{
•
public static Operation createOperation(string operate)
•
return result;
•
}
•}
• class OperationDiv : Operation
•{
•
public override double GetResult()
•
{
•
double result = 0;
•
if(NumberB == 0)
•
throw new Exception("除数不能为0");