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

从华为跳槽来的工程师,繁琐的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职场年终盘点#

跟着唐诗宋词去旅游清明媒体作为传递主流价值的信使,担负着承载文化引领价值成风化人的使命。我们希望找到符合当代审美以年轻人喜闻乐见的方式推动古与今的对话,更好地传承中华优秀传统文化。人民日报假日生活版开设广州滑雪女孩签约北京队,妈妈说她想成为谷爱凌那样的人11岁的王涵之成为北京市青少年滑雪队签下的首个外地队员。新京报首席记者郭延冰摄3月21日,王永平许红连夫妇带着女儿王涵之回到广州。从去年11月18日前往崇礼,他们度过了为期124天妈妈骑车带俩娃被罚款我能怎么办,杀一个吗击中二胎妈妈痛点如果你有两个孩子,你是选择骑电动车一个一个的送上学,还是一次带两个一起送呢?前段时间,一位妈妈用电瓶车一带二送孩子上学,途中被交警拦下,执意让交了罚款才肯放他们走。网友看到这,开始警察妈妈进课堂安全教育促成长如果有陌生的叔叔阿姨向你问路,你会怎么办呢?广饶县育英幼儿园的家长进课堂活动中警察妈妈正给小朋友们进行防拐防骗安全教育这位警察妈妈育有一对5岁的双胞胎,是来自广饶县公安局特警大队的特殊的孩子没有错,如果有错,那也是妈妈的错,世界这么大我的特殊女儿,她不过是个孩子。最近这两天总有一些杠精跑过来说您这样的孩子太可怕了,不要带他出门了。我看了一下他们的账号,有一些是私密账号,也有一些其实他们也是妈妈。我们只是一个普普毛骨悚然!妈妈带宝宝在吊床睡觉,突然闯入5米大蟒蛇事情发生在乡下的一户人家,一位妈妈正搂着宝宝在吊床上睡觉,突然妈妈觉得哪里不舒服,就起身活动一下,然后继续坐在了吊床下哄宝宝睡觉,此刻的画面还是平淡且温馨的。然而,还在睡意中的妈妈不是吧?原来绍兴大街上还有这么多百年老字号!众所周知,绍兴老城区作为一府二县的治所,曾经拥有过众多远近闻名的老字号,但是时至今日,这些老字号几乎已快消失殆尽了,那么绍兴老城区曾经有过哪些著名的老字号?这些老字号又是什么原因才被外地吃货追捧的富平柿饼,为什么没让本地农民挣到钱01hr对于柿子之乡的富平人来说,已去的2022可谓极不平凡的一年。这年,天公作美,柿子产量大幅度增加,一跃攀上历史新高。可人们知道,柿子这一果品的属相有点奇特,它不像苹果梨子猕猴今年穿西装,别再搭裤子了,很土!学潮人这样搭裙子,多时髦显瘦西装搭配的经典所在就是其百搭而又绝对彰显气质的优势之作,但是最常规的西装搭配裤子单品你还在继续运用吗?换一个吧,这样的搭配还是带点土气在身上的呢,而且不一定修饰好身形。不如将裤子的女人若是步入中年,就别急于扮嫩了,穿衣懂这几点一看就显贵体面想让自己打扮得更年轻点无可厚非,但女人年纪大了后,若是在穿衣减龄上用力过猛,反而成了扮嫩,而扮嫩只会毁掉属于中老年人的那份坦然气质。建议步入中年阶段的女人,别急于扮嫩了,穿衣懂这几不该清理的痘痘不要针清,尤其是冒白的痘痘就把脓头处理不同痘,处理!不同的状态,到底应该怎么处理?这条视频干货一定要记住!不同痘的处理第一种第二种第三种首先这种不冒白的,看起来红红的痘痘,甚至还有点疼。不论它长在哪个位置,不要抠不要挤
那些年,最温暖的常识睡不着?喝杯热牛奶吧!这大概是失眠界最火最温暖的常识,大部分人都从爸爸妈妈爷爷奶奶以及贴心的朋友那里听过这句话睡不着,就喝杯热牛奶吧!那么,牛奶助眠到底有没有科学依据呢?有!研究显身体为什么会长结石?这些饮食习惯要改了结石这玩意很多人身上都有有的结石会让人出现明显不适有的结石只有在体检报告上才会刷刷存在感身体为什么会长结石呢?又有哪些饮食习惯在养结石呢?身体为什么会产生结石?结石顾名思义就是石头今年裤子流行穿长不穿短,高级时髦显腿长,适合小个子入手春日的气息越来越浓厚,不过在这个早春时节,很多地区依旧没有回暖的迹象,因此,保暖效果好一些的裤子依旧是时髦精们最先入手的款式。不过很多姐妹为了方便搭配,常常会选择九分裤做造型,九分今年穿卫衣别再配长裤了!瞧瞧杨幂杨紫这样搭,有多时髦显瘦卫衣作为春季里的经典单品,其在女性心目中的地位绝对是名列前茅的存在了,可以说是自卫衣问世就是一款经久不衰的状况,它自身所带的随性和休闲的质感让不少的单品与之搭配都是一出很经典时尚感江疏影走机场真会穿,黑色健美裤秀电线腿,佩戴黑框眼镜像大学生点击上方关注小丸子,获取更多有趣有料的时尚资讯和明星穿搭。时尚圈里面的经典元素很多,条纹或者格纹图案就是其中之一。无论是针织衫T恤衬衫等单品都有条纹或者格纹影子,小清新的条纹格纹凸38岁唐嫣终于现身!出门晒太阳全身大牌好有巨星范,幸福写在脸上时间迈入3月,很多地区的气温都已经纷纷转暖,不少人也都脱下了厚重的羽绒服,换上了更为轻便的春装,2月28号,好久没有公开露面的唐嫣,就在自己的社交平台上跟粉丝们分享了一组自己出门晒足协官方辟谣暂停联赛为虚假消息,表示谴责!新赛季正在筹备中北京时间3月1日,中国足协官方发布公告,表示此前网络上国足各级联赛暂时停赛,制定规划的报道为假消息,目前各级职业联赛正在有条不紊地筹备中。中国足协表示,对于这种凭空捏造假新闻的恶劣女排重建,62岁郎平走上新岗位身兼双职,爱将朱婷成为受益者中国女排如今已进入重建阶段,蔡斌教练成功担任女排主教练一职,这也让沉寂很久的女排消息再次进入球迷的眼中,东京奥运的惨败使得女排一度跌落神坛,其中有很多人去吐槽,但依然有更多的人继续24岁男篮天才全家福曝光!怀抱双胞胎儿子,娇妻美艳依偎在身边在中国男篮领域,我们诞生过3大中锋王治郅巴特尔和姚明,三人都曾征战过NBA,叱咤风云多年,被誉为中国三大移动长城,而篮球发展需要更多高个子人才,其中最为出类拔萃的周琦,他曾带着期望CBA大冷门,辽宁020崩盘杨鸣暴跳如雷,郭艾伦捂脸,吴庆龙鼓掌北京时间3月1日,在今天进行的CBA常规赛中爆出了大冷门,在第1节比赛的后半段,辽宁队出人意料的开始哑火了,他们连丢了20分,被青岛队疯狂的打出了一波200的高潮,这个真的是让人有时隔416天,状元郎迎来复出,71命中率6助攻1失误拒做水货自2021年1月7日伤退赛季报销后,时隔416天状元郎富尔茨终于在今天迎来了复出。一年多未能上场的他被教练限制了出场时间,替补登场16分钟7投5中砍下了10分2篮板6助攻,且只有1