模块化编程:函数定义

在软件开发的过程中,我们经常会重复的使用一些代码片段,因此我们往往将这样的代码片段作为函数进行调用。

函数有4种模式的定义和使用

q 有参数,有返回值:y=f(x)

q 有参数,无返回值:f(x)

q 无参数,有返回值:y=f()

q 无参数,无返回值:f()

在游戏、图形、建筑领域的软件应用中,我们经常需要计算几何图形的面积。对于这些经常需要使用的计算,我们往往将计算的代码封装为函数进行使用。

ContractedBlock.gifExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->///<summary>
///计算长方形面积
///</summary>
///<paramname="x"></param>
///<paramname="y"></param>
///<returns></returns>
publicstaticdoubleRectangleArea(intx,inty)
{
returnx*y;
}

///<summary>
///计算正方形的面积
///</summary>
///<paramname="x">边长</param>
///<returns></returns>
publicstaticdoubleSquareArea(intx)
{
returnx*x;
}

///<summary>
///计算梯形的面积
///</summary>
///<paramname="top">上底</param>
///<paramname="bottom">下底</param>
///<paramname="h"></param>
///<returns></returns>
publicstaticdoubleTrapeziumArea(inttop,intbottom,inth)
{
return(top+bottom)*h/2;
}

我们来分析第一个double RectangleArea(int x, int y)函数的定义:

q Double是定义了返回值

q RectangleArea是函数的名字

q int x, int y称为函数的参数

以上函数的调用方式可以如下

ContractedBlock.gifExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->staticvoidMain(string[]args)
{

doublerectArea=RectangleArea(10,12);
System.Console.WriteLine(
"该长方形的面积为{0}",rectArea);
System.Console.WriteLine(
"该正方形的面积为{0}",SquareArea(11));
System.Console.WriteLine(
"该梯形的面积为{0}",TrapeziumArea(7,8,9));

}

初学者注意:

现代的商业软件开发,要求代码具有优秀的可读性和维护性,因此我们需要将重复使用的算法用模块的方式提炼为函数,通过对函数的调用优化代码。

在编写函数的时候要牢记一个原则,即:单一职责原则。一个函数所执行的功能应该非常的单一,不应该有不同的行为。比如以下代码就是违反环了单一职责原则。

ContractedBlock.gifExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->classProgram
{
staticvoidMain(string[]args)
{
RectangleArea(
10,12);
SquareArea(
11);
TrapeziumArea(
7,8,9);
}

///<summary>
///计算长方形面积
///</summary>
///<paramname="x"></param>
///<paramname="y"></param>
///<returns></returns>
publicstaticvoidRectangleArea(intx,inty)
{
System.Console.WriteLine(
"该长方形的面积为{0}",x*y);
}

///<summary>
///计算正方形的面积
///</summary>
///<paramname="x">边长</param>
///<returns></returns>
publicstaticvoidSquareArea(intx)
{
System.Console.WriteLine(
"该长方形的面积为{0}",x*x);
}

///<summary>
///计算梯形的面积
///</summary>
///<paramname="top">上底</param>
///<paramname="bottom">下底</param>
///<paramname="h"></param>
///<returns></returns>
publicstaticvoidTrapeziumArea(inttop,intbottom,inth)
{
System.Console.WriteLine(
"该梯形的面积为{0}",(top+bottom)*h/2);
}
}

仔细比较两段代码,你会发现后续的代码仅仅是把WriteLine迁移到了计算面积的方法体内,在这样的情况下,你似乎觉得在调用的时候只有更方便了

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->staticvoidMain(string[]args)
{
RectangleArea(
10,12);
SquareArea(
11);
TrapeziumArea(
7,8,9);
}

其实不然,新处理的三个方法违反了职责单一原则,在方法中又作了计算又参与了呈现。这样的模型不合理之处是当用户需要不同的呈现样式的时候,你必须修改这三个方法,而无法将算法重用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值