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

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

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

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

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

   // 审核员和代采、审核和采购员不可同时勾选
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内增加对应的键值对就可以了,

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

     // 审核员和代采、审核和采购员不可同时勾选
// 使用 map 保存 互斥关系 ,k-v 表示 互斥
NSDictionary *dict = @{
@"审核" : @"采购代采",
@"代采" : @"审核",
@"采购" : @"审核"
}; NSString *mutex = [dict valueForKey:tag]; if (!IsStrEmpty(mutex) && selected) {
for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
if ([mutex containsString:dto.rolename]) {
dto.isSelected = NO;
}
}
}

用 map 表达互斥逻辑的更多相关文章

  1. 产品经理之UML表达业务逻辑

    文章大纲 一. 什么是UML二. UML基础介绍三.UML实例介绍四.参考文档   一. 什么是UML   UML(Unified Modeling Language,统一建模语言) 是一种在软件设计 ...

  2. ceph之crush map

    编辑crush map: 1.获取crush map: 2.反编译crush map: 3.至少编辑一个设备,桶, 规则: 4.重新编译crush map: 5.重新注入crush map: 获取cr ...

  3. map & flatMap 浅析

    我之前一直以为我是懂 map 和 flatMap 的.但是直到我看到别人说:「一个实现了 flatMap 方法的类型其实就是 monad.」我又发现这个熟悉的东西变得陌生起来,本节烧脑体操打算更细致一 ...

  4. Memory Map

    计算机最重要的功能单元之一是Memory.Memory是众多存储单元的集合,为了使CPU准确地找到存储有某个信息的存储单元,必须为这些单元分配一个相互区别的“身份证号”,这个“身份证号”就是地址编码. ...

  5. java 集合框架(十六)Map

    一.概述 Map是一个包含键值对的集合,一个map不能有重复的键(key),而且每个键至多只能对应一个值.Map同Collection一样,它的所有通用实现都会提供一个转换器构造函数,接收一个Map类 ...

  6. Swift 烧脑体操(四) - map 和 flatMap

    前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...

  7. java apache-commons-collections中Map辅助类的使用

    前言 apache-commons-collections中Map辅助类,很是有用.尽管我们通过原生Map经过业务逻辑处理也能达到相同的作用与效果,但毕竟作为一个开源的工具类辅助类,对它有个了解还是有 ...

  8. 【Go语言】map在goroutine通信中的使用问题

    简介 本篇文章的主要内容是解决go语言map在使用中遇到的两个问题,对于初学者是不可避免的坑 一.cannot assign to struct field 当map中存在struct类型的成员,如果 ...

  9. 一篇面经(BAT面试)(转)

    0. 写在之前 首先呢我的面试经历和一些面霸和收割机的大神相比绝不算丰富,但我这三个月应该能代表很大一部分人的心路历程:从无忧无虑也无知的状态,然后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着自 ...

随机推荐

  1. Java设计模式—组合模式

    组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系. 个人理解:组合模式就是将部分组装成整体. 定义如下: 将对象组合成树形结构以表 ...

  2. (PowerShell) 重命名文件

    Get-ChildItem -Path C:\temp\test -Filter *.txt | Rename-Item -NewName {$_.Basename.Replace("Old ...

  3. Java Basis

    java中.java源文件放在src文件夹下,.class文件放在bin文件夹下. java代码区域,以及控制台区域字体大小更改.Java->Java Editor Text Font      ...

  4. android资源的诡异问题

    最近,新开发版本,正在处于扫BUG的阶段. 发现一个比较诡异的问题,一个控件的颜色,背景色与预先设定的值,发生不一致.其他的类型的控件有同样的设置,但是现实结果正常. 今天,专门解决这个问题. 经过各 ...

  5. Jmeter入门(一)————线程组配置

    线程组相当于有多个用户,同时去执行相同的一批次任务.每个线程之间都是隔离的,互不影响的.一个线程的执行过程中,操作的变量,不会影响其他线程的变量值. Delay Thread creation unt ...

  6. MySQL在线加字段实现原理

    博客已转移到腾讯DBA博客 http://tencentdba.com/ 腾讯互娱内部维护了一个MySQL分支,基于官方5.5.24,实现了类似于Oracle 11g的快速加字段功能,这个分支我们内部 ...

  7. 消除 Xcode7 中 directory not found for option 'xxxx' 警告

    消除 Xcode7 中 directory not found for option 'xxxx' 警告 升级Xcode7之后,你会遇到一些警告信息,诸如以下一条: ld: warning: dire ...

  8. POP动画[3]

    POP动画[3] 这一节主要讲解POP动画的自定义动画属性. POP动画中有一个参数,叫timingFunction,与CoreAnimation中的一个参数CAMediaTimingFunction ...

  9. 软件磁盘阵列 (Software RAID)

    什么是 RAID 磁盘阵列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,容错式廉价磁盘阵列. RAID 可以通过一些技术(软件或硬件),将多个较 ...

  10. Google官方教程之Selling In-app Products

    1.原文链接[需FQ]:http://developer.android.com/training/in-app-billing/index.html 2.平时对于英文文档都是大概读一下,现在翻译文章 ...