用 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. 写在之前 首先呢我的面试经历和一些面霸和收割机的大神相比绝不算丰富,但我这三个月应该能代表很大一部分人的心路历程:从无忧无虑也无知的状态,然后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着自 ...
随机推荐
- Android 一种非常好用的Android屏幕适配
前言 网上关于屏幕适配的文章已经铺天盖地了,为什么我还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就 ...
- 上海ctf2017 pwn100 && pwn200
前言 分析的 idb 文件在这: https://gitee.com/hac425/blog_data/tree/master/shanghaictf pwn100 程序是一个经典的 堆管理程序,基本 ...
- Java快速入门-01-基础篇
Java快速入门-01-基础篇 如果基础不好或者想学的很细,请参看:菜鸟教程-JAVA 本笔记适合快速学习,文章后面也会包含一些常见面试问题,记住快捷键操作,一些内容我就不转载了,直接附上链接,嘻嘻 ...
- PRINCE2考试用什么语言?
PRINCE2考试可用英语之外的阿拉伯语.中文.日语.马来西亚/印度尼西亚语.泰国语.越南语.菲律宾语.波兰语和盖尔语等9种语言进行. PRINCE2手册目前已有英文.中文.丹麦语和日语,正在翻译成荷 ...
- npm使用过程中的一些错误解决办法及npm常用命令和技巧
node,npm在前端开发流程中提供了非常完善的自动化工具链,但是同样由于其复杂性导致有很多奇奇怪怪的问题.本文将记录使用过程中出现的一些问题及其解决方法备案. 国内由于gfw问题,导致很多国外的网站 ...
- 实战:Nginx如何让用户通过用户名和密码认证访问WEB站点
有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问.那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些 ...
- 一分钟在云端快速创建MySQL数据库实例
本教程将帮助您了解如何使用Azure管理门户迅速创建,连接,配置MySQL 数据库 on Azure.完成本教程后,您将在Azure上拥有一个示例MySQL数据库服务器,并了解如何使用管理门户执行基本 ...
- 《C++ Primer Plus》读书笔记之三—循环与关系表达式
第五章 循环与关系表达式 1.表达式是值或者值与操作符的结合,每个C++表达式都有值.表达式到语句的转换只要加一个分号就可以完成.但是,反过来,从语句中删除分号,并不一定能将它转化成表达式. 2.前缀 ...
- 申请MVP奖励时的小Tips
大家新年好,今天MSPrecious为大家带来一些申请MVP奖励时的小Tips. 本文分为三个部分 MVP是什么 如何申请MVP 申请MVP需要注意的事项 MVP是什么? 我想,点进来看这篇文章的 ...
- 内置模块之sys
一.模块sys sys模块主要对解释器相关的操作 1.常用方法和属性 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) ...