天天看点

模块化编程:函数定义

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

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

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

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

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

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

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

/// <summary>  

/// 计算长方形面积  

/// </summary>  

/// <param name="x">长</param>  

/// <param name="y">宽</param>  

/// <returns></returns>  

public static double RectangleArea(int x, int y)  

{  

    return x * y;  

}  

/// 计算正方形的面积  

/// <param name="x">边长</param>  

public static double SquareArea(int x)  

    return x * x;  

/// 计算梯形的面积  

/// <param name="top">上底</param>  

/// <param name="bottom">下底</param>  

/// <param name="h">高</param>  

public static double TrapeziumArea(int top,int bottom,int h)  

    return (top + bottom) * h / 2;  

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

q Double是定义了返回值

q RectangleArea是函数的名字

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

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

static void Main(string[] args)  

    double rectArea = RectangleArea(10, 12);  

    System.Console.WriteLine("该长方形的面积为{0}",rectArea);  

    System.Console.WriteLine("该正方形的面积为{0}", SquareArea(11));  

    System.Console.WriteLine("该梯形的面积为{0}", TrapeziumArea(7, 8, 9));  

初学者注意:

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

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

class Program  

    static void Main(string[] args)  

    {  

        RectangleArea(10, 12);  

        SquareArea(11);  

        TrapeziumArea(7, 8, 9);  

    }  

    /// <summary>  

    /// 计算长方形面积  

    /// </summary>  

    /// <param name="x">长</param>  

    /// <param name="y">宽</param>  

    /// <returns></returns>  

    public static void RectangleArea(int x, int y)  

        System.Console.WriteLine("该长方形的面积为{0}", x * y);  

    /// 计算正方形的面积  

    /// <param name="x">边长</param>  

    public static void SquareArea(int x)  

        System.Console.WriteLine("该长方形的面积为{0}", x * x);  

    /// 计算梯形的面积  

    /// <param name="top">上底</param>  

    /// <param name="bottom">下底</param>  

    /// <param name="h">高</param>  

    public static void TrapeziumArea(int top, int bottom, int h)  

        System.Console.WriteLine("该梯形的面积为{0}", (top + bottom) * h / 2);  

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

static void Main(string[] args)

{

RectangleArea(10, 12);

SquareArea(11);

TrapeziumArea(7, 8, 9);

}

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

本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/805194

继续阅读