用 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内增加对应的键值对就可以了,
大大简化了逻辑,使代码更加清晰易于维护。
// 审核员和代采、审核和采购员不可同时勾选
// 使用 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 表达互斥逻辑的更多相关文章
- 产品经理之UML表达业务逻辑
文章大纲 一. 什么是UML二. UML基础介绍三.UML实例介绍四.参考文档 一. 什么是UML UML(Unified Modeling Language,统一建模语言) 是一种在软件设计 ...
- ceph之crush map
编辑crush map: 1.获取crush map: 2.反编译crush map: 3.至少编辑一个设备,桶, 规则: 4.重新编译crush map: 5.重新注入crush map: 获取cr ...
- map & flatMap 浅析
我之前一直以为我是懂 map 和 flatMap 的.但是直到我看到别人说:「一个实现了 flatMap 方法的类型其实就是 monad.」我又发现这个熟悉的东西变得陌生起来,本节烧脑体操打算更细致一 ...
- Memory Map
计算机最重要的功能单元之一是Memory.Memory是众多存储单元的集合,为了使CPU准确地找到存储有某个信息的存储单元,必须为这些单元分配一个相互区别的“身份证号”,这个“身份证号”就是地址编码. ...
- java 集合框架(十六)Map
一.概述 Map是一个包含键值对的集合,一个map不能有重复的键(key),而且每个键至多只能对应一个值.Map同Collection一样,它的所有通用实现都会提供一个转换器构造函数,接收一个Map类 ...
- Swift 烧脑体操(四) - map 和 flatMap
前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...
- java apache-commons-collections中Map辅助类的使用
前言 apache-commons-collections中Map辅助类,很是有用.尽管我们通过原生Map经过业务逻辑处理也能达到相同的作用与效果,但毕竟作为一个开源的工具类辅助类,对它有个了解还是有 ...
- 【Go语言】map在goroutine通信中的使用问题
简介 本篇文章的主要内容是解决go语言map在使用中遇到的两个问题,对于初学者是不可避免的坑 一.cannot assign to struct field 当map中存在struct类型的成员,如果 ...
- 一篇面经(BAT面试)(转)
0. 写在之前 首先呢我的面试经历和一些面霸和收割机的大神相比绝不算丰富,但我这三个月应该能代表很大一部分人的心路历程:从无忧无虑也无知的状态,然后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着自 ...
随机推荐
- Java常见异常类
NullpointException(空指针异常)ClassNotFoundException(类找不到异常)ClassCastException(类型转换异常)IllegalArgumentExce ...
- 使用laravel框架与phantomjs实现截屏功能
在网上看到的关于phantomjs实现截屏功能很多都是与node结合在一起使用,并需要输入命令才能执行.因此我想要实现输入网址即可截屏并输出图片的功能.示例:http://120.77.171.182 ...
- Android学习笔记(5)----启动 Theme.Dialog 主题的Activity时程序崩溃的解决办法
新建了一个Android Studio工程,在MainActivity的主界面中添加了两个按钮,点击其中一个按钮用来启动 NormalActivity,点击另一按钮用来启动DialogActivity ...
- Python中os.listdir的排序问题
上周应别人要求,使用python批量修改文件名称.文件名有规律,当时就用了一个函数直接精确的用文件名替换了.后来想直接可以用listdir来遍历每个文件来修改更加通用一些.但是看了os.listdir ...
- MYSQL LOGBIN 数据日志恢复数据库随笔
查看指定的二进制日志中的事件(MYSQL命令行) mysql> show binlog events in 'binlogfullpath'; 查看二进制日志中的事件(MYSQL命令行) mys ...
- @WebServlet
编写好Servlet之后,接下来要告诉Web容器有关于这个Servlet的一些信息.在Servlet 3.0中,可以使用标注(Annotation)来告知容器哪些Servlet会提供服务以及额外信息. ...
- 爬虫IP被禁的简单解决方法——切换UserAgent
[转载]Python爬虫之UserAgent 用到的库 https://github.com/hellysmile/fake-useragent
- Linux sftp命令详解
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的网络的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 ...
- phpstrom设置php环境
phpstorm设置自动同步服务器 Tools->Deployment->Confinguration 点+号,添加服务器,类型SFTP,输入name 点击ok,项目与服务器连接成功! 设 ...
- 骑士周游问题跳马问题C#实现(附带WPF工程代码)
骑士周游问题,也叫跳马问题. 问题描述: 将马随机放在国际象棋的8×8棋盘的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码要求: 1,可以任意选定马在棋盘上 ...