Java生鲜电商平台-一次代码重构的实战案例
Java生鲜电商平台-一次代码重构的实战案例
说明,Java开源生鲜电商平台-一次代码重构的实战案例,根据实际的例子,分析出重构与抽象,使代码更加的健壮与高效。
1.业务说明
系统原先已有登录功能,我们打算增加一个登录IP和允许登录时间的安全限制业务。
IP 分为内网ip、外网ip,如果设置了,则该用户只允许在这些ip登录
2.原有代码贴图
登录代码原先已有,这是增加的功能,该同事增加的代码如下:
图1:login方法中,判断是否可以登录的私有方法调用
图2、3、4该私有业务实现方法。
3原有代码问题分析
从该方法的调用方式,到该方法的实现,代码都存在不少问题,我先逐一分析,然后再贴上我重构的代码以及重构的思路。
调用方式
用String匹配的方式判断,直接用boolean判断即可。
时间hh:MM的处理 应该写成工具类,避免重复。
字符串分割的处理 多个地方存在将字符串(逗号分隔)分割为集合的代码,应该写成工具类,可读性好,并避免重复。
三种比较业务缠绕到一起,业务可读性差。 这里涉及允许时间判断、内网ip、外网ip三个业务判断,但是代码通过循环缠绕到一起,可读性差,不够聚合,难以修改。
多处存在SecureLogEvent的构造(构造安全日志记录),并且没有将关键业务数据传入。
注释很少,关键代码不容易阅读。
方法命名不够准确、明确。
Magic Code太多,应该重构为常量。
4重构过程说明
由于重构过程的代码是反复修改,所以已经不好拿回,我先说明一下我的重构过程,然后将重构结果代码贴上,这样读者应该可以基本理解了。
先阅读该部分代码,观察那里存在重复。
将将时间处理分割出来,作为独立私有子方法。
写好后,写个main函数测试一下,没问题了就替换原方法中时间处理部分的代码。
阅读字符串分割相关代码,找出其共性,然后写私有方法、测试、替换。
观察原先代码,【允许登录时间】判断是在两重循环里面进行判断,但是从业务角度,只要不在允许范围,哪怕ip允许也是一样不行的,所以应该单独判断,而不是放在循环里面。
内网ip判断、外网ip判断,同理,也应该可以独立判断,所以两重循环就可以拆成两个独立的循环了。
业务理清后,代码层次就清晰了。
然后将日志增加有价值的业务数据、代码加上注释、魔术字重构为常量等。
将调用处(前面图1)改为boolean方式。
将整个规则判断代码从CreditController中移出去,新建一个合适的工具类存放,一来减少该Controller代码,二来以后类似的扩展都已放到该工具类中,职责更加分明。
5重构后的代码
图1:调用处,改为工具类,并且返回boolean,命名方面可读性明确,禁止ip和访问时间,如果返回true,就跳回登录页面。
图2、3:
最上面是常量。
然后下面是目前本类唯一一个公有方法。
先判断允许方法时间,调用私有方法forbitVisitTimeRange。
然后下面isInside(是否可以内网访问)、isOutside(是否可以外网访问)分别判断(调用checkRange私有方法),去掉了两重循环。
recordLog写成私有方法,并允许传入拼接信息,把有业务意义的关键数据也写到日志中。
图4、5、6三个图。
时间处理:通过ToDay工具类(我的框架自带)处理,可读性更好。
逗号分隔的字符串的分割方法,用框架的工具类,并通过两层的私有方法,让代码更容易维护。
写日志的私有方法,增加了拼接业务数据字符串的参数供传入。
6.总结
避免重复代码 看到重复代码,务必想办法把它抽离出来重用。
善用工具类 无论自己框架的还是第三方开源框架的,不要自己发明轮子,如果没有,甚至自己写一个工具方法,这样可以让代码更关注业务。
涉及多重循环时,好好考虑一下是不是一定要这样做才可以。能否每个业务一个独立的子方法?
注释不能省,而且对于关键代码,有注释可读性大大提升。
魔术字要重构为常量。
写日志时,切记不要写那种没有参考价值的日志。你要考虑一下,如果以后业务出错或者出现意外需要回看日志时,这些信息够不够,能不能让你足够的重现当时的场景
Java生鲜电商平台-一次代码重构的实战案例的更多相关文章
- Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP)
Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP) “微服务架构”的话题非常之火,很多朋友都在小窗我,说怎么做服务化?解答“怎么做”之前,先得了解“为什么做”. 画外音:做 ...
- Java生鲜电商平台-促销架构以及秒杀解决方案实战
Java生鲜电商平台-促销架构以及秒杀解决方案实战 背景:随着这几年的电商的大热,我们经常看到一些商家为了促销和快速收益,纷纷推出了秒杀活动.不管是日常的超市里面的促销,明星演唱会门票售卖,还是春节订 ...
- Java生鲜电商平台-用户管理的架构与实战
Java生鲜电商平台-用户管理的架构与实战 在电商后台中,用户管理是运营人员管理用户的模块.这里的用户区别于运营人员,会在权限的角色管理中分别阐述.这里的用户包含平台的一般用户,会员用户等.本文将分享 ...
- Java生鲜电商平台-生鲜售后系统的退款架构设计与代码分享
Java生鲜电商平台-生鲜售后系统的退款架构设计与代码分享 说明:任何一个电商行业都涉及到退货与退款的问题,但是生鲜电商行业还设有一个显著的特点,那就是换货.在人性面前,各种各样的退货,退款,换货的售 ...
- Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解
Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解 说明:Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解,实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返 ...
- Java生鲜电商平台-统一异常处理及架构实战
Java生鲜电商平台-统一异常处理及架构实战 补充说明:本文讲得比较细,所以篇幅较长. 请认真读完,希望读完后能对统一异常处理有一个清晰的认识. 背景 软件开发过程中,不可避免的是需要处理各种异常,就 ...
- Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战
Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战 说明: Java生鲜系统中微服务的拆分应该如何架构设计与分析呢?以下是我的实战中的设计与经验分析. 目录 1. 微服务简介2. 当前现状3. ...
- Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案
Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...
- Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构
Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留 ...
随机推荐
- CAD如何能画的快?老师傅教你5个技巧,远超他人
都知道CAD用途是很广泛,各行各业都是离不开CAD画图设计,机械,建筑,园林,服装,家具…… 画图速度一定要够快速,这样才能够满足需求,事实上会发现有的人绘图非常快速,但是你出一张图却要加班赶点.差距 ...
- webservice调用天气服务
常见服务:http://www.webxml.com.cn/zh_cn/support.aspx 可能用到缺少的ArrayOfString.java文件 package com.test.wes.we ...
- MD5哈希算法及其原理
- MD5功能 MD5算法对任意长度的消息输入,产生一个128位(16字节)的哈希结构输出.在处理过程中,以512位输入数据块为单位. - MD5用途及特征 MD5通常应用在以下场景: 1.防篡改,保 ...
- [b0041] python 归纳 (二六)_多进程数据共享和同步_事件Event
# -*- coding: utf-8 -*- """ 多进程 同步 事件multiprocessing.Event 逻辑: 子线程负责打印,会阻塞, 等待主进程发出控制 ...
- 基于socketsever下实现的FTP
# ### 客户端client import socket import json import struct import os sk = socket.socket() sk.connect( ( ...
- centos7中python3.6报错ModuleNotFoundError: No module named '_ssl' 或者 Max retries exceeded with url: / (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",))
如果在运行爬虫时报此错:requests.exceptions.SSLError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max r ...
- 记录一下自己在MVC项目中如何防CSRF攻击,直接上代码
1.前端的处理: 2.后台 1.)添加过滤器,哪里用放哪里 2.)需要验证的方法上直接添加过滤器即可 大功告成 以下为过滤器代码块 /// <summary>/// ajax中加上Anti ...
- [PHP] error_reporting(0)可以屏蔽Fatal error错误
按照以前的印象,error_reporting(0)屏蔽不了php的Fatal error级别的错误.但是今天我遇到了一个问题才发现,它竟然可以屏蔽任何错误,包括Fatal error,浏览器会看不到 ...
- 密度峰值聚类算法MATLAB程序
密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...
- 1. java 基本规则
一.命名规范 1. 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式),HelloWorld 2. 变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式),helloWorld 3. 方法名 ...