代碼重構怎麼做?

來源:互聯網
上載者:User

代碼重構怎麼做?

   這幾天,接手一個同事的代碼,關於介面開發的,那一堆的 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;

  }

  }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.