如何用最小代价,迅速提高你项目中“shit,android设计模式有几种
}
//是否需要扩容
private boolean atCapacity() {
int newSize = size + 1;
return newSize > elements.length;
}
//扩容
private void grow() {
Object[] newElements = new Object[elements.length + 10];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
}
//增加一个元素
private void addElement(Object element) {
elements[size++] = element;
}
现在我们的add方法 仅仅就只有5行代码了。而可读性和第一版相比,真是天差地别。
如果你的类里面,public方法特别多,但是private方法特别少,那我觉得就一定还有优化的空间。
如果希望保持系统的简单性,那么就要尽可能的应用上述的组合方法进行细节上的重构,将一个个复杂的public方法,重构成一个个简单的private方法,最终对外暴露的public方法,只存在业务流程上对private方法的调用。
下面继续看另外一个问题,在很多老项目中,屎山代码最大的特点就是if else太多,很多人即使知道有个叫策略模式的方法可以解决这个问题,但是却不敢下手,下面介绍一个例子,体会一下如何针对屎山代码的if else 动手。
采用这篇文章里的PayResult类, 现在往里面增加一个方法, 获取这次支付结果的积分。毕竟现在电商里买东西总要返点积分给你的。
//获取积分
public double getIntegral() {
//银联支付 按照1.5实际支付额度 返回积分
if (payChannel instanceof BankChannel) {
return paymentValue * 1.5;
} else if (payChannel instanceof WxChannel) {
//微信支付就按照实际支付额度两倍,然后减去券的金额
return paymentValue * 2 - couponValue;
} else if (payChannel instanceof AliPayChannel) {
//支付宝支付*2 ,然后还可以加上花呗支付的积分 马爸爸牛逼
return paymentValue * 2 + loanValue * 1;
}
return 0;
}
这样的代码项目里肯定不少见,我们现在来看看,怎么在一个成熟的系统里面,有惊无险的将这段代码优化一下。扩大一下可读性和可维护性。 毕竟很多人都知道大概怎么减少if else,但是真正实操起来 就往往做不到,不知道怎么做,也不敢做。
我们先弄一个积分策略类:
//积分策略
public class IntegralStrategy {
public double getIntegral() {
return 0;
}
}
然后把我们实际的积分算法逻辑 放到这个策略类里面
显然我们还需要一些参数,否则这些逻辑中需要引用的变量是找不到的 将外部的引用传进去:
//积分策略
public class IntegralStrategy {
public double getIntegral(PayResult payResult) {
//银联支付 按照1.5实际支付额度 返回积分
if (payResult.getPayChannel() instanceof BankChannel) {
return payResult.getPaymentValue() * 1.5;
} else if (payResult.getPayChannel() instanceof WxChannel) {
//微信支付就按照实际支付额度两倍,然后减去券的金额
return payResult.getPaymentValue() * 2 - payResult.getCouponValue();
} else if (payResult.getPayChannel() instanceof AliPayChannel) {
//支付宝支付*2 ,然后还可以加上花呗支付的积分 马爸爸牛逼
return payResult.getPaymentValue() * 2 + payResult.getLoanValue() * 1;
}
return 0;
}
}
然后修改一下我们的PayResult主类:
//获取积分
public double getIntegral() {
return integralStrategy.getIntegral(this);
}
//注意这个时候我们的全包构造函数 变成了private
private PayResult(PayChannel payChannel, Date payDate, Double totalValue, Double paymentValue, Double couponValue, Double loanValue) {
this.payChannel = payChannel;
this.payDate = payDate;
this.totalValue = totalValue;
this.paymentValue = paymentValue;
this.couponValue = couponValue;
this.loanValue = loanValue;
//也仅仅在这个构造函数 这里增加了一行代码
integralStrategy=new IntegralStrategy();
}
到这里,我们完成了初步的一个解耦工作,但是整体if else 的逻辑 还没
有完全去除,只是挪了一个地方而已, 继续优化.
这里需要注意的是:如果你的if else逻辑里面不需要主类太多的参数,那么也没必要直接传递主类的引用,只要 直接传递参数就可以,这里为了演示方便,我们直接传递了主类作为参数。
只传递参数,而不传递主类的引用有一个好处:只涉及上下文类与这些策略类的最小耦合。
先去除if else
//积分策略
public abstract class IntegralStrategy {
abstract double getIntegral(PayResult payResult);
}
public class AliPayIntegralStrategy extends IntegralStrategy {
@Override
double getIntegral(PayResult payResult) {
return payResult.getPaymentValue() * 2 + payResult.getLoanValue() * 1;
}
}
public class UnionPayIntegralStrategy extends IntegralStrategy {
@Override
double getIntegral(PayResult payResult) {
return payResult.getPaymentValue() * 1.5;
}
}
public class WxPayIntegralStrategy extends IntegralStrategy {
@Override
double getIntegral(PayResult payResult) {
return payResult.getPaymentValue() * 2 - payResult.getCouponValue();
}
}
然后 更改一下我们的PayResult的构造方法:
//银联支付 注意看最后一个参数
public static PayResult createUnionPayResult(Date payDate, Double totalValue, Double paymentValue) {
return new PayResult(new BankChannel(), payDate, totalValue, paymentValue, 0.0d, 0.0d,new UnionPayIntegralStrategy());
}
//微信支付 注意看最后一个参数
public static PayResult createWxPayResult(Date payDate, Double totalValue, Double paymentValue, Double couponValue) {
return new PayResult(new WxChannel(), payDate, totalValue, paymentValue, couponValue, 0.0d,new WxPayIntegralStrategy());
}
//支付宝支付 注意看最后一个参数
public static PayResult createAliPayResult(PayChannel payChannel, Date payDate, Double totalValue, Double paymentValue, Double couponValue, Double loanValue) {
return new PayResult(new AliPayChannel(), payDate, totalValue, paymentValue, couponValue, 0.0d,new AliPayIntegralStrategy());
}
//注意看最后一个参数
//支付宝支付 注意看最后一个参数
public static PayResult createAliPayResult(PayChannel payChannel, Date payDate, Double totalValue, Double paymentValue, Double couponValue, Double loanValue) {
return new PayResult(new AliPayChannel(), payDate, totalValue, paymentValue, couponValue, 0.0d,new AliPayIntegralStrategy());
}
//注意看最后一个参数
如何用最小代价,迅速提高你项目中“shit,android设计模式有几种相关推荐
- uniapp android原生,在uni-app项目中集成Android原生工程
[TOC] # 在uni-app项目中集成Android原生工程 按照官方的方案,我们如果进行本地打包的话,需要重新创建一个Android原生工程,于是就会导致我们管理多个项目,切来切去的也麻烦. 经 ...
- 商业项目中最受欢迎的 7 种编程语言
[导读]:Semaphore 是一个国外持续集成/持续部署方案服务商.Semaphore 称自己在过去三年对其开发者用户进行调查,调查他们在开发商业项目时一般都使用哪些语言.这些数据基于成千上万个在 ...
- 软件项目中引用头文件的几种方法及要点
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 好的编程习惯,会直接影响代码的质量,在嵌入式C/C++中,头文件的引用方式和方法有多种,同时一些细节 ...
- 在你的项目中集成 Android pay支付
设置Google Pay API Contents Before you get started开始之前 Configure your project配置你的项目 Add dependencies添 ...
- 安卓在项目中添加Android兼容包( v4、v7 、、、)
如何选择兼容包, 一.查看SDK中是否有Support Library( v4.v7...) 注意该包是否在对应的SDK版本中!!! 二.没有则进行下载Support Library 方法1:右击项目 ...
- 【项目中】Android 小米红米手机无法读取照片图片路径的问题
前两天在项目中实现了可本地选择照片的功能,今天同事告诉我他的小米手机没有办法选择照片,点击选中的照片后总是无法将照片传入到应用内,而在选择图片页面选择"本地",就可以成功选择照片和 ...
- 在idea项目中的android包不能识别_项目调试编译和部署运行
项目调试 Logcat日志 顾名思义,logcat是android系统的日志包,提供给开发者供调试程序时使用.logcat一共有Verbose.Debug.Info.Warn.Error等不同级别的日 ...
- android图片缓存,直接应用项目中的Android图片缓存技术
前不久搞的Android图片缓存,刚开始引入开源的框架,用着还行,但是在开发中遇到问题,就比如universal-image-loader-1.9.5.jar这个框架吧,在加载图片的时候自定义imag ...
- 项目连接不了mysql_关于Java项目中连接mysql失败的几种情况原因分析
很多基础比较薄弱的童鞋对于Java链接mysql的错误原因不是很了解,今天我将罗列一下几种比较常见的错误类型,大家可以根据自己遇到的情况对号入座.密码错误导致的mysql连接不上,密码错误分为以下几种 ...
最新文章
- Asp.Net中查询域名的Whois信息
- Nature子刊:王四宝组揭示按蚊肠道共生菌抗疟的分子机制
- 图解全球无人驾驶产业链:这些公司在主宰人类出行的未来
- python之变量操作
- 【转自元宝兄】关于delphi Com+调用C# DLL的一点说明
- 【修正】销售开票BAPI实例:BAPI_BILLINGDOC_CREATEMULTIPLE
- gradle 构建过程
- vue修改计算属性的值_Vue语法高级之计算属性和侦听器
- 一起谈.NET技术,WPF Ribbon 开发资料分享
- CVPR 2019 | 条件运动传播:从运动中学习物体性质
- mfc远程连接mysql数据库连接_MFC连接mysql数据库(十分钟搞定)
- 20190601:第一个JDBC程序
- 解决ajax跨域的方法原理详解之Cors方法
- 每个创业者都是一本小说
- 小白也能看懂,30 分钟搭建个人博客!
- VS2019使用EasyX实现简单图形界面功能
- MPB:南农韦中组-​​根际细菌产铁载体能力的高通量检测
- 笔记本无线网卡开启wifi方法
- 机器人笔记psv中文_《机器人笔记》白金攻略 机器人笔记奖杯攻略
- win10系统桌面图标变为白色方框和去除桌面图标快捷方式小箭头的方法