一起谈.NET技术,写出优雅简明代码的论题集 -- Csharp(C#)篇[1]

  最近和一些朋友讨论如何写出优雅的代码,我们都很喜欢C#,所以以C#为例。主要一共有三位程序员在一起讨论,为简单起见我用ABC代表我们三个人。

  有时候我们会针对一些代码进行讨论,有时候我们会提出一些观点,有时候我们会一起学习网上一些现有的博客,为了便于大家引用,我给每一个论题都编上号。

  在很多情况下,我们的意见统一,那么我会给大家呈现我们的结论;但是有些情况我们有分歧。

  你可以加入我们的讨论,我非常也希望能够获知你的意见,让我们一起茁壮成长!

  好吧,让我们今天就开始。

  论题一:函数越小越好!

  相信绝大部分程序员会认同这一点,维护一个超过100行的函数会让人抓狂。

  我记得我以前修改过一个用cobol写的程序,一个文件超过10万行,我为了进行一个极其小的修改花了3天的时间,而且最后自己也不知道会不会造成什么严重的后果。-- 这已经过去8年了,希望那段代码运行良好。

  到底理想状态下,我们的函数应该不大于多少行?我们三个人的答案是:

  A: 10 行

  B: 15 行

  C: 20 行

  论题二:用 Linq 简化代码

  Linq有时可以帮助我们写出一些非常“人性”的语句。

  下面的这个函数是用于在数据库中插入新的评论:


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这一部分可以简化为:


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

  在这一点上,我们存在分歧,A认为没有必要进行简化,因为原来的已经很明确了;但B认为简化后的代码可读性更强,看上去更加直接。

   论题三:集合初始值

  希望每个人都已经知道C#的这个用法了,直接上一些代码:

  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 };

  论题四:运用 ?:和??

  据说,有些公司会拿这个来测试入门的程序员:

  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;

  还可以更简单,变成:


string name = value ?? string.Empty;

  论题五: 运用AS

  原始代码:


if (employee is SalariedEmployee)
{
var salEmp = (SalariedEmployee)employee;
pay = salEmp.WeeklySalary;
// ...
}

  修改后:


var salEmployee = employee as SalariedEmployee;
if (salEmployee != null)
{
pay = salEmployee.WeeklySalary;
// ...
}

  论题六: 运用 using

  using首次出现是在visual studio 2005 中,在这以前,很多程序员晕倒在了释放资源的逻辑中。使用using语句实际上生成的IL代码中是一个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群中,什么时候要调用哪个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到底给我们带来了什么:


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;
}

  好多了,对吗? 完全不用再用那一堆的try/finally 代码了,也不用使用一堆的null,为了使代码更轻巧,让我们再做小小修改:


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;
}

  未完待继…

时间: 2024-08-02 00:36:40

一起谈.NET技术,写出优雅简明代码的论题集 -- Csharp(C#)篇[1]的相关文章

一起谈.NET技术,写出优雅简明代码的论题集 -- Csharp(C#)篇[2]

谢谢大家对本系列第一篇写出优雅简明代码的论题集 -- Csharp(C#)篇[1]的回复和讨论,我相信针锋相对的辩论不仅有助于发现答案,更让我们了解问题后面的实质. 对程序员而言,我们的代码需要: 1. 在预算内实现需求,让用户可以使用 -- 让自己或者公司可以赚到钱 2. 方便自己修改及日后维护 3. 方便别人修改及日后维护 4. 便于重复使用,为以后的开发节省时间 5. 让系统高效的运作 从美国商学院毕业的学生们掌握了很多相似的思维模式,这不仅有利于他们解决问题,更重要的是方便他们彼此之间沟

写出优雅简明代码的论题集 -- Csharp(C#)篇[2“.NET研究”]

谢谢大家对本系列第一篇写出优雅简明代码的论题集 -- Csharp(C#)篇[1]的回复和讨论,我相信针锋相对的辩论不仅有助于发现答案,更让我们了解问题后面的实质. 对程序员而言,我们的代码需要: 1. 在预算内实现需求,让用户可以使用 -- 让自己或者公司可以赚到钱 2. 方便自己修改及日后维护 3. 方便别人修改及日后维护 4. 便于重复使用,为以后的开发节省时间 5. 让系统高效的运作 从美国商学院毕业的学生们掌握了很多相似的思维模式,这不仅有利于他们解决问题,更重要的是方便他们彼此之间沟

写出优雅简明代码的论题集 -- Csharp(C#)篇[2]

谢谢大家对本系列第一篇写出优雅简明代码的论题集 -- Csharp(C#)篇[1]的回复和讨论,我相信针锋相对的辩论不仅有助于发现答案,更让我们了解问题后面的实质. 对程序员而言,我们的代码需要: 1. 在预算内实现需求,让用户可以使用 -- 让自己或者公司可以赚到钱 2. 方便自己修改及日后维护 3. 方便别人修改及日后维护 4. 便于重复使用,为以后的开发节省时间 5. 让系统高效的运作 从美国商学院毕业的学生们掌握了很多相似的思维模式,这不仅有利于他们解决问题,更重要的是方便他们彼此之间沟

写出优雅简明代码的论题集 -- Csharp(C#)篇[1]

最近和一些朋友讨论如何写出优雅的代码,我们都很喜欢C#,所以以C#为例.主要一共有三位程序员在一起讨论,为简单起见我用ABC代表我们三个人. 有时候我们会针对一些代码进行讨论,有时候我们会提出一些观点,有时候我们会一起学习网上一些现有的博客,为了便于大家引用,我给每一个论题都编上号. 在很多情况下,我们的意见统一,那么我会给大家呈现我们的结论:但是有些情况我们有分歧. 你可以加入我们的讨论,我非常也希望能够获知你的意见,让我们一起茁壮成长! 好吧,让我们今天就开始. 论题一:函数越小越好! 相信

写出优雅简明代码的论题集 -- Cshar“.NET研究”p(C#)篇[1]

最近和一些朋友讨论如何写出优雅的代码,我们都很喜欢C#,所以以C#为例.主要一共有三位程序员在一起讨论,为简单起见我用ABC代表我们三个人. 有时候我们会针对一些代码进行讨论,有时候我们会提出一些观点,有时候我们会一起学习网上一些现有的博客,为了便于大家引用,我给每一个论题都编上号. 在很多情况下,我们的意见统一,那么我会给大家呈现我们的结论:但是有些情况我们有分歧. 你可以加入我们的讨论,我非常也希望能够获知你的意见,让我们一起茁壮成长! 好吧,让我们今天就开始. 论题一:函数越小越好! 相信

如何利用长尾技术写出高质量原创文章

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 高质量原创内容相信是所有梦寐以求的吧.但是由于行业竞争和内容爆炸性的增长速度,导致许多站长对于如何写出高质量原创文章是一筹莫展了!下面小李子就根据自己几年来的工作经验来教站长们如何利用长尾技术写出高质量原创文章! 关键词的长尾理论相信大家并不陌生吧!大家在做站时都知道是金字塔的形式布局网站关键词.主词+长尾词的形式优化关键词已经成了所有站长通

怎样才能写出优秀的代码?

1.只有在需要的时候才使用PHP--Rasmus Lerdorf(PHP创始人) 不要什么事都让PHP来做,PHP只是一种工具,每一种语言都会有自身的限制当不能用PHP来解决时,不要害怕使用其他的语言 2.尽可能地在MySQL里多用表--Matt Mullenweg(wordpress创始人) 3.永远不要相信你的用户--Dave Child Dave Child是Added Bytes的创作者(前身:www.ilovejackdaniels.com).为好几门语言创建了cheat sheet(

如何写出无法维护的代码

这篇文章的原文在这里(http://mindprod.com/jgloss/unmain.html),我看完后我想说 什么叫"创造力",创造力就是就算是要干一件烂事都能干得那么漂亮那么有创意的能力. 什么叫"抓狂",抓狂就是以一种沉着老练的不屈不挠的一本正经的精神一点一点把你推向崩溃的边缘. 我把文章节选了一些,也并没有完全翻译,简译一下,也加入了一些自己的调侃.对于有下面这些编程习惯的朋友,请大家对号入座.另外,维护程序的朋友们,你们死定了!! If builde

如何用JAVA写出健壮的代码

问题描述 如何用JAVA写出健壮的代码来源:java私塾时间:2008-6-30这是一些相当不错的忠告!每个规则都很有分量!都是长期经验积累的总结,希望能对您有所帮助,使您编出高质量的JAVA代码.(1)类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如:ThisIsAClassNamethisIsMethodOrFieldName若在定义中出现了常数初始化字符,则大写staticfinal基本类型标识符