- 博客(27)
- 资源 (25)
- 收藏
- 关注
原创 Duplicate Observed Data(复制“被监视数据”)
一些领域数据置身于GUI控件中,而领域函数需要访问这些数据重构:将该数据复制到一个领域对象中。建立一个Observer 模式,可以同步领域对象和GUI 对象内的重复数据。动机 一个分层良好的系统,应该将处理用户界面和处理业务逻辑的代码分开。之所以这样做,有以下2点原因: 1、可能需要使用不同的用户界面来表现相同的业务逻辑,如果同时承担两种责任,用户界面会变得过分复杂; 2、与GUI 隔离之后,领域对象的维护和演化都会更容易。 ...
2021-08-31 21:17:27 253
原创 Replace Array with Object(以对象取代数组)
有一个数组,其中的元素各自代表不同的东西String[] row = new String[3];row[0] = "Liverpool";row[1] = "15";重构:以对象替换数组。对于数组中的每个元素,以一个字段来表示Performance row = new Performance();row.setName("Liverpool");row.setWins("15");...
2021-08-31 20:48:01 116
原创 Change Value to Reference(将值对象改为引用对象)
从一个类衍生出许多彼此相等的实例,希望将他们替换为同一个对象将这个值对象变成引用对象。动机 在许多系统中,你都可以为对象做一个有用的分类:引用对象和值对象。前者就像“客户”、“账户”这样的东西,每个对象都代表真实世界中的一个实物,你可以直接使用==检查两个对象是否相等。后者则是像“日期”、“钱”这样的东西,它们完全由其所含的数据值来定义,你并不在意副本的存在,当然,你也需要知道两个对象是否相等,所以你需要覆写equals() 和 hashCode()。...
2021-08-31 20:42:45 269
原创 Replace Data Value with Object(以对象取代数据值)
有一个数据项,需要与其他数据和行为一起使用才有意义将数据项变成对象。动机 开发初期,你往往决定以简单的数据项表示简单的情况。但是,随着开发的进行,你可能会发现,这些简单数据项不再那么简单了。比如说,一开始你可能会用一个字符串来表示“电话号码”概念,但是随后你就会发现,电话号码需要“格式化”、“抽取区号”之类的特殊行为。...
2021-08-31 20:23:05 230
原创 代码整洁之道--思维导图
#思维导图源码System.out.println("https://www.processon.com/view/60dede90e401fd7e342b3fc3?fromnew=1");
2021-08-27 22:05:58 303
原创 Self Encapsulate Field(自封装字段)
直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙private int low;private int high;boolean includes(int arg) { return arg >= low && arg <= high;}重构:为这个字段建立get/set函数,并以这些函数访问字段private int low;private int high;public int getLow() { return low;}publ
2021-08-26 21:35:32 241
原创 Introduce Foreign Method(引入外加函数)
需要为提供服务的类增加一个函数,但你无法修改这个类Date newStart = new Date(previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1);重构:在客户类中建立一个函数Date newStart = nextDay(previousEnd); private static Date nextDay(Date arg) { return new Date(arg.ge
2021-08-26 20:55:38 166
原创 Substitute Algorithm(替换算法)
把某个算法替换成另一个更清晰的算法public String foundPerson(String[] people) { for(int i=0; i<people.length; i++) { if (people[i].equals("Don")) { return "Don"; } if (people[i].equals("John")) { return "John"; } if (people[i].equals("Kent")) { ret
2021-08-24 21:36:37 253
原创 Replace Method with Method Object(以函数对象取代函数)
在一个大型函数中,由于局部变量的使用导致无法采用ExtractMethodclass Order... double price() { double primaryBasePrice; double secondaryBasePrice; double teriaryBasePrice; // long computation. .... }}重构:将这个函数放进一个单独对象中,局部变量成了对象内的字段...
2021-08-24 20:53:38 208
原创 Remove Assignments to Parameters(移除对参数的赋值)
对入参进行赋值int discount(int inputVal, int quantity, int yearToDate) { if (inputVal > 50) { inputVal -= 2; }}重构:用一个临时变量取代该参数int discount(int inputVal, int quantity, int yearToDate) { int result = inputVal; if (inputVal > 50) { result -= 2
2021-08-24 20:28:18 151
原创 Split Temporary Variable(分解临时变量)
某个变量被赋值超过一次,它既不是循环变量,也不被用于汇总结果double temp = 2 * (height + width);System.out.println(temp);temp = height * width;System.out.println(temp);重构后final double perimeter = 2 * (height + width);System.out.println(perimeter);final double area = height
2021-08-24 20:23:12 203
原创 Introduce Explaining Variable(引入解释性变量)
难于理解的复杂表达式if ((platform.toUpperCase().indexOf("MAC") > -1) && (brower.toUpperCase().indexOf("IE") > -1) && wasInitialized && resize > 0) { // do something}重构后final boolean isMacOS = platform.toUpperCase().inde
2021-08-24 18:15:58 217
原创 Replace Temp with Query(以查询取代临时变量)
一个临时变量保存某一个表达式的运算结果double basePrice = quantity * itemPrice;if (basePrice > 1000) { return basePrice * 0.95;} else { return basePrice * 0.98;}重构后if (basePrice() > 1000) { return basePrice() * 0.95;} else { return basePrice() * 0.98;}
2021-08-24 16:37:44 130
原创 Inline Temp(内联临时变量)
一个临时变量,只被一个简单表达式赋值一次,而它妨碍了其他重构手法double basePrice = anOrder.basePrice();return basePrice > 1000;重构后return anOrder.basePrice() > 1000;
2021-08-24 16:27:38 200
原创 Inline Method(内联函数)
一个函数的本体与名称同样清楚易懂int getRating() { return moreThanFiveLateDeliveries() ? 2 : 1;}boolean moreThanFiveLateDeliveries() { return numberOfLateDelivers > 5;}重构后int getRating() { return (numberOfLateDelivers > 5) ? 2 : 1;}...
2021-08-24 16:13:18 207
转载 guava限流器RateLimiter原理及源码分析
来源:https://www.cnblogs.com/zhandouBlog/p/11743660.html前言RateLimiter是基于令牌桶算法实现的一个多线程限流器,它可以将请求均匀的进行处理,当然他并不是一个分布式限流器,只是对单机进行限流。它可以应用在定时拉取接口数据,预防单机过大流量使用。原理首先先讲一下令牌桶的原理,每隔一段时间生产一个令牌放入桶里,请求在执行时需要拿到令牌才可以执行,如果拿不到令牌将等待令牌产生,一个生产者,多个消费者。但是这样的令牌桶有一个问题,如
2021-08-12 14:13:58 609
转载 几种限流器(RateLimiter)原理与实现
来源:https://blog.csdn.net/netyeaxi/article/details/104270337限流器(RateLimiter)主要有两种算法:漏桶算法令牌桶算法它们都是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的算法。漏桶算法漏桶算法(Leaky Bucket),它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量
2021-08-12 14:12:14 3028
转载 Guava RateLimiter限流原理解析
来源:https://zhuanlan.zhihu.com/p/60979444限流是保护高并发系统的三把利器之一,另外两个是缓存和降级。限流在很多场景中用来限制并发和请求量,比如说秒杀抢购,保护自身系统和下游系统不被巨型流量冲垮等。限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务或进行流量整形。常用的限流方式和场景有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如nginx的limitconn模块,用来限制瞬时并
2021-08-12 14:10:20 390
转载 Java中的时区转换
转载自 halfclear 原文:https://blog.csdn.net/halfclear/article/details/775739561.Date中保存的是什么在java中,只要我们执行Date date = new Date();就可以得到当前时间。如:Date date = new Date();System.out.println(date);1 2输出结果是:Thu Aug 24 10:15:29 CST 2017也就是我执行上述代码的时刻:2017年8月
2021-08-11 21:30:36 9153
原创 Java消息服务思维导图笔记
https://www.processon.com/view/link/610b5f201efad40724bdfae2
2021-08-05 11:48:12 106
原创 JMS之企业消息传送
企业消息传送:消息是通过网络从一个系统异步传送给其他系统的。客户端:使用消息传送API 的一个业务应用程序或组件(如:JMS)
2021-08-05 11:30:04 111
Cryptography and Network Security Principles and Practice( 5th ).pdf
2012-05-30
Introduction to Algorithms(Second Edition).pdf
2012-05-29
classloader.zip
2011-07-19
JUnit.in.Action.2nd.pdf
2011-07-06
Flex4-in-Action.pdf
2011-07-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人