zoukankan      html  css  js  c++  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没有加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这些东西。必须崩溃啊。要知道软件维护比开发重要的多。
    能否养成良好的习惯决定你在这条路上能够走远。


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

  • 相关阅读:
    Java反射得到属性的值和设置属性的值
    想建一个比较严格的自律打卡监督群,群主真的会很较真
    JS面向对象篇四、原型链与继承(多种继承实现方式及其利弊分析)
    JS面向对象篇三、创建对象的几种方法
    JS面向对象篇二、什么是原型?原型对象与实例对象、构造函数的关系及相关方法
    JS面向对象篇一、理解对象及属性特性(属性描述符)
    javascript作用域篇一、什么是javascript作用域链
    javascript函数篇四、函数的属性和方法——apply()、call()和bind()方法区别
    javascript函数篇三、函数声明提升
    javascript函数篇二、深入理解为什么javascript中没有函数重载
  • 原文地址:https://www.cnblogs.com/hoosway/p/3744066.html
Copyright © 2011-2022 走看看