当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  切忌:浮沙之上筑高台

 切忌:浮沙之上筑高台

点击次数: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)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华