如何在没有switch构造的情况下重构和设计类结构的实现?

时间:2011-06-27 13:41:34

标签: c# design-patterns refactoring

我使用之前编写过的代码,我想进行重构。问题是如下:     在ASP.NET MVC应用程序中,每个用户角色具有多个用户角色,应显示个人详细信息页面,其中菜单包含可应用于特定用户角色的一些操作,对于不同的用户角色,菜单中的操作不同,例如: 用户以管理员身份登录,并希望查看Learner(使用角色)的个人详细信息页面,学习者菜单项将显示

  1. 更改密码
  2. CV
  3. 指定资格
  4. 如果用户使用其他角色登录,例如Assessor(用户角色) 菜单将显示其他项目

    1. 更改密码
    2. 进度
    3. 指定资格
    4. 分配单位
    5. 如果用户想查看自己的个人详细信息页面,菜单将显示其他项目。

      菜单项对于特定用户角色不同的主要思想是用户角色的数量约为7.并且用户有不同的组合查看其他用户的个人详细信息页面。

      目前代码看起来像

          public class LearnerMenuBuilder 
      {
      
          public LearnerMenuBuilder(UserRole userRole, UserRole loggedUserRole)
              : base(userRole, loggedUserRole)
          {
      
          }
      
          public UserItemMenu Build()
          {
              var ret = new UserItemMenu();
      
              switch (UserTypeHelper.GetTypeNameOf(currentUserRole.GetType()))
              {
                  case Const.LearnerRole:
                      ret.Items = GetLearnerMenu();
                      return ret;
      
                  case Const.AssessorRole:
                      ret.Items = GetMenuForAssessor();
                      return ret;
                  case Const.InternalVerifierRole:
                  case Const.QualityAdviserRole:
                  case Const.ManagerRole:
                  case Const.NonEdiQualityAdviserRole:
                      ret.Items = GetMenuForInternalVerifier();
                      return ret;
      
                  case Const.CentreAdministratorRole:
                      ret.Items = GetMenuForCentreAdmin();
                      return ret;
                  case Const.SystemAdministratorRole:
                      ret.Items = GetMenuItemsForCentreSupport();
                      return ret;
                  default:
                      return ret;
              }
          }
      
        //private methods for add items to menu
      
      }
      

      }

      从这个类中你可以为每个用户角色设置switch case语句,我想重构它并删除开关构造。

      如何以有效的方式重构和重新设计代码?

      请帮我提一些建议或解决方案。

      提前致谢!

1 个答案:

答案 0 :(得分:1)

查看SiteMap和角色提供程序