切忌:浮沙之上筑高台
点击次数:23 次 发布日期:2008-11-26 10:33:25 作者:源代码网
|
源代码网推荐 很久之前见过一个面试题,就是看一段代码并且发现里面的问题,那段代码是这样的: 源代码网推荐 public String XXXXXX(String input) 源代码网推荐 { 源代码网推荐 StringBuilder sb = new StringBuilder(input); 源代码网推荐 // 这里是一堆很复杂的操作sb的语句 源代码网推荐 return input; 源代码网推荐 } 源代码网推荐 明眼人一下就看出来了,这简直就是忽悠小孩子玩的。 源代码网推荐 但是,在我现在的项目中,却真有人犯类似的错误,真是个很严重的问题,它直接造成了系统性能上的问题。 源代码网推荐 先说一下背景: 源代码网推荐 在对数据库操作之前,我们需要对用户的输入进行规范,其中包括需要把用户输入的内容进行截取,去掉前后的全角空格。 源代码网推荐 同样的,从数据库检索出来的数据,也要进行同样的操作。 源代码网推荐 这当然需要写入到共同方法里面,这就是我发现问题的代码段: 源代码网推荐 for (cntT = 0; cntT < str.Length; cntT++) 源代码网推荐 { 源代码网推荐 if ((" ".Equals(str.Substring(cntT, 1)))) 源代码网推荐 { 源代码网推荐 strWork = str.Substring(cntT + 1, str.Length - cntT - 1); 源代码网推荐 continue; 源代码网推荐 } 源代码网推荐 else 源代码网推荐 { 源代码网推荐 strWork = str.Substring(cntT, str.Length - cntT); 源代码网推荐 break; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 这是去掉前面的全角空格,先撇开这段代码是否有BUG,您发现里面存在的性能问题了吗? 源代码网推荐 不要告诉我应该用StringBuilder,它真正的问题是根本就不应该在循环里面进行截取。 源代码网推荐 循环里面只要计数就可以了,在循环之后进行截取,这样就避免了很多字符串操作,难道不是更好。 源代码网推荐 所以我说,基础很好总要,这个基础,既包括编程语言的基础,但是我们更需要注意的是编程思想、思维方式的基础。 源代码网推荐 不要把简单的问题复杂化,也不要把复杂的问题简单化,写出那样的代码,我也只能说编码人员根本就没有进行思考,就去写代码了。 源代码网推荐 很多人抱怨面试的时候,让你做面试题,而且都是很基础的题。 源代码网推荐 但是,您静下心来想一下,那些问题您都是十分清楚吗? 源代码网推荐 您可以不用翻书查资料就能准确的回答吗? 源代码网推荐 如果您办不到的话,我建议您还是先回家复习一下功课吧。 源代码网推荐 不要连这些基础东西都没搞明白,就跟我大谈特谈什么高深的设计模式、最新技术什么的。 源代码网推荐 不要告诉我说没有必要,那些基础的东西可以在很短的时间内掌握,而且平时应用也不会用到....... 源代码网推荐 源代码网推荐 我觉得,切忌:浮沙之上筑高台。 源代码网推荐 (心情不爽,特发此文。) 源代码网推荐 源代码网推荐 posted on 2007-12-09 19:26 Game_over 阅读(333) 评论(10) 编辑 收藏 源代码网推荐 源代码网推荐 源代码网推荐 评论: 源代码网推荐 #1楼 2007-12-09 19:34 | JesseZhao 源代码网推荐 源代码网推荐 支持你以下 源代码网推荐 回复 引用 查看 源代码网推荐 #2楼 2007-12-09 19:38 | 静水≈深流 源代码网推荐 源代码网推荐 有道理 源代码网推荐 回复 引用 查看 源代码网推荐 #3楼 2007-12-09 19:39 | gakaki [未注册用户] 源代码网推荐 源代码网推荐 这很常见啊 源代码网推荐 工作忙 急的时候就会忘记 源代码网推荐 源代码网推荐 连重构的时间都没有 还要你自己花下班时间重构的项目你有没见过 源代码网推荐 一天做4个CRUD操作界面 就用ADO.NET 源代码网推荐 你怎么个重构法 源代码网推荐 源代码网推荐 所以教育的方法很重要 引导 怒 根本解决不了问题 源代码网推荐 源代码网推荐 回复 引用 查看 源代码网推荐 #4楼 2007-12-09 21:17 | 重典 源代码网推荐 源代码网推荐 有理 源代码网推荐 回复 引用 查看 源代码网推荐 #5楼 2007-12-09 21:20 | Yok 源代码网推荐 源代码网推荐 为何不用TrimStart()和TrimEnd()? 源代码网推荐 回复 引用 查看 源代码网推荐 #6楼 2007-12-09 21:28 | Stanley.Luo 源代码网推荐 源代码网推荐 既然是“去掉前后”,为什么要搞这么麻烦? 源代码网推荐 源代码网推荐 用: 源代码网推荐 str = str.Trim(" ".ToCharArray()); 源代码网推荐 不可以了吗? 源代码网推荐 回复 引用 查看 源代码网推荐 #7楼 2007-12-09 21:32 | birdshome 源代码网推荐 源代码网推荐 虽然代码比较ugly,但这里不会是系统的瓶颈。当然严格的说,是个潜在的瓶颈,比如来个数据有1w个前导空格。。。 源代码网推荐 回复 引用 查看 源代码网推荐 #8楼 2007-12-09 21:41 | kiler 源代码网推荐 源代码网推荐 那段代码看了几分钟,没看懂,放弃了,不过这个算不上很严重的问题,也很难造成了系统性能上的问题,除非像birdshome说的在一次操作中执行1W次。 源代码网推荐 源代码网推荐 回复 引用 查看 源代码网推荐 #9楼 2007-12-09 21:47 | llj098 [未注册用户] 源代码网推荐 源代码网推荐 有道理~ 源代码网推荐 回复 引用 查看 源代码网推荐 #10楼 2007-12-09 21:56 | 蛙蛙池塘 源代码网推荐 源代码网推荐 我也看了半天才看懂,给大家看看.net自己的trimstart方法 源代码网推荐 public string TrimStart(params char[] trimChars) 源代码网推荐 { 源代码网推荐 if ((trimChars == null) || (trimChars.Length == 0)) 源代码网推荐 { 源代码网推荐 trimChars = WhitespaceChars; 源代码网推荐 } 源代码网推荐 return this.TrimHelper(trimChars, 0); 源代码网推荐 } 源代码网推荐 -------------- 源代码网推荐 private string TrimHelper(char[] trimChars, int trimType) 源代码网推荐 { 源代码网推荐 int num = this.Length - 1; 源代码网推荐 int startIndex = 0; 源代码网推荐 if (trimType != 1) 源代码网推荐 { 源代码网推荐 startIndex = 0; 源代码网推荐 while (startIndex < this.Length) 源代码网推荐 { 源代码网推荐 int index = 0; 源代码网推荐 char ch = this[startIndex]; 源代码网推荐 index = 0; 源代码网推荐 while (index < trimChars.Length) 源代码网推荐 { 源代码网推荐 if (trimChars[index] == ch) 源代码网推荐 { 源代码网推荐 break; 源代码网推荐 } 源代码网推荐 index++; 源代码网推荐 } 源代码网推荐 if (index == trimChars.Length) 源代码网推荐 { 源代码网推荐 break; 源代码网推荐 } 源代码网推荐 startIndex++; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 if (trimType != 0) 源代码网推荐 { 源代码网推荐 num = this.Length - 1; 源代码网推荐 while (num >= startIndex) 源代码网推荐 { 源代码网推荐 int num4 = 0; 源代码网推荐 char ch2 = this[num]; 源代码网推荐 num4 = 0; 源代码网推荐 while (num4 < trimChars.Length) 源代码网推荐 { 源代码网推荐 if (trimChars[num4] == ch2) 源代码网推荐 { 源代码网推荐 break; 源代码网推荐 } 源代码网推荐 num4++; 源代码网推荐 } 源代码网推荐 if (num4 == trimChars.Length) 源代码网推荐 { 源代码网推荐 break; 源代码网推荐 } 源代码网推荐 num--; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 int length = (num - startIndex) + 1; 源代码网推荐 if (length == this.Length) 源代码网推荐 { 源代码网推荐 return this; 源代码网推荐 } 源代码网推荐 if (length == 0) 源代码网推荐 { 源代码网推荐 return Empty; 源代码网推荐 } 源代码网推荐 return this.InternalSubString(startIndex, length, false); 源代码网推荐 } 源代码网推荐 源代码网推荐 -------------- 源代码网推荐 private unsafe string InternalSubString(int startIndex, int length, bool fAlwaysCopy) 源代码网推荐 { 源代码网推荐 if (((startIndex == 0) && (length == this.Length)) && !fAlwaysCopy) 源代码网推荐 { 源代码网推荐 return this; 源代码网推荐 } 源代码网推荐 string str = FastAllocateString(length); 源代码网推荐 fixed (char* chRef = &str.m_firstChar) 源代码网推荐 { 源代码网推荐 fixed (char* chRef2 = &this.m_firstChar) 源代码网推荐 { 源代码网推荐 wstrcpy(chRef, chRef2 + startIndex, length); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 return str; 源代码网推荐 } 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
