谈写代码的原则:性能高效 方法简洁 思路清晰 整体美观


  我们的程序课只关心能不能把一个功能实现。不会关注怎么实现以及背后的原理。我坚信性能非常重要,给客户做项目,三天两头出问题,动不动系统崩溃。写出来的网站访问量一大就报503.经常遭到黑客攻击,资料被改得面目全非。后果很严重。

举几个个课堂例子说明此原则:

//字符串拼接

下面是课堂上的代码
string sqlstr="insert into 库存('"+txt_hh+"'"+
",'"+txt_hm + "','" +
txt_gg + "'," +txt_jldw + ",'"+
txt_kcsl + "','"+txt_jhrq + "','" +txt_shr + "','" +
txt_ghs + "','"+
")"

  抬头看到这坨东西,心里非常不舒服。我看了老师调试这段代码,短短不过10行,错误不少。单单上面的sqlstr他就改了很多次,不是少了引号就是漏了括号,有次txthh没有加Text.

  老师语重心长地说这块不好看懂,你们多多注意。

  我当即提出,拼接出来sql语句缺点太多,写得这么费劲,看的也吃力,改起来费劲加费劲,为什么一定要用这种方法拼接sql,

  他回答:方法有很多,这种方法在所有的语言都适用。只要熟练了不写错就行。听起来貌似很对是不是?我当时就震惊了,原来他所谓的写代码原则是兼容所有的语言?!!还指望把C#代码放到apache、tomcat上运行吗?

  的确很多语言都支持拼接字符串。但是有点经验的程序员绝对不会用
原因有三:

  第一:非常危险,容易拼接出恶意语句(最主要原因)。

  第二:.NET中字符串对象恒定。连接会产生很多中间对象,性能浪费。

  第三:看起来写起来改起来都麻烦,非常容易出错。

  我的观点是:拼sql语句方法多多,每一种都比拼接字符串强百倍。既然学的是C#.NET那么就应该用这种语言最最高效 最最简洁 最最干净的方式解决问题。学语言的原则是只学一门,一通百通。用不着照顾其他语言。什么都顾及,搞在一块儿 最后什么都不会。

下面是一种稍微好一点的方法

string sql = String.Format("insert into tblStudent values ('{0}','{1}','{2}','{3}')",
  txtName.Text.Trim(),
  txtGender.Text.Trim(),
  txtAddress.Text.Trim(),
  txtPhone.Text.Trim()
);

 


//妈妈再也不用担心少引号了

最好的办法是用参数:

return SqlHelper.ExecuteNonQuery(CommandType.Text, "insert into tblStudent values (@tSName, @tSGender, @tSAddress, @tSPhone, @tSAge, @tSBirthday, @tSCardId, @tSClassId)",
  new SqlParameter("@tSName", SqlDbType.NVarChar) { Value = _name },
  new SqlParameter("@tSGender", SqlDbType.NChar) { Value = _gender },
  new SqlParameter("@tSAddress", SqlDbType.NVarChar) { Value = _address },
  new SqlParameter("@tSPhone", SqlDbType.VarChar) { Value = _phone },
  new SqlParameter("@tSAge", SqlDbType.Int) { Value = _age },
  new SqlParameter("@tSBirthday", SqlDbType.DateTime) { Value = _birthday },
  new SqlParameter("@tSCardId", SqlDbType.VarChar) { Value = _cardId },
  new SqlParameter("@tSClassId", SqlDbType.Int) { Value=_classId}
);

 

优点:安全。再也不担心引号问题,因为这里根本用到引号。整齐,美观,大气。

//滥用ToString()

这也是课堂的代码

string sqlstr="insert into 库存('"+
  txt_hh.Text.Trim().ToString()+"'"+",'"+
  txt_hm.Text.Trim().ToString() + "','" +
  txt_gg.Text.Trim().ToString() + "'," +
  txt_jldw.Text.Trim().ToString() + ",'"+
  txt_kcsl.Text.Trim().ToString() + "','"+
  txt_jhrq.Text.Trim().ToString() + "','" +
  txt_shr.Text.Trim().ToString() + "','" +
  txt_ghs.Text.Trim().ToString() + "','"+
")"
try
{
  ...
}
catch(Exception ex)
{
  MessageBox.Show(ex.Message.ToString());
}

  众所周知,Trim()返回值和属性Message已经是个字符串,再来个ToString()。不仅显得多此一举,而且很难看。
  我提出这个疑问,老师回答:这是为了照顾低版本.NET,他的意思就是说低版本的框架类库中,Exception的Message不是String类型
于是我翻出了比较老的.NET2.0版本Exception类源码。
如下:

 

一切用事实说话。.NET1.0.的Message也是String。只是手头没有1.0的源码,但可以证明。

 

//标识符的命名不规范

  网页课讲动态网页,用的是dreamweaver。不写代码,就拖控件设属性。两三下就搞了一个动态网站。我晕啊。
用的是古老的vbscript.在Html5 CSS3成为业界潮流的今天。这。。。

  有那么一个项目名叫lyb。有那么一堆变量叫做xjldw,kcsl,jhrq,shr ghs,rq,hh,nl,hm,gg,x,hh,xm,xb,xh,xxa,xxb,xxxc,XX你个大XX!
我当时就琢磨:lyb究竟是什么意思。后来经人指点,留言板。额。留言板难道不应该叫GuestBook吗。再不济,写个LiuYanBan也行。

  写出来的代码只有你自己看得懂,别人难以维护。

  诚然,代码最主要就是实现功能。不管你怎么写给变量起名字,加无数个ToString()。对现在的电脑 影响可以忽略不计。
但是项目一大,几十万行的代码 有一半是,kcsl,jhrq,shr ghs,rq,hh,n这些东西。必须崩溃啊。要知道软件维护比开发重要的多。
能否养成良好的习惯决定你在这条路上能够走远。


  对此类问题的讨论到此为止吧。不再尝试给任何人提建议了。

posted @ 2014-05-21 22:58  AnyDrew  阅读(1437)  评论(0编辑  收藏  举报