2015-03-04 5 views
-1

Ниже метод имеет цикломатическую сложность 13 Я следую некоторому подходу, используя тройной оператор для малых, если иначе, но для длинного кода наилучший подход какой шаблон дизайна использовать для получения результата, если условие else или каким-либо другим способом чтобы уменьшить цикломатическую сложность, так как sonarQube показывает ошибку циклической сложности. Я новичок помочь мне undersatnding процессЛучший способ для сокращения сложности циклотрона

@RequestMapping(value = "/submitUser", method=RequestMethod.POST) 
      public String submitUser(@ModelAttribute User userBean,Locale locale, RedirectAttributes redirectAttributes, HttpSession session, Model model) { 
     boolean status = false, isAdd = false; 
     String imagePath = "", task = ""; 
     isAdd = userBean.getAdd(); 
     /*if(isAdd) { 
        task = "add"; 
       } else {   // replace this by task=isAdd?"add":"edit"; 
        task = "edit"; // 
       }*/ 
       GlobalLogger.logApplicationDebugLog("Received request to " + task + " user ", LOGGER); 
     if (session != null && session.getAttribute("UserImagePath") != null) { 
      imagePath = session.getAttribute("UserImagePath").toString(); 
       } 
       int currentUserId = Integer.parseInt(session.getAttribute(SessionKeyConstants.USER_ID).toString()); 
       try { 
        status = iuser.submitUser(userBean, imagePath,currentUserId); 
        if(isAdd) { 
         if (status) { 
          GlobalLogger.logInfoLog("User "+userBean.getUserName()+" has been " + task + "ed successfully", LOGGER); 
          redirectAttributes.addFlashAttribute("successMsg", messageSource.getMessage("operationMsg.addUserSuccess", new String[] {userBean.getEmpEmail()}, locale)); 
          return "redirect:/users.action"; 
         } else { 
          GlobalLogger.logApplicationDebugLog("Error in adding user "+userBean.getUserName(), LOGGER); 
          redirectAttributes.addFlashAttribute("errorMsg", messageSource.getMessage("operationMsg.addUserFailure", new String[] {}, locale)); 
          redirectAttributes.addFlashAttribute("isAdd", isAdd); 
          redirectAttributes.addFlashAttribute("userBean", userBean); 
          return "redirect:/addUser.action?isAdd=true"; 
         } 
        } else { 
         if (status) { 
          GlobalLogger.logInfoLog("User "+userBean.getUserName()+" has been " + task + "ed successfully", LOGGER); 
          redirectAttributes.addFlashAttribute("successMsg", messageSource.getMessage("label.addSuccessMsg", new String[] {userBean.getFirstName()}, locale)); 
          return "redirect:/users.action"; 
         } else { 
          GlobalLogger.logApplicationDebugLog("Error in adding user "+userBean.getUserName(), LOGGER); 
          redirectAttributes.addFlashAttribute("errorMsg", messageSource.getMessage("label.addFailedMsg", new String[] {userBean.getFirstName()}, locale)); 
          redirectAttributes.addFlashAttribute("isAdd", isAdd); 
          redirectAttributes.addFlashAttribute("userBean", userBean); 
          return "redirect:/addUser.action?isAdd=false"; 
         } 
        } 
       } catch (UserException e) { 
        GlobalLogger.logApplicationDebugLog("User Name or Employee Id exists for user "+userBean.getUserName(), LOGGER); 
        redirectAttributes.addFlashAttribute("userBean", userBean); 
        redirectAttributes.addFlashAttribute("errorMsg", messageSource.getMessage(e.getErrorcode(), new String[] {}, locale)); 
        return "redirect:/addUser.action?isAdd=true"; 
       } 
      } 
+1

http://refactoring.com/catalog/extractMethod.html – assylias

+0

@assylias я не мог понять, не могли бы вы мне помочь, видя выше код, который я отправил – vaib

ответ

2

Самым простым разрешением проблемы со слишком длинными методами разорвать их на куски. Извлеките части метода в отдельные методы, называемые из исходного метода. Обычно это можно сделать автоматически с помощью IDE, например. Eclipse (меню Refactor/Extract method).

В вашем методе у вас почти такой же код для isAdd == true и для false. Вы можете извлечь этот код для отдельного метода, например. String redirectUser(boolean isAdd, boolean status, <other attribs>) {...}. Тогда ваш метод будет намного проще.

Первое изменение просто - метод экстракт (это может быть сделано автоматически):

@RequestMapping(value = "/submitUser", method=RequestMethod.POST) 
public String submitUser(@ModelAttribute User userBean,Locale locale, RedirectAttributes redirectAttributes, HttpSession session, Model model) { 
    boolean status = false, isAdd = false; 
    String imagePath = "", task = ""; 
    isAdd = userBean.getAdd(); 
    GlobalLogger.logApplicationDebugLog("Received request to " + task + " user ", LOGGER); 
    if (session != null && session.getAttribute("UserImagePath") != null) { 
     imagePath = session.getAttribute("UserImagePath").toString(); 
    } 
    int currentUserId = Integer.parseInt(session.getAttribute(SessionKeyConstants.USER_ID).toString()); 
    try { 
     status = iuser.submitUser(userBean, imagePath,currentUserId); 
     return redirectUser(userBean, locale, redirectAttributes, status, 
       isAdd, task); 
    } catch (UserException e) { 
     GlobalLogger.logApplicationDebugLog("User Name or Employee Id exists for user "+userBean.getUserName(), LOGGER); 
     redirectAttributes.addFlashAttribute("userBean", userBean); 
     redirectAttributes.addFlashAttribute("errorMsg", messageSource.getMessage(e.getErrorcode(), new String[] {}, locale)); 
     return "redirect:/addUser.action?isAdd=true"; 
    } 
} 

private String redirectUser(User userBean, Locale locale, 
     RedirectAttributes redirectAttributes, boolean status, 
     boolean isAdd, String task) { 
    if(isAdd) { 
     if (status) { 
      GlobalLogger.logInfoLog("User "+userBean.getUserName()+" has been " + task + "ed successfully", LOGGER); 
      redirectAttributes.addFlashAttribute("successMsg", messageSource.getMessage("operationMsg.addUserSuccess", new String[] {userBean.getEmpEmail()}, locale)); 
      return "redirect:/users.action"; 
     } else { 
      GlobalLogger.logApplicationDebugLog("Error in adding user "+userBean.getUserName(), LOGGER); 
      redirectAttributes.addFlashAttribute("errorMsg", messageSource.getMessage("operationMsg.addUserFailure", new String[] {}, locale)); 
      redirectAttributes.addFlashAttribute("isAdd", isAdd); 
      redirectAttributes.addFlashAttribute("userBean", userBean); 
      return "redirect:/addUser.action?isAdd=true"; 
     } 
    } else { 
     if (status) { 
      GlobalLogger.logInfoLog("User "+userBean.getUserName()+" has been " + task + "ed successfully", LOGGER); 
      redirectAttributes.addFlashAttribute("successMsg", messageSource.getMessage("label.addSuccessMsg", new String[] {userBean.getFirstName()}, locale)); 
      return "redirect:/users.action"; 
     } else { 
      GlobalLogger.logApplicationDebugLog("Error in adding user "+userBean.getUserName(), LOGGER); 
      redirectAttributes.addFlashAttribute("errorMsg", messageSource.getMessage("label.addFailedMsg", new String[] {userBean.getFirstName()}, locale)); 
      redirectAttributes.addFlashAttribute("isAdd", isAdd); 
      redirectAttributes.addFlashAttribute("userBean", userBean); 
      return "redirect:/addUser.action?isAdd=false"; 
     } 
    } 
} 

Теперь вы можете сравнить два случая if, потому что они очень похожи. Возможно, вы можете переписать их, чтобы избежать дублирования. Например, вместо возврата «redirect: /addUser.action? IsAdd = true»; вы можете написать return "redirect: /addUser.action? isAdd =" + isAdd.

Рефакторинг - это итеративный процесс. Вы должны внести небольшие изменения, запустить модульные тесты, чтобы убедиться, что ничего не сломалось, и повторяйте до тех пор, пока результат не будет удовлетворительным.

+0

вы можете дать мне пример того же – vaib

+0

Теперь у вас есть пример. Я больше не буду работать над этим кодом - это ваша работа, а не моя :) – pkalinow

+0

Я использую набор инструментов весны, он не показывает код (метод рефакторинга/экстракт) – vaib