今天的分享来源于工作中的点点滴滴……

01. 习惯性自嘲


代码写久了,伴随肩疼头痛眼近视,于是乎也就成了名副其实的 code farmer(码农),作为如牛吃草挤奶般的码农,吃草(撸)挤奶(码)便是日常要事,接下来就聊聊身边同事的一些关于撸码的问题,顺道穿(掰)插(扯)一下我独到的见解(想想我这脸皮会有多厚)。

02. 撸码的艾尔莎


假想一下,你投资的产品到期了,但是你却没有收到平台给你的转账,面对此种场景,估计你会二话不说,先去看看投资平台的官网还在不在,确认是不是平台跑路啦;然后去找客服投诉......

做过理财相关项目的应该都清楚,赎回是用户最关心的功能,但是赎回过程中往往涉及到很多的状态,例如初始状态、赎回中、赎回结果不明、赎回失败、赎回成功等等,但是不同的状态,所做的业务处理逻辑也不同。

敢问,赎回的这段代码该怎么撸呢?同事艾尔莎撸码实现过程中,可谓是吐槽又吐槽,于是就出现了下面的代码段。

不要小看上面代码段中每一个状态下的输出打印,在真实场景下,每个状态对应少则有 10 行,多则有上百行代码,所以用“一坨”这个词来形容真实的那段代码,再合适不过啦。

不过,是否可以调整调整代码呢?

答案是必须的,同事艾尔莎遂拿出《阿里巴巴Java开发手册 v666.pdf》,借用鲁迅先生提倡的“拿来主义”的思想开始调整。

调整一:采用阿里开发手册“注释规约”章节中提到的原则,先调整注释。

【强制】
方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释,使用/* */注释,注意与代码对齐。

在每行末尾进行注释,不只是艾尔莎习惯性的问题,也是很多同事习惯性的一个问题,那采取规约调整后的效果如何呢?的确是明朗了不少么?!

调整二:采用阿里开发手册“编程规约——常量定义”章节中提到的原则,调整常量。

【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

艾尔莎按照“编程规约”提炼魔法值,进行常量定义,调整之后的效果如下,档次感觉有点上升。

到这,大多数码农重构代码可能就止步了,因为在业务支撑没有任何问题,在代码阅读上也没啥大问题了,但是艾尔莎重构代码绝不至于当前,于是又搬出《重构:改善既有代码的设计》宝典,开始了更进一步的重构。

艾尔莎掌握了书中“Replace Conditional with Polymorphism(以多态取代条件式)”的精髓,并且开始一步步尝试。

首先回顾上段代码段,从高度上去看,无论每个状态条件下做什么事情,都是进行相关处理而已,所以把每个状态条件下要做的事情,抽象出一个接口,只定义一个要处理的操作规范就可以啦。

然后把每个状态条件下要处理的事情,各自去实现接口,完成各自的事情处理就好了。

例如,赎回状态为初始的业务逻辑处理实现如下。

例如,赎回状态为赎回中的业务逻辑处理实现如下。

其它状态就不一一列举啦,主要是思想、主要是思想、主要是思想。

最后是奇迹发生的地方,直接抛码。

可以看出原有的“一坨”代码,变成了两句。简单解释一下变化后的两句代码,主要是根据赎回状态获取对应的业务逻辑处理实现,其中 SpringContextHolder 网上一搜一大片,其本质还是从 ApplicationContext 获取 Bean 的实例。如果在非 Spring 环境实现起来也简单,维护一个 Service 实现的配置文件,然后用反射创造出每个赎回状态对应的实例(这个实现准备在“爱情 36 技”系列中开篇去讲,本次不多说)。

艾尔莎这么重构,会有什么效果?个人愚见

1. 直观上代码量陡增(要是按照代码行数,发工资该多好啊),代码易阅读(不过喜欢较真的同学,肯定认为这没有 if/eslse 看着爽,影响了阅读,哈哈);

2. 状态条件要是继续增多,直接自定义状态对应的实现处理就好了,对原有状态分支不影响;

3. 紧急需求来临时,无需关注每个状态的处理,只需关注对应的状态的实现,进行处理即可;

艾尔莎这么重构,会有什么效果?官方定论

1. 在面向对象术语中,听上去最高贵的词非“多态”莫属。多态最更根本的好处就是:如果你需要根据对象的不同型别而采取不同的行为,多态使你不必编写明显的条件式;

2. 针对 type code(型别码)而写的大量 switch 语句以及针对 type string(型别名称字符串)而写的 if-then-else 语句在程序中就会很少出现;

3. 如果想增加一种新型别,只需要建立一个新的 subclass,并提供适当的函数实现就行了,这么一来就大大降低各部分之间的相依程度,使系统升级更加容易。

官方说的就是漂(生)亮(硬),暂不管个人愚见还是官方定论,不过经过艾尔莎的重构,确实改变了既有代码的设计,代码逼格确实陡然上升。

如果感觉有意思,那么在实际开发中,如果你也遇到大批量的 switch/case、if/else 不妨采取此方案尝试进行重构一下。

03. 撸码的艾米丽


同事艾米丽是 Android 开发人员(没错,上次文章提到删库的就是她),她近期在自研一个社交的项目,从前端到后台,不知不觉她就成了全栈开发。

不过,作为一个跨界全栈码农,总是有很多我们看似简单的小问题,却阻挡她前进,下面简单扯一扯她遇到的一个“Java 截取文本中超链接”的问题。

背景。有一个类似头条“Hi,#艾米丽#这大概就是冰雪美人吧#杰瑞#这是一只没有苦恼的老鼠”这样的一段文本,她在后端存储格式是下面这种富文本格式。

Hi,#艾米丽#<a title=\"艾米丽\" target=\"_blank\" href=\"http://v.xxx.com/xxxx1\">这大概就是冰雪美人吧</a>#杰瑞#<a title=\"杰瑞\" target=\"_blank\" href=\"http://v.xxx.com/xxxx2\">这是一只没有苦恼的老鼠</a>

但是 App 端不像 H5 那样直接能渲染链接,App 端需要拿到里面的链接才能做后续的事情,但是如何进行拆分拿到里面的链接,隔行如隔山,这可难倒了她!

寻找 idea。隔行如隔山,但隔行不隔理,一猿小将来支招,直接用最土、最 low 的方法进行正则匹配来拆分字符串就好了,艾米丽抱着编码思想去尝试解决去啦。

一天过去了,艾米丽的问题仍然没有解决,小窗口找我帮她搞定一下。

帮人帮到底。于是花了 2 分钟的功夫,先用最土的方法正则匹配,解析出艾米丽想要的链接;然后又找谷哥、度娘搜罗一番,解决方案可谓是应有尽有,于是把解决方案整理成

(1)最土、最 low 方法,正则匹配拆分;

(2)采用一款 Java 的 HTML 解析器 jsoup;

(3)采用 android.util 工具包

......

艾米丽最后采用最适合自己的一款 android.util 工具包得意解决。

一个看似很小的问题,静下来想一想,却把编程十余年的撸码套路说清楚啦。

面对需求实现或者疑难杂症,无论问题大小,首先花点功夫琢磨一下、在脑海中搜索一下实现思路;然后找谷哥度娘搜罗一番,看看是否有现成的方案;接着冷静思考,大胆去实现;如果仍然无解,最后求助同事/好友求 idea,也就是寻找高人指点迷津!

04. 完美的总结


身边以 Coding 为生的 farmer,一板砖拍下去确实能拍伤好几个,不过他们的日常工作,无不透漏着一点,那就是 Coding 是个技术活,撸码也有套路,需要掌握方式方法,闲暇之余多看看轮子,多积累技术栈,多寻找寻找灵感。

好了,一猿小讲一家之言,就掰扯就到这儿,如果再有人问“编码规范”不妨拿本文去扯扯淡。

最后,希望今天的分享能够对你们有一丁点帮助,当然也希望你们能够喜欢

Coding 是门技术的更多相关文章

  1. CSS 小结笔记之滑动门技术

    所谓的滑动门技术,就是指盒子背景能够自动拉伸以适应不同长度的文本.即当文字增多时,背景看起来也会变长. 大多数应用于导航栏之中,如微信导航栏: 具体实现方法如下: 1.首先每一块文本内容是由a标签与s ...

  2. css+html应用实例1:滑动门技术的简单实现

    关于滑动门,现在的页面中好多地方都会用到滑动门,一般用作于导航背景,它的官方解释如下: 滑动门:根据文本自适应大小,根据背景的层叠性制作,并允许他们在彼此之上进行滑动,以创造出一些特殊的效果. 为什么 ...

  3. CSS——滑动门技术及应用

    先来体会下现实中的滑动门,或者你可以叫做推拉门: 滑动门出现的背景 制作网页时,为了美观,常常需要为网页元素设置特殊形状的背景,比如微信导航栏,有凸起和凹下去的感觉,最大的问题是里面的字数不一样多,咋 ...

  4. CSS - 滑动门技术

    1. 概念: 1.1 为了使各种特殊形状的背景能够自适应元素中文本内容的多少,出现了CSS滑动门技术. 1.2 使各种特殊形状的背景能够自由拉伸滑动,以适应元素内部的文本内容,可用性更强. 1.3 最 ...

  5. Coding for Speed 技术分享

    上周和公司技术同事们作了次<Coding for Speed>技术分享,本来这只是再普通不过的技术探讨和交流(虽然挂了个颇有噱头的名称),但分享的时候逻辑没理好,语速很快,时间也太紧,因此 ...

  6. css滑动门技术

    滑动门的核心技术: 为了使各种特殊形状的背景能够自适应元素中文本内容的多少,以使自由拉伸滑动 利用css精灵(主要是背景位置)和盒子padding撑开宽度,以便适应不同字数的导航栏 一般经典布局 &l ...

  7. Debug 是门艺术

    最近想结合发生在身边码农身上的一些小故事,尝试表达一个观点“Coding 是门技术,Debug 是门艺术”. 上期的分享<Coding 是门技术>主要通过引入身边 Code farmer ...

  8. Android安全攻防战,反编译与混淆技术完全解析(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/49738023 之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值 ...

  9. 用“MEAN”技术栈开发web应用(一)AngularJs前端架构

    前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技 ...

随机推荐

  1. 调用系统的loading界面

    //在状态栏显示一个圈圈转动  代表正在请求 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

  2. NSFileHandle的用法(用于读写文件)

    利用NSFilehandle类提供的方法,允许更有效地使用文件. 一般而言,处理文件时都要经历以下三个步骤: 1.打开文件,并获取一个NSFileHandle对象,以便在后面的I/O操作中引用该文件 ...

  3. 智慧港口——基于二三维一体化GIS的港口可视化监管平台

    “智慧港口”是以现代化基础设施设备为基础,以云计算.大数据.物联网.移动互联网.智能控制等新一代信息技术与港口运输业务深度融合为核心,以港口运输组织服务创新为动力,以完善的体制机制.法律法规.标准规范 ...

  4. 内存管理 malloc free 的实现

    libc 中提供非常好用的  malloc free 功能,如果自己实现一个,应该怎么做. 要实现 malloc free 需要有 可以分配内存使用的堆,和记录内存使用情况的链表. 如下图所示,堆从高 ...

  5. 复制图片链接和标题生成Markdown文本

    写Markdown的时候常常会需要复制图片链接和标题以插入图片,不借助其他工具的话,一般需要先在Markdown文件中输入插入图片的格式,然后在浏览器中复制图片链接和标题将其依次粘贴到Markdown ...

  6. ggplot2(5) 工具箱

    5.1 简介 ggplot2的图层化架构鼓励我们以一种结构化的方式来设计和构建图形.本章旨在概述可用的几何对象和统计变换,在文中逐个详述.每一节都解决一个特定的作图问题. 5.2 图层叠加的总体策略 ...

  7. JAVA反射概念及使用详解(超详细)

    JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 ​ 好处: ​ ...

  8. 原生Canvas循环滚动弹幕(现金红包活动带头像弹幕)

    效果 gif有些糊,可以 在线预览 实现关键点 requestAnimationFrame 循环帧: 绘制单条弹幕,画框子 -> 画头像 -> 写黑色的字 -> 写红色的字, mea ...

  9. 两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走 (不加flex不自动撑开)

    两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走

  10. vscode如何配置debug,python正则表达式如何匹配括号,关于python如何导入自定义模块

    关于vscode如何配置debug的问题: 1.下载安装好python,并且配置好 环境变量 2.https://www.cnblogs.com/asce/p/11600904.html 3.严格按照 ...