麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

寫出優(yōu)雅簡(jiǎn)明代碼的論題集 -- Csharp(C#)篇[1]

2019-11-17 03:35:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近和一些朋友討論如何寫出優(yōu)雅的代碼,我們都很喜歡C#,所以以C#為例。主要一共有三位程序員在一起討論,為簡(jiǎn)單起見(jiàn)我用ABC代表我們?nèi)齻€(gè)人。

有時(shí)候我們會(huì)針對(duì)一些代碼進(jìn)行討論,有時(shí)候我們會(huì)提出一些觀點(diǎn),有時(shí)候我們會(huì)一起學(xué)習(xí)網(wǎng)上一些現(xiàn)有的博客,為了便于大家引用,我給每一個(gè)論題都編上號(hào)。

在很多情況下,我們的意見(jiàn)統(tǒng)一,那么我會(huì)給大家呈現(xiàn)我們的結(jié)論;但是有些情況我們有分歧。

你可以加入我們的討論,我非常也希望能夠獲知你的意見(jiàn),讓我們一起茁壯成長(zhǎng)!

好吧,讓我們今天就開(kāi)始。

論題一:函數(shù)越小越好!


相信絕大部分程序員會(huì)認(rèn)同這一點(diǎn),維護(hù)一個(gè)超過(guò)100行的函數(shù)會(huì)讓人抓狂。

我記得我以前修改過(guò)一個(gè)用cobol寫的程序,一個(gè)文件超過(guò)10萬(wàn)行,我為了進(jìn)行一個(gè)極其小的修改花了3天的時(shí)間,而且最后自己也不知道會(huì)不會(huì)造成什么嚴(yán)重的后果。-- 這已經(jīng)過(guò)去8年了,希望那段代碼運(yùn)行良好。

到底理想狀態(tài)下,我們的函數(shù)應(yīng)該不大于多少行?我們?nèi)齻€(gè)人的答案是:

A: 10 行

B: 15 行

C: 20 行

論題二:用 Linq 簡(jiǎn)化代碼
Linq有時(shí)可以幫助我們寫出一些非常“人性”的語(yǔ)句。

下面的這個(gè)函數(shù)是用于在數(shù)據(jù)庫(kù)中插入新的評(píng)論:

         public static void Create(IEnumerable<CommentData> Comments, SqlConnection cn)
        {
            // validate params
            if (null == cn) throw new ArgumentNullException("cn");
            if (cn.State != ConnectionState.Open) throw new ArgumentException("Invalid parameter: connection is not open.", "cn");
            if (null == Comments) throw new ArgumentNullException("Comments");
            foreach (CommentData data in Comments)
            {
                if (data.CommentId.HasValue)
                    throw new ArgumentNullException("Create is only for saving new data.  Call save for existing data.", "data");
            }
....
其中foreach這一部分可以簡(jiǎn)化為

             if (Comments.Any(data => data.CommentId.HasValue))
            {
                throw new ArgumentNullException("Create is only for saving new data.  Call save for existing data.", "data");
            }


在這一點(diǎn)上,我們存在分歧,A認(rèn)為沒(méi)有必要進(jìn)行簡(jiǎn)化,因?yàn)樵瓉?lái)的已經(jīng)很明確了;但B認(rèn)為簡(jiǎn)化后的代碼可讀性更強(qiáng),看上去更加直接。

  論題三:集合初始值
希望每個(gè)人都已經(jīng)知道C#的這個(gè)用法了,直接上一些代碼:

3.1

原始代碼:

 List<int> idsToFind = new List<int>();
idsToFind.Add(1);
idsToFind.Add(2);
修改后:

 List<int> idsToFind = new List<int> {1, 2};
3.2

原始代碼:

 var startingPoint = new Point();
startingPoint.X = 5;
startingPoint.Y = 13;
修改后: var startingPoint = new Point() { X = 5, Y = 13 };
論題四:運(yùn)用 ?:和??
據(jù)說(shuō),有些公司會(huì)拿這個(gè)來(lái)測(cè)試入門的程序員:

4.1

原始代碼:

 if (c != null)
    System.Console.WriteLine(c.Name);
else
    System.Console.WriteLine("List element has null value.");
修改后:

 System.Console.WriteLine(c != null ? c.Name : "List element has null value.");
4.2

原始代碼:

 string name = value;  
if (value == null)
{
name = string.Empty;
}
修改后:   string name = (value != null) ? value : string.Empty;
還可以更簡(jiǎn)單,變成: string name = value ?? string.Empty;
論題五: 運(yùn)用AS
原始代碼:

 if (employee is SalariedEmployee)

{
    var salEmp = (SalariedEmployee)employee;
    pay = salEmp.WeeklySalary;
    // ...
}
修改后:

 var salEmployee = employee as SalariedEmployee;
if (salEmployee != null)
{
   pay = salEmployee.WeeklySalary;
    // ...
}
論題六: 運(yùn)用 using
using首次出現(xiàn)是在visual studio 2005 中,在這以前,很多程序員暈倒在了釋放資源的邏輯中。使用using語(yǔ)句實(shí)際上生成的IL代碼中是一個(gè)try, finally代碼塊,在finally代碼塊里釋放資源。

原始代碼: public IEnumerable<Order> GetOrders()

{
    var orders = new List<Order>();
    var con = new SqlConnection("some connection string");
    var cmd = new SqlCommand("select * from orders", con);
    var rs = cmd.ExecuteReader();
    while (rs.Read())

    {

        // ...

    }
    rs.Dispose();
    cmd.Dispose();
    con.Dispose();
    return orders;
}
這是一段非常丑陋的代碼,我們完全迷失在dispose群中,什么時(shí)候要調(diào)用哪個(gè)dispose啊? 天哪? 如果我們用 finally, 可以將代碼寫為:

        public IEnumerable<Order> GetOrders()

{

    SqlConnection con = null;

    SqlCommand cmd = null;

    SqlDataReader rs = null;

    var orders = new List<Order>();

    try

    {

        con = new SqlConnection("some connection string");

        cmd = new SqlCommand("select * from orders", con);

        rs = cmd.ExecuteReader();

        while (rs.Read())

        {

            // ...

        }

    }

    finally

    {

        rs.Dispose();

        cmd.Dispose();

        con.Dispose();

    }

    return orders;

}

看看using到底給我們帶來(lái)了什么:

  public IEnumerable<Order> GetOrders()

{

    var orders = new List<Order>();
   using (var con = new SqlConnection("some connection string"))
    {
        using (var cmd = new SqlCommand("select * from orders", con))
        {
            using (var rs = cmd.ExecuteReader())
            {
                while (rs.Read())
                {

                    // ...

                }

            }

        }

    }
    return orders;
} 好多了,對(duì)嗎? 完全不用再用那一堆的try/finally 代碼了,也不用使用一堆的null,為了使代碼更輕巧,讓我們?cè)僮鲂⌒⌒薷模?BR>       public IEnumerable<Order> GetOrders()
{

    var orders = new List<Order>();

    using (var con = new SqlConnection("some connection string"))
    using (var cmd = new SqlCommand("select * from orders", con))
    using (var rs = cmd.ExecuteReader())
    {
        while (rs.Read())
        {
           // ...
        }
    }
    return orders;

}

未完待繼…


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 午夜视频中文字幕 | xvideos korean| 在线看免电影网站 | 午夜久 | 舌头伸进添的我好爽高潮网站 | 99视频观看 | 久久国产精品区 | 久久国产精品影视 | 日日鲁一鲁视频 | 国产一级毛片在线看 | 全黄性性激高免费视频 | 毛片在哪看 | 国产小视频在线观看 | 日本不卡一区二区三区在线观看 | 美女一级视频 | 茄子福利视频 | 日本视频免费看 | 精品一区在线视频 | 黄色片视频在线观看 | fc2成人免费人成在线观看播放 | 羞羞的 | 91懂色 | 老师你怎么会在这第2季出现 | 国产精品久久国产精麻豆96堂 | h视频在线免费观看 | 亚洲成人涩涩 | wwwxxx视频| av在线看网站 | 久久久三区 | 日本不卡一区二区三区在线 | 综合在线一区 | 91羞羞 | 精品一区二区6 | 91色成人| 色婷婷a| 亚洲精品久久久久www | 成人毛片在线免费观看 | 羞羞视频免费视频欧美 | 9191色 | 国产91久久精品一区二区 | 精国产品一区二区三区 |