用 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 }
认识问题,解决问题 ->
行行无bug的背后,是全面缜密的思考