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

  我们的程序课只关心能不能把一个功能实现。不会关注怎么实现以及背后的我坚信性能非常重要,给客户做项目,三天两头出问题,动不动系统写出来的网站访问量一大就报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那么就应该用这种语言最最高效 最最简洁
最最干净的方式解决问题。学语言的原则是只学一门,一通百通。用不着照顾其他语言。什么都顾及,搞在一块儿 最后什么都不会。

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


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这些东西。能让人不崩溃?
能否养成良好的习惯决定你在这条路上能走多远

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

时间: 2024-08-13 14:28:45

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

C#复习笔记(4)--C#3:革新写代码的方式(扩展方法)

扩展方法 扩展方法有以下几个需求: 你想为一个类型添加一些 成员: 你不需要为类型的实例添加任何更多的数据: 你不能改变类型本身, 因为是别人的代码. 对于C#1和C#2中的静态方法,扩展方法是一种更优雅的解决方案. 语法 并不是任何方法都能作为扩展方法使用-- 它必须具有以下特征: 它必须在一个非嵌套的. 非泛型的静态类中( 所以必须是一 个静态方法): 它至少要有 一个参数: 第一个参数必须附加 this 关键字作为前缀: 第一个参数不能有其他任何修饰 符(比如out或ref): 第一个参数

js中如何高效、简洁、清晰地定义变量

var zb={ "ui":{}, "form":{} }; 这是一种定义变量的方法,其实如果不定义,也可以写成: var zb.ui={}; var zb.form={}; 而zb定义的是全局变量,也就相当于: window.zb.ui={}; window.zb.form={}; $(".close-dialog,.cancel-dialog").on("click",function(){ var element={ &

[歪谈]经理该不该写代码?

这个话题我在好几个地方看到过,基本上大家的意见有几种: 1.小公司别说经理,老板都得写(这是在说我吗?) 2.一般到100或200人以上的公司,经理很少会直接参与代码的编写. 3.大公司(BAT?这个就不说了)一般经理级别以上不写代码 4.还有个观点支持率比较多:那就是要看公司是做产品的还就是做项目的.如果是做项目的一来公司肯定不会大,二来做项目的公司经理和员工一起写代码是很正常的:如果是做产品的,那么除了直系部门的经理会适当写些代码,大部分核心模块. 好吧,我先放出一些自己的观点,然后我们再做

iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法

一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能,有两种方法. 1.通过方法 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion跳转 相

高效程序员系列(保持写代码的动力)

话不多说,直入正题. 做任何事情都需要动力,只是对于程序员来说,拥有写代码的动力至关重要.程序员不同于会计.出纳等,这些职业所做的事情基本上都是重复的,就像平坦大路上行驶的车辆,并不需要提供很大的动力就能保持前进.程序员所做的事情恰像上坡路上的车辆,需要提供较大的且持续的动力才能保持继续前进.如果在开发一个项目的过程中,工程师不幸失去了动力,多半情况下项目就会半途而废,及时侥幸完成了,那么项目的完成质量值得担忧. 如何才能够在开发的过程中获得持续的动力呢? 程序员在开发的过程中,会遇到各种问题,

今天和组内一起写代码时碰到了一个关于命名冲突的问题,最后用js命名空间的方法解决的。

//第一步,首先创建一个全局变量,可以放在自己的js方法库中方便以后用,这个就是用来注册命名空间的方法. ns = function(namespace){ var arr = namespace.split('.');  //将传入的字符串如"com.test.lzn"以'.'隔开做成一个数组 var strNamespace = ""; //这个是为了保存每一步循环进去的包名 for(var i=0;i<arr.length;i++) { if(i!=0)

如何提高编程能力?写更多代码是最显著的方法,但是本文这一种与写代码完全相反,一起来看看吧

起初我是在2010年5月为Fuel Your Coding网站写的这篇文章.然后这个网站现在已经不存在了,为了让爱好编程的人们能够继续受益,所以在这里重新发表这篇文章.我考虑过是否要按照现如今的情况来对这篇文章进行修改,但是我认为它已经足够经得住检验了.只有少许的部分可能不尽人意.尽情的欣赏这篇文章吧. 正如每个人都知道的那样,写更多的代码是提高编程能力最显著方法.但是我所确信的另外一种可以提高编程能力的方法是与写代码完全相反的.我将要尽可能清楚的陈述这种方法. 只有大量的阅读别人的代码才能显著

写代码的逻辑原则

1.写代码前画流程图,写伪代码,帮助理清思路再着手写代码. 2.写代码时,多抽象,如每个功能拆分一个方法,如数据库操作类抽象的通用些. 3.每一个方法通过输入输出测结果,保证每个方法的正确性和通用性,再调试代码时不再调试此方法. 4.写每段代码要有思考,过脑子,有这样写的道理. 5.遇到每个不懂的点,如果当时没有时间,要记录下来,有时间了研究透,一点一点积累.

浅谈时钟的生成(js手写代码)

在生成时钟的过程中自己想到布置表盘的写法由这么几种: 当然利用那种模式都可以实现,所以我们要用一个最好理解,代码有相对简便的方法实现 1.利用三角函数 用js在三角函数布置表盘的过程中有遇见到这种情况:是在表盘的刻度处,利用三角函数计算具体的值时不能得到整数,需要向上或者向下取整,这样无形中就会存在些许偏差,而且这样的偏差难利用样式来调整到位,即使最终效果都可以实现,但是细微处的缝隙和角度的偏差都会影响整体的视觉体验,作为一名程序开发人员,这样的视觉体验很难让别人认可,放弃. 2.利用遮罩层 j