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

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

两异姓兄弟,从丁点本钱做小生意,直到巨富,会做生意更会做人有人想做生意,可惜苦于没有本钱,无法下手。不仅现代人如此,古人们也是如此,但有些人,的确是经营好手,用很小的本钱和从不起眼的小生意做起,后来做到很大的买卖。下面就一个例子,或许对做黄晓明母亲控制欲太强,儿子婚变后她伤透了心,婆媳关系难以和谐黄晓明母亲控制欲太强,儿子婚变后她伤透了心,婆媳关系难以和谐黄晓明母亲控制欲太强,Angelababy婆媳关系难和谐!2015年10月8日,一场名为啊的世纪婚礼震惊了整个娱乐圈,吴每日GIF动图糟糕,对笑起来的姑娘还真的没有抵抗力糟糕,对笑起来的姑娘还真的没有抵抗力这是什么东西,属实给我吓到了这个设计可以呀,又省力又省空间,给我来十个!又名黄蛇,喜水现在已经好久没有见到过萤火虫了,何况这种萤火虫可以直接触摸安倍是替罪羊?枪杀安倍后,山上的母亲终于说话了日本前首相安倍晋三几日前被枪杀在奈良街头的消息,估计全世界都知道了。在被枪杀后,人们纷纷探寻凶手枪杀安倍的真实动机。后来,被在现场逮捕的凶手山上彻也称,他恨自己的母亲参加了世界和平一个母亲的忏悔2022年7月8日,随着两声枪响,日本一个重量级的男人倒下去,另一个如蝼蚁般卑微的男人出现在公众视野。演讲中的安倍晋三嫌疑人山上彻也山上彻也,奈良市人,80后,未婚,无子女,目前是赵振兴664分,赵振中674分,赵振华654分,三胞胎母亲身份不简单前言叮咚,叮咚2022年7月10日下午,家住湖南省衡阳市的谭妈妈,从邮递员手中接过两封来自中国科学院大学(简称国科大)的录取通知书,不禁喜极而泣。她的大儿子赵振兴以664的高分,被胡琳娜被称为最惨星二代,刚满月母亲就离去,35岁还孤身一人近日,演员胡琳娜时隔许久后难得晒出了与母亲丁嘉丽的合照。只见照片里,今年已经63岁的丁嘉丽虽然比前段时间热播的电视剧欢迎光临里的模样又苍老了一些,脸上的皱纹也多了不少。但是,与女儿幸运的是魔女看上了我,不幸的是我不能陪她很久今天微凉来跟大家聊一聊加藤老师在推特上更新的另一个小短篇漫画,她打发时间逐渐堕落的一天又一天,也是很久都没有更新了。大家看到这张图有没有觉得很熟悉或者曾经在哪里看过的样子。这一幕还谁说近视眼呆滞无光?这5位高度近视的女明星,眼里全是星星如今,很多演员就被大家吐槽眼神无戏眼里无光,我们从他们的眼神里看不到任何情绪上的变化,就算长得再漂亮,也就只是一个木头美人。好多人都说,眼睛没有光芒和近视有关,确实,近视会让人的眼罚罪警察局里的奸细不是张大和宋光明,更不是肖振邦,另有其人看电视剧罚罪,不但每一集都让人紧张万分,还感觉自己脑子不够用,进度太快,线索太多,傻傻分不清到底谁是好人谁是坏人?但,这也正是这部剧的魅力所在!剧情更新到十二集,常征的爆炸案依然毫腰斩禁播,9。6分国产神作挡了谁的路?有这么一部国产动画。画风清奇,人物吊诡,被称作童年阴影。一个又一个奇形怪状的妖怪,恐怖又阴森。主编点开,都得起一身鸡皮疙瘩。有这么一部国产动画。打戏牛逼,一招一式刚柔并济,尽显中国
武汉德比再出争议,李金羽遭遇山东泰山式判罚,都是橙色惹的祸?中超联赛第四轮迎来了武汉德比,作为本赛季的两支黑马球队,武汉三镇和武汉长江都打出了令人眼前一亮的感觉,都是三轮不败,武汉三镇作为升班马更是三轮比赛中超火力最猛的球队,打进11个进球海贼王1053,巴基当四皇,Mr。3却是最大赢家,赏金起码10亿贝里大家好,我是小蜘蛛。海贼王最新一话的情报更新了,这一话的情报当中十分令人震撼的一点那就是小丑巴基竟然成为了四皇,要知道打败了大妈的基德和罗都无缘这个位置,而巴基竟然做到了,简直是一女用伟哥药,真的没有那么简单6月13日,上外通报一学生被投放异物冲上微博热搜第一。在目前曝出的聊天记录中,该男生投放的异物为牛磺酸泡腾片6月12日中午12点左右,上海外国语大学女学生在图书馆自习时,发现咖啡杯日本人藏在炮楼中,久攻不下,老农民路过说这还不简单战争无论在哪个时代都是残酷的,往往侵略的一方总是在战争中略占上风,因为他们准备更充分。但也有很多侵略战争最终都失败了,因为被侵略的一方有誓死抵抗外侮的决心和勇气,而决心和勇气,很多警惕唐山事件变质女孩妈妈发声,外媒疯狂插手,事情果然不简单就在6月16日下午,唐山打人事件女受害者的妈妈,终于破天荒地发布了第一条公开信息。受害者妈妈说,我们没有向恶人妥协,没有私了,到现在对方一句道歉都没有!之所以事情发生这么久才发出声国服前十云顶S7热补丁后王者最强8大阵容,低费赌狗崛起热补丁之后不知道该玩什么没有关系最强的阵容兔子已经帮你整理好了热补丁虽然改的不多但是王者前十的环境已经出现了翻天地覆的变化风暴95在王者局已经彻底被淘汰了但是大成的驯龙95依旧是王河北省委主要负责人谈唐山打人案极其恶劣从严从快依法查办6月13日至14日,中国共产党河北省第十届委员会第二次全体会议在石家庄召开。全会由省委常委会主持,省委书记倪岳峰代表省委常委会作报告。据中新网石家庄6月14日电,河北省委主要负责同6月15日,纪委高检通报10名干部涉嫌违纪违法被查处,看看是谁?据中纪委最高检省纪委网站6月15日消息,8名干部涉嫌严重违纪违法被查处,其中,中管干部1人,央级机关干部1人,省管干部4人,市县管干部4人3人受到党纪政务处分,6人正在接受审查调查西尔维斯特我相信曼联有很好的转会计划,我对此并不担心直播吧6月16日讯前曼联后卫西尔维斯特在天空体育的节目中,点评了曼联今夏到目前为止的转会操作,他表示自己对于红魔的情况并不担心。西尔维斯特这样谈道这是一次进展缓慢的转会市场,一些球宛新平一碗皖粮,几多耕耘几多甘甜十九连丰!安徽夏粮颗粒归仓,交出了大丰收的喜人答卷。一粥一饭,关乎国家安危人民幸福。习近平总书记高度关注粮食安全这一国之大者。近日在四川考察时,习近平总书记思虑深远民以食为天。推进有趣的错觉照片,让你看两遍(30张)有趣的错觉照片,让你看两遍(30张)1hr我满满一杯牛奶,使得杯子看起来颠倒了。2hr球不在他头上。就在他身后的地板上。3hr当你讨厌酒店里的客人时4hr5hr6hr7hr金属炖锅