天天看點

子產品化程式設計:函數定義

在軟體開發的過程中,我們經常會重複的使用一些代碼片段,是以我們往往将這樣的代碼片段作為函數進行調用。

函數有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

繼續閱讀