用 map 表达互斥逻辑

在这个开发周期遇到这样一个需求:

管理员可以给子账号配置权限,有些权限存在互斥不可同时勾选,比如

审核员和代采、审核和采购员不可同时勾选

 

之前同事实现的方式如下:

这样每添加一个互斥关系就要遍历一次,低效且代码繁琐。

   // 审核员和代采、审核和采购员不可同时勾选
    if ([tag isEqualToString:@"审核"] && selected) {
        for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
            if ([dto.rolename isEqualToString:@"采购"] || [dto.rolename isEqualToString:@"代采"]) {
                dto.isSelected = NO;
            }
        }
    }
    if ([tag isEqualToString:@"采购"]) {
        for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
            if ([dto.rolename isEqualToString:@"审核"] && selected) {  /// 审核和采购员不可同时勾选
                dto.isSelected = NO;
            } else if ([dto.rolename isEqualToString:@"代采"] && !selected) { /// 取消采购默认取消代采
                dto.isSelected = NO;
                break;
            }
        }
    }
    /// 选择代采默认选择采购
    if ([tag isEqualToString:@"代采"] && selected) {
        for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
            if ([dto.rolename isEqualToString:@"采购"]) {
                dto.isSelected = YES;
            } else if ([dto.rolename isEqualToString:@"审核"]) { /// 审核员和代采不可同时勾选
                dto.isSelected = NO;
            }
        }
    }

 

考虑到以后可能继续添加互斥关系,在此使用map保存互斥关系,

这样每添加一种互斥关系只需要在map内增加对应的键值对就可以了,

大大简化了逻辑,使代码更加清晰易于维护。

 1     // 审核员和代采、审核和采购员不可同时勾选
 2     // 使用 map 保存 互斥关系 ,k-v 表示 互斥
 3     NSDictionary *dict = @{
 4                            @"审核" : @"采购代采",
 5                            @"代采" : @"审核",
 6                            @"采购" : @"审核"
 7                            };
 8     
 9     NSString *mutex = [dict valueForKey:tag];
10     
11     if (!IsStrEmpty(mutex) && selected) {
12         for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
13             if ([mutex containsString:dto.rolename]) {
14                 dto.isSelected = NO;
15             }
16         }
17     }

 

posted @ 2018-09-17 13:10  CodeVector  阅读(604)  评论(0编辑  收藏  举报