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

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. 小白的springboot之路(十六)、mybatis-plus 的使用

    0-前言 mybatis plus是对mybatis的增强,集成mybatis plus后,简单的CRUD和分页就不用写了,非常方便,五星推荐: 1-集成 1-1.添加依赖 <!-- .集成my ...

  2. React-Hooks 学习概览

     React-Hooks的函数 组件方式代替原来的类继承,简化代码风格,好处是大大的: 1.useState  用来声明状态变量.要从三方面掌握:声明.读取.使用.(注意:useStae是不能进行条件 ...

  3. win7下firefox和chrome升级到最新版之后页面打不开的解决办法

    一.升级firefox到最新版后,页面崩溃,打开是空白页,连选项设置都打不开了. 最开始是我的firefox很久没升级,最近要要开始做开发,于是最让它自动升级.等升级到最新版本后,打开浏览器是结果显示 ...

  4. 实验三——NFS服务器配置

    实验三——NFS服务器配置 实 验 基 本 信 息 实验名称:NFS服务器配置(3学时) 实验时间:    年 月 日 实验地点:   信工606实验室 同组同学: 实验目的: 了解NFS服务的基本原 ...

  5. flask 密码加密 视频资料

    https://www.bilibili.com/video/av53870541/?p=33 通过在数据模型中定义函数来实现加密 from werkzeug.security import gene ...

  6. ggplot2(3) 语法突破

    3.1 简介 图形图层语法基于Wilkinson的图形语法,并在其基础上添加了许多新功能,使得图形更有表现力,并能完美地嵌入到R的环境中. 图形图层语法使得图形的重复更新变得简单——每次只更新一个特征 ...

  7. js函数的三种成创建方式以及它们各自的不同

    js有三种创建函数的方式: 1.function语句(也叫函数声明) function sum(a, b) { return a + b; } sum(1, 2); // 3 2. 函数直接量,又叫函 ...

  8. centeos安装Anconda3

    步骤: #获取安装包 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.2.0-Linux-x86_64.s ...

  9. tersserorc的简单使用

    tesserocr 是 python 的一个 OCR 库,它是对 tesseract 做的一层 Python API 封装,所以他的核心是tesseract. tesseract 的安装见 https ...

  10. vue项目中使用Lodop实现批量打印html页面和pdf文件

    1.Lodop是什么? Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码直接实现复杂打印.控件功能强大,却简单易用,所有调用如同JavaScript扩 ...