码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-05-22 15:57:25      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   c   code   java   


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

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

//字符串拼接

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

  抬头看到这坨东西,心里非常不我看了老师调试这段代码,短短不过10行,错误单单上面的sqlstr他就改了很多次,不是少了引号就是漏了括号,有次是txthh没有加.老师语重心长地说这块不好看懂,你们多多我当即提出,拼接出来sql语句缺点太多,写得这么费劲,看的也吃力,改起来费劲加费劲,为什么一定要用这种方法拼接sql他回答:方法有很多,这种方法在所有的语言都适用。只要熟练了不写错就听起来貌似很对是不是?我当时就震惊了,原来他所谓的写代码原则是兼容所有的语言?!!还指望把C#代码放到apache、tomcat上运行吗?

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

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

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

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

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

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

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

 


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

最好的办法是用参数:

bubuko.com,布布扣
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}
);
bubuko.com,布布扣

 

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

//滥用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类源码。
如下:

 bubuko.com,布布扣

一切用事实说话。他讲的是错误的!.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这些东西。能让人不崩溃?
能否养成良好的习惯决定你在这条路上能走多远


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

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

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

标签:style   blog   class   c   code   java   

原文地址:http://www.cnblogs.com/hoosway/p/3744066.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!