范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

从华为跳槽来的工程师,繁琐的ifelse都处理得这么优雅

  最近和一位曾在华为工作过的朋友聊天,谈到一些关于软件开发的事情,虽然他现在职位已经是高级工程师了,但平时主要工作内容还是负责业务关系,也更关注业务逻辑的实现。
  遇到一些稍微复杂点的业务逻辑,少不了要用到if else ,但重复繁琐的if else,要是没有处理好,会给后期维护带来了诸多不便。
  同样是写if else的,这位华为高级工程师平时的做法跟普通的开发者还有一定的区别的。
  1.提前return
  假如有下面的逻辑 if(condition){ //do something } else { return 0; }
  这样编写的if else 中规中矩,从逻辑看完全没有问题,但这样的if else 完全可以通过对判断条件取反,代码在逻辑表达上会更加清晰。 if(!condition){ return 0; }  //do something
  这样从代码可读性看,我觉得第二种写法结构会更清晰,有利于后期代码维护。
  第一种写法,中规中矩的,if else 都齐全,而第二种写法,从代码行数来看,我觉得更简洁。让你来看这两种写法,你更倾向哪一个呢?
  2.使用Optional简化if判空处理
  if(obj !=null){ return value1; } else { return value2; }
  使用Optional后 Optional.ofNullable(obj).map(value1).orElse(value2);
  要是没有else的场景,可以使用ifPresent
  需要注意的是从 在使用jdk8时 我们使用jdk8的新特性Optional类解决判断为Null的问题
  在 jdk9 时对 Optional 类进行了改进,增加了 ifPresentOrElse() 方法,使用ifPresentOrElse()要注意jdk 版本问题。
  我个人觉得使用Optional来判断空对象,比if更简洁,同时也更好地避免空指针异常。
  3.策略模式
  上面两种只是关于if else 做简单的处理。如果你对设计模式有所了解,也可以通过采用策略模式来优化if else 的写法。
  下面我们来看一个具体案例。假设有这么一个需求:
  一个电商平台,当用户消费满1000金额时,这时候需要根据用户不同等级,给用户享受不同的优惠。
  优惠规则如下:
  普通VIP 不打折
  黄金 优惠100元
  钻石 8折
  plus 优惠100元,再打7折
  我们可以先用伪代码来实现下:
  private static BigDecimal getResult(BigDecimal  money, int userType) { BigDecimal  result = money; if (money >= 1000) { if (userType == UserType.GOLD) { System.out.println("黄金 优惠100元"); result = money - 100; } else if (userType == UserType.DIAMOND) { System.out.println("钻石 8折"); result = money * 0.8; } else if (userType == UserType.PLUS) { System.out.println("plus 优惠100元,再打7折"); result = (money - 100) * 0.7; } else { System.out.println("普通VIP 不打折"); result = money; } } return result; }
  上面这段伪代码我们就把功能实现了,但要是从代码的整洁度来看,不太乐观,尤其是对于编写代码有严格的要求的,这样的代码恐怕过不了代码审核环节。
  这时候我们就可以考虑使用前面提到的策略模式,
  使用策略模式编写代码的伪代码
  public interface Strategy { // 金额优惠计费函数 BigDecimal compute(BigDecimal money); } // 普通会员策略 public class VIPStrategy implements Strategy { @Override public BigDecimal compute(BigDecimal money) { System.out.println("普通VIP 不打折"); return money; } } // 黄金策略 public class GoldStrategy implements Strategy { @Override public BigDecimal compute(BigDecimal money) {     BigDecimal num1 = new BigDecimal(100);     System.out.println("黄金 优惠100元");     return money.subtract(num1); } } // 钻石策略 public class DiamondStrategy implements Strategy{ @Override public BigDecimal compute(BigDecimal money) {     System.out.println("钻石 8折");     BigDecimal num2 = new BigDecimal(0.8);     return money.multiply(num2); } } // Plus策略 public class PlusStrategy implements Strategy { @Override public BigDecimal compute(BigDecimal money) {     System.out.println("plus 优惠100元,再打7折");     BigDecimal num1 = new BigDecimal(100);     BigDecimal num2 = new BigDecimal(0.7);     return money.subtract(num1).multiply(num2); } }
  上面我们定义了一个 Strategy 接口,并且自定义四个子类,实现了接口。
  并在对应的 compute函数中实现自身策略的优惠计费方式。
  看着应该很不错的,但要是实际中我们还会用到了繁琐的if else。
  public interface Strategy { BigDecimal compute(BigDecimal money); // 返回 type int getType(); } public class VIPStrategy implements Strategy { @Override public BigDecimal compute(BigDecimal money) { System.out.println("普通会员 不打折"); return money; } // 添加 type 返回 @Override public int getType() { return UserType.VIP; } } public class GoldStrategy implements Strategy { @Override public BigDecimal compute(BigDecimal money) { System.out.println("黄金 优惠100元"); BigDecimal num1 = new BigDecimal(100); return money.subtract(num1); } // type 返回 @Override public int getType() { return UserType.GOLD; } } public class StrategyFactory { private Map map; public StrategyFactory() { List strategies = new ArrayList<>(); strategies.add(new VIPStrategy()); strategies.add(new GlodStrategy()); strategies.add(new DiamondStrategy()); strategies.add(new PlusStrategy()); map = strategies.stream().collect(Collectors.toMap(Strategy::getType, strategy -> strategy)); } public static class Holder { public static StrategyFactory instance = new StrategyFactory(); } public static StrategyFactory getInstance() { return Holder.instance; } public Strategy get(Integer userType) { return map.get(userType); } }
  这样一来就没有了if else了。
  private static double getResult(doublemoney, int userType) { if (money < 1000) { return money; } Strategy strategy = StrategyFactory.getInstance().get(userType); if (strategy == null){ throw new IllegalArgumentException("用户类型有误"); } return strategy.compute(money); }
  有时候一个简单的业务需求,不同开发人员实现的逻辑差不多,但有的编写的代码考虑就不是很齐全,容易在后面花更多的时间来修正,一个程序员的大部分时间,都是用在了分析需求和debug程序上了
  代码编写不规范,不清晰,后面维护起来真的让你如履薄冰。
  尤其是项目比较大,代码规范会更加重要。所以,在编写代码前多注意一些细节问题,后面项目维护起来会更加方便。
  总结:
  平时要实现功能时,要多留意下设计模型,工厂模式+策略模式+单例模式,这几种常用的模式在实际应用会经常使用到,掌握了可能会事半功倍的效果。
  #2022职场年终盘点#

GDP增速全国第三,甘肃做对了什么?今天一个数据令人振奋,根据地区生产总值统一核算结果,2022年,甘肃全省地区生产总值11201。6亿元,比上年名义增长9。5,按不变价格计算,比上年增长4。5,增速居全国第三,位次我3000元打工人炒股获利多年谈谈股票先看看我真实20192023。2。8数据炒股中最好的状态就是见好就收这话没毛病!股市里的钱好不好赚,看心态看本金,人的精力是有限的,将有限的精力投入到自己擅长的模式当中去,哪些情形属于非因本人意愿中断就业?失业保险金申领答疑来了劳动者在职期间参加失业保险的失业后符合有关条件的可以领取失业保险金哪些情形属于非因本人意愿中断就业?失业保险金只能领一次吗?有时间限制吗?关于失业保险金申领你是否也有这些疑惑?看这抖音试水外卖,2023电商的战场攻入本地?作者把青编辑袁佳琦抖音的触手终于伸到了超市。自从布局本地生活业务以来,从到店业务再到试水外卖,抖音迈着大步,深入美团腹地。日前,抖音将在北京上海成都试点外卖业务的消息登上微博热搜榜遥感瞰创新走近我国的大科学装置国家重大科技基础设施,又称大科学装置,是推动科技创新突破关键核心技术的利器。春节过后,我国科研工作者满怀热情地投入到新一年的工作中,下面我们就通过遥感卫星数字地球技术一起去我国的几桃源九中举行高一年级期考总结大会大会现场。红网时刻常德2月9日讯(通讯员张智慧裴以杰)2月8日晚,桃源九中高一年级期末考试总结大会在学校大礼堂隆重举行。高一年级主任黄建华德育主任刘兴文以及全体高一师生参加了本次表黑土地上玉米香黑土地上玉米香斯雄南方人习惯吃大米,玉米和面食相对吃得少。我老家江汉平原主要种植水稻,记得在上世纪六七十年代的时候,也种过玉米,但基本只是吃着玩儿。再往后,好像就很少见到种玉米的了张小泉法定代表人变更,张国标卸任张小泉董事长!近日,记者从天眼查App获悉,张小泉股份有限公司发生工商变更,张国标卸任法定代表人董事长,由张樟生接任。张小泉股份有限公司成立于2008年9月,注册资本1。56亿人民币,经营范围含芙蓉国评论春风送岗促就业,多措并举保民生王森春回大地,万象更新,兔年春节刚过,各地企业生产线均纷纷吹响复工复产号角,劳动力市场也呈现加速回暖局面。全国各地的春风行动如火如荼开展,通过线上线下招聘会,为企业和劳动者搭建平台为期两天!全国单板滑雪平行项目冠军赛在张家口开赛图为比赛现场。河北日报通讯员张利国摄纵览客户端讯(河北日报记者赵瑞雪通讯员李海璐)2月8日,为期两天的20222023赛季全国单板滑雪平行项目冠军赛在张家口市崇礼区云顶滑雪公园开赛动作真快,ChatGPT客户端来了这个客户端的GitHub地址是httpsgithub。comlencxChatGPTdownloads支持MacWindowsLinux。截止写文的时候,客户端已经更新到0。7。0
从计划生育到刺激生育我们只用了40年新中国成立之初,经历解放战争抗日战争的洗涤,我国人口急剧下降,政府出台了限制避孕和人口流产的政策,鼓励人们生育,促进人口增长。1982年我国将计划生育定为基本国策,同年写入宪法。主买断市场最新动态!51分先生联手KD,快船放虎归山,威少静观其变赛季中期交易截止日落下大幕,全明星周末越来越近,NBA又将迎来一个值得关注的时间节点买断截止日(北京时间3月1日)。按照惯例,买断市场藏龙卧虎,今年也不例外,未来一周将会有多位成名拉塞尔我的防守人不会放空我,所以我能为AD带来空间今日,湖人109103客场击败勇士。赛后,湖人后卫丹吉洛拉塞尔接受了采访。谈到他和安东尼戴维斯在比赛期间的交流,拉塞尔说我就是努力配合他打球。显然,如果我持球,他参与进攻时会吸引大一场丑陋的输球,暴露所有缺陷,内马尔成悲情英雄,梅西将获利好北京时间2月12日,法甲第23轮一场焦点战开赛,巴黎圣日尔曼客场挑战摩纳哥,最终摩纳哥31大胜领头羊,让大巴黎吃到了又一场败仗。本场比赛以后,大巴黎积54分,领先第二名马赛5分,继利拉德谈颜射乔治有时不敢相信我的射程那的确是个糟糕的投篮直播吧2月12日讯2019年西部季后赛首轮,开拓者vs雷霆G5,利拉德超远三分迎射保罗乔治,绝杀淘汰雷霆。全场比赛,利拉德出场45分钟,33投17中,得到50分7篮板6助攻。对此,全亚洲最虐港马本周开跑,内地跑者如何做准备?渣打香港马拉松本周日(12日)就要开跑了!渣打香港马拉松官网图之前因为疫情影响,经过多次延期后,终于大会宣布第25届渣打马拉松将于2023年2月12日(本周日)举行,3。7万个参赛麦迪创造的这五大NBA纪录,一个比一个难,30年内估计无人可破头条创作挑战赛麦迪,全称特雷西拉马尔麦克格雷迪(TracyLamarMcGradyJr。),1979年出生,在NBA职业生涯中,司职得分后卫小前锋。麦迪于1997年以高中生身份踏入火爆?里斯本竞技主场气势不俗,但波尔图已经是20场比赛不败了!里斯本竞技VS波尔图里斯本竞技目前取得12胜2平5负的成绩,排名葡超第四的位置,他们是本赛季葡超四大豪强表现最差的一支。不过球队也是在慢慢回升,目前主场优势不小,毕竟有着8胜1负的创造历史首获冠军!重庆体育健儿捷报频传重庆日报客户端赵迎昭在这生机勃勃的春日,我们迎来重庆体育健儿捷报频传的消息。2月11日,泰来杯2022年中国国际象棋甲级联赛总决赛在山东聊城战罢。在10日决赛第一回合失利的情况下,尼克斯休赛期大动作,有意引进扣篮王扎克拉文,报价方案诚意满满据美媒NBAAnalysis报道,尼克斯在刚截止不久的交易市场上并没有什么大动作,只做了一笔小修小补的交易,将雷迪什送至开拓者换来约什哈特。如果今年季后赛他们不能有所斩获,管理层就没妈的孩子像根草今天没有发视频,昨天剪辑了一个感觉画面感不好晃动严重,担心审核不通过就没有发布,望友友们理解。今天周末有点时间还是在这里聊会天吧,家家有本难念的经每个人的生活也都不是一帆风顺,开弓