代码重构怎么做?

   这几天,接手一个同事的代码,关于微信接口开发的,那一堆的 if,看得哥蛋痛了,这个毛病也是很多新手容易犯的,所以特地把这次重构写出来。

  下面来我们看看这个代码的问题所在,if else 里面的代码块逻辑,不好改,使得它的重用性为 0,并且难以阅读。当然,如果 if 只有一两个,或者3个,这样写是问题不大的。

  但是如果多了,这种代码便会让维护变得困难起来。

  if (strMsgType == "text")

  {

  textContentClient = rootElement.SelectSingleNode("Content").InnerText;

  strResult = SetMsgType_Text(strClientName, textContentClient, db, strServerName, Identity);

  System.Diagnostics.Trace.WriteLine(strResult);

  return Content(strResult);

  }

  else if (strMsgType == "event")

  {

  string eventType = rootElement.SelectSingleNode("Event").InnerText.ToLower();

  if (eventType == "subscribe")

  {

  string keyCode = "";

  if (rootElement.SelectSingleNode("EventKey") != null)

  keyCode = rootElement.SelectSingleNode("EventKey").InnerText.ToLower();

  strResult = FormatEventSubscribe(keyCode);

  RecordReplyMessage();

  return Content(strResult);

  }

  else if (eventType == "scan")

  {

  string keyCode = rootElement.SelectSingleNode("EventKey").InnerText.ToLower();

  var outLetName = "欢迎关注";

  var outletDB = ShoppingContext.CreateInstance(Identity);

  var outLetModel = outletDB.Outlets.FirstOrDefault(o => o.SceneId == Int32.Parse(keyCode));

  if (outLetModel != null)

  outLetName += outLetModel.Name;

  return Content(GetTextTemp(strClientName, strServerName, outLetName));

  }

  else if (eventType == "click")

  {

  string keyCode = rootElement.SelectSingleNode("EventKey").InnerText.ToLower();

  strResult = FomatMenuMessage(keyCode);

  return Content(strResult);

  }

  else if (eventType == "unsubscribe")

  {

  var subIds = db.ReplyRecords.Where(r => r.FromOpenId == this.ClientId.ToString() && r.EMessType == EEventType.Subscribe.ToString() && r.KeyWord != null).Select(o => o.KeyWord).ToArray();

  var unSubIds = db.ReplyRecords.Where(r => r.FromOpenId == this.ClientId.ToString() && r.EMessType == EEventType.Unsubscribe.ToString() && r.KeyWord != null).Select(o => o.KeyWord).ToArray();

  var SencesId = "";

  foreach (var k in subIds)

  {

  if (!unSubIds.Contains(k))

  {

  this.ReplyModel.KeyWord = k;

  break;

  }

  }

  this.ReplyModel.EMessType = EEventType.Unsubscribe.ToString();

  RecordReplyMessage();

  }

  }

  else if (strMsgType.ToLower() == "location")

  {

  string strLocation_X = rootElement.SelectSingleNode("Location_X").InnerText;

  string strLocation_Y = rootElement.SelectSingleNode("Location_Y").InnerText;

  strResult = FormatOutLetLBS(double.Parse(strLocation_X), double.Parse(strLocation_Y), 10);

  //strResult = FormatTextMessage(strLocation_X + "|" + strLocation_Y);

  return Content(strResult);

  }

  else if (strMsgType.ToLower() == "image")

  {

  string strImgUrl = rootElement.SelectSingleNode("PicUrl").InnerText;

  }

  一种比较好的处理方法就是把语句块内的代码抽出来,写成函数,如下面所示:

  public class MessageProcesser

  {

  public ReplyMessage Process(string xml)

  {

  var msg = PostMessage.FromXml(xml);

  switch (msg.MsgType)

  {

  case Models.PostMessageType.Event:

  var eventType = ((EventMessage)msg).Event;

  switch (eventType)

  {

  case EventType.Click:

  return ProcessClickEvent((ClickEvent)msg);

  case EventType.Location:

  return ProcessLocationEvent((LocationEvent)msg);

  case EventType.Scan:

  return ProcessScanEvent((ScanEvent)msg);

  case EventType.Subscribe:

  return ProcessSubscribeEvent((SubscribeEvent)msg);

  case EventType.Unsubscribe:

  return ProcessUnsubscribeEvent((UnsubscribeEvent)msg);

  }

  break;

  case Models.PostMessageType.Image:

  return ProcessImageMessage((ImageMessage)msg);

  case Models.PostMessageType.Link:

  return ProcessLinkMessage((LinkMessage)msg);

  case Models.PostMessageType.Location:

  return ProcessLocationMessage((LocationMessage)msg);

  case Models.PostMessageType.Text:

  return ProcessTextMessage((TextMessage)msg);

  case Models.PostMessageType.Video:

  return ProcessVideoMessage((VideoMessage)msg);

  case Models.PostMessageType.Voice:

  return ProcessVoiceMessage((VoiceMessage)msg);

  }

  return null;

  }

  protected virtual ReplyMessage ProcessClickEvent(ClickEvent msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessLocationEvent(LocationEvent msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessScanEvent(ScanEvent msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessSubscribeEvent(SubscribeEvent msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessUnsubscribeEvent(UnsubscribeEvent msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessImageMessage(ImageMessage msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessLinkMessage(LinkMessage msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessLocationMessage(LocationMessage msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessTextMessage(TextMessage msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessVideoMessage(VideoMessage msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage ProcessVoiceMessage(VoiceMessage msg)

  {

  return DefaultProcess(msg);

  }

  protected virtual ReplyMessage DefaultProcess(PostMessage msg)

  {

  var reply = new TextReply(msg);

  if (msg.MsgType == PostMessageType.Event)

  {

  reply.Content = string.Format("{0} event is not processed.", ((EventMessage)msg).Event);

  }

  else

  {

  reply.Content = string.Format("{0} message is not processed.", msg.MsgType);

  }

  return reply;

  }

  }

时间: 2024-09-29 17:42:43

代码重构怎么做?的相关文章

Hi,我们的代码重构了

 作为一名程序员,我最大的愿望是自己写的代码,能够被人称赞,一直留存在项目里,直到永远.能够让自己的代码一直留存在项目里,一方面自己写的代码要健壮,没有任何逻辑错误.另一方面,还要具有很好的扩展性,能够适应需求的变化.对于前者来说,只要有个两三年的基本功,基本上就能保证代码的质量.然而,要写出具有扩展性的代码,却是一件比较困难的事情.       不是因为具有可扩展性的代码不好写,而是因为这个度不好把握.我们知道系统的可扩展性总是与系统的业务和性能成反比,因此,我们不会在追求系统的扩展性上而忽略

代码重构(二):类重构规则

在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace Temp with Query, Introduce Explaining Variable, Split Temporary Variable, Remove Assignments to Parameters, Replace Method with Method Object等.关于

代码重构(一):函数重构规则

重构是项目做到一定程度后必然要做的事情.代码重构,可以改善既有的代码设计,增强既有工程的可扩充.可维护性.随着项目需求的不断迭代,需求的不断更新,我们在项目中所写的代码也在时时刻刻的在变化之中.在一次新的需求中,你添加了某些功能模块,但这些功能模块有可能在下一次需求中不在适用.或者你因为需求迭代与变更,使你原有的方法或者类变得臃肿,以及各个模块或者层次之间耦合度增加.此时,你要考虑重构了.   重构,在<重构,改善既有代码的设计>这本经典的书中给出了定义,大概就是:在不改变代码对外的表现的情况

代码重构(六):代码重构完整案例

无论做什么事情呢,都要善始善终呢.前边连续发表了5篇关于重构的博客,其中分门别类的介绍了一些重构手法.今天的这篇博客就使用一个完整的示例来总结一下之前的重构规则,也算给之前的关于重构的博客画一个句号.今天的示例借鉴于<重构,改善既有代码的设计>这本书中的第一章的示例,在其基础上做了一些修改.今天博客从头到尾就是一个完整的重构过程.首先会给出需要重构的代码,然后对其进行分析,然后对症下药,使用之前我们分享的重构规则对其进行一步步的重构. 先来聊一下该示例的使用场景(如果你有重构这本书的话,可以参

代码重构(三):数据重构规则

在<代码重构(一):函数重构规则(Swift版)>和<代码重构(二):类重构规则(Swift版)>中详细的介绍了函数与类的重构规则.本篇博客延续之前博客的风格,分享一下在Swift语言中是如何对数据进行重构的.对数据重构是很有必要的,因为我们的程序主要是对数据进行处理.如果你的业务逻辑非常复杂,那么对数据进行合理的处理是很有必要的.对数据的组织形式以及操作进行重构,提高了代码的可维护性以及可扩展性. 与函数重构与类重构类似,对数据结构的重构也是有一定的规则的.通过这些规则可以使你更

代码重构 实体转换-求教关于代码优化重构的问题

问题描述 求教关于代码优化重构的问题 关于代码重构:问题如下 各个科目都对应一个"考试"的实体bean,各个对象里部分属性是一致的,也存在不同的属性.经常遇到的情况是要写好几套代码. 如下面的代码片段 if ("1".equals(subjectCode)) { LogUtil.info("获取数学"); TestM testM = new TestM(); testM.setTeachingCode(teachingVersionCode);

《圣殿祭司的ASP.NET4.0专家技术手册》----1-10 程序代码重构

1-10 程序代码重构 圣殿祭司的ASP.NET4.0专家技术手册 所谓重构(Refactoring),是指对软件程序进行重新改写或调配,那干嘛不直接叫Rewrite?意义当然不一样,因为Rewrite只是单纯地改写,不一定有什么了不得的意义,而重构是含有目的性的改写,或重新优化整个程序架构,其中甚至有"方法论"在里头,也就是有许多程序方法学的指导性方针,"重构"一词其实存在软件界已久,而Java的Eclipse或NetBeans开发工具对"重构"

《Web前端开发最佳实践》——2.2 前端代码重构

2.2 前端代码重构 代码重构是业内经常讨论的一个热门话题.重构指的是在不改变代码外部行为的情况下进行源代码修改,重构之前需要考虑的是重构后如何才能保证外部行为不改变.对于后端代码来说,可以通过大量的自动化测试来确保重构后的代码逻辑,可对于普遍缺乏自动化测试的前端代码来说,重构之前一定要考虑再三才能下手.我曾经有一次不算太成功的前端重构经历,所幸的是没有导致太大的问题,但教训是惨痛的.此次重构的项目本身没有足够的自动化测试,尤其是针对前端的自动化测试,其实在重构之前也预想到了重构的风险.先来介绍

求代码 我想做一个网页效果,如下图。这个应该是用JS做的

问题描述 求代码 我想做一个网页效果,如下图.这个应该是用JS做的 就是那个 上标"新" 还有"9折"的那个 解决方案 所以用F12,它可以直接告诉你在哪个文件中. 解决方案二: 用层就可以实现,用IE F12看下css