2014-11-19 2 views
0

Я не могу понять, почему индекс ремонтопригодность (рассчитанный в Visual Studio) для этого метода является только 40, я в буквальном смысле придется удалить почти все строки, за исключением первых двух, чтобы получить выше 60:Может ли кто-нибудь сказать мне, почему индекс поддерживаемости составляет всего 40 для этого кода?

public void getNewPasswordDetails(Int32 newPasswordId) 
    { 

     int UserId = HttpContext.Current.User.Identity.GetUserId().ToInt(); 
     bool userIsAdmin = HttpContext.Current.User.IsInRole("Administrator"); 

     //get a list of userIds that have UserPassword records for this password 
     var UserIDList = DatabaseContext.UserPasswords.Where(up => up.PasswordId == newPasswordId).Select(up => up.Id).ToList(); 

     //Retrive the password -if the user has access 
     Password newPassword = DatabaseContext.Passwords 
                 .Include("Creator") 
                 .Where(pass => !pass.Deleted 
                 && (
                  (UserIDList.Contains(UserId)) 
                 || (userIsAdmin && ApplicationSettings.Default.AdminsHaveAccessToAllPasswords) 
                 || pass.Creator_Id == UserId) 
                  ) 
                  .Include(p => p.Parent_UserPasswords.Select(up => up.UserPasswordUser)) 
                  .SingleOrDefault(p => p.PasswordId == newPasswordId); 



     if (newPassword != null) 
     { 
      //map new password to display view model 
      AutoMapper.Mapper.CreateMap<Password, PasswordItem>(); 
      PasswordItem returnPasswordViewItem = AutoMapper.Mapper.Map<PasswordItem>(newPassword); 

      //generate a string based view of the new category 
      string passwordPartialView = RenderViewContent.RenderViewToString("Password", "_PasswordItem", returnPasswordViewItem); 

      //broadcast the new password details 
      PushNotifications.sendAddedPasswordDetails(passwordPartialView, returnPasswordViewItem.Parent_CategoryId, returnPasswordViewItem.PasswordId); 
     } 
     else 
     { 
      //we dont have access any more, so tell UI to remove the password 
      PushNotifications.sendRemovePasswordAccess(new PasswordDelete() 
                   { 
                    PasswordId = newPasswordId 
                   }); 
     } 

    } 
+0

[This] (http://blogs.msdn.com/b/codeanalysis/archive/2007/11/20/maintainability-index-range-and-meaning.aspx) - это более старое сообщение, но оно показывает, как рассчитывается индекс ремонтопригодности. Это должно дать вам представление о том, почему ваш индекс ниже вашей цели. –

ответ

2

Чем сложнее код, тем сложнее его поддерживать. Правильно? Итак, давайте рассмотрим сложный раздел кода, который был представлен. Я рассмотрю его , как если бы я был разработчиком, глядя на код в первый раз:

DatabaseContext.Passwords 
       .Include("Creator") 
       .Where(pass => !pass.Deleted 
          && ((UserIDList.Contains(UserId))  // Why Check #1 
           || (
            userIsAdmin    // Why Check #2 
            &&      // Why Check #3 
            ApplicationSettings.Default.AdminsHaveAccessToAllPasswords 
           ) 
           || pass.Creator_Id == UserId) 
          ) 
       .Include(p => p.Parent_UserPasswords.Select(up => up.UserPasswordUser)) 
       .SingleOrDefault(p => p.PasswordId == newPasswordId); 

Перед входом в цикл один уже знает эти государственные факты:

  1. (UserIDList.Contains(UserId) в Почему Check # 1
  2. userIsAdmin в почему Check # 2
  3. (userIsAdmin && ApplicationSettings.Default.AdminsHaveAccessToAllPasswords), как почему проверить # 3

Тем не менее, разработчик отодвинул эти проверки происходят для каждого пароля в паролях. Зачем? Разве нет лучшего способа выразить это?

Сложность возникает из-за применения (кодирования) логики программы, для каждого логической вилки в определения бизнес-логики непосредственно добавляет сложности кода и в дальнейшем будущем ремонтопригодности; следовательно, полученная оценка.

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

+0

Как предложение о том, как вы могли бы улучшить его, вы могли бы сделать строку 'var overridePassword = \\ все, что было в скобках;' перед текущей строкой затем изменить 'Where', чтобы упростилось быть' .Where (pass => ! pass.Deleted && (overridePassword || pass.Creator_Id == UserId)) –

+0

ОК, я понимаю, но при этом один код кода менее сложный ничего не делает для индекса ремонтопригодности. – binks

Смежные вопросы