0%

简化代码的小技巧

今天重构之前写的一段对账代码,基本逻辑是先校验,然后更新一下记录状态,然后处理对账主体的数据修改。抽象出来就是要三步,每一步出错或者校验不通过,就直接返回错误信息。抽象代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Check{
public boolean first(Map<String,String> message){
...
//出错或者校验不通过返回false,同时将错误信息保存到message中。
...
return true;
}

public boolean second(Map<String,String> message){
...
//出错或者校验不通过返回false,同时将错误信息保存到message中。
...
return true;
}

public boolean last(Map<String,String> message){
...
//出错或者校验不通过返回false,同时将错误信息保存到message中。
...
return true;
}
}

最直接写法

如果不考虑其他,第一反应肯定是这么写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Test{

public static void main(String[] args){
Check check = new Check();
Map<String,String> message = new HashMap<>();
if(check.first(message)){
if(check.second(message)){
if(check.last(message)){
//commit;
}else{
//rollback;
}
} else{
//rollback;
}
}else{
//rollback;
}
System.out.println(message.get("msg"));
}
}

没错,项目中的代码就是这么写的,多层if嵌套,抽象出来还能看懂,添加上大段的业务逻辑,看起来就费劲了。

第一步优化

先来第一步优化,把多层if嵌套去掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test{

public static void main(String[] args){
Check check = new Check();
Map<String,String> message = new HashMap<>();
if(!check.first(message)){
System.out.println(message.get("msg"));
//rollback;
return;
}
if(!check.second(message)){
System.out.println(message.get("msg"));
//rollback;
return;
}
if(!check.last(message)){
System.out.println(message.get("msg"));
//rollback;
return;
}
//commit;
}
}

通过return提前返回,避免多层if嵌套。

再次精简

我觉得写代码能有上面的觉悟已经不错了。不过无意中发现还有更简单的,但是好像不容易理解。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test{

public static void main(String[] args){
Check check = new Check();
Map<String,String> message = new HashMap<>();
if(!check.first(message) || !check.second(message) || !check.last(message)){
System.out.println(message.get("msg"));
//rollback;
return;
}
//commit;
}
}

利用判断条件的或,合并代码。原理是或判断如果前面的条件为真,就不再判断后面的条件。也就是前面如果报错,取反为真,则不判断后面的条件,直接进入if条件里面,也就不执行后面的代码而直接返回错误信息。只有当所有的操作都不报错,才会到最后的commit操作。

Apache James 使用mysql存储启动报错Specified key was too long; max key length is 3072 bytes

没事捣鼓自建mail服务,作为java开发,肯定想到了java实现。刚好apache就有开源的James(Java Apache Mail Enterprise Server)下载下来准备试试。

目前最新版是 3.4.0版本。

下载完成后网上找到教程进行配置。

因为针对mysql报错的问题。只记录数据源配置点。

阅读全文 »

梅林固件(ASUS AC86U)通过frp做内网穿透

最近为了给域名备案买了台阿里云服务器(在上海没居住证还不能备案,还要再等等…)。想着服务器能干点啥,银子花了不能浪费呀!虽然按照经济学理论来说,沉没成本不是成本,但是不能浪费就对了。

这里要提一下,现在的ipv4太难搞了。家里之前安装的电信宽带,用的SDN随选网关,桥连都不能改,更别说公网ip了。现在家里的移动宽带也是一样。自己改了桥连。用新买的AC86U拨号。不得不说这个路由器还是很棒的。

扯远了。下面记录下具体操作。

阅读全文 »

背景

博客主题是next,准备采用gitment插件作为评论插件。虽然知道没几个人看但是还是想弄一下。万一有人发现我的不足之处,还能提点意见。

采用gitment的原因是看到之前多说的关闭,觉得寻找一个稳定的服务还是很必要的。看到gitment是依赖于github,还是相当的可信。

阅读全文 »

最新家里做京东的朋友问我能不能做一个订单管理发货的系统。稍微聊了下,就是能拿到京东系统的订单列表,然后让供货商能打印订单的快递单进行发货。我想想觉得应该也不是很难,毕竟不是很多人用的大系统,而且他也说看着做一下(当然是不给钱的)我也就答应了。要求不高,顺便练练手吧。

阅读全文 »

步骤一:在plsql中执行 select userenv(‘language’) from dual; 语句来查看字符集。

步骤二:在环境变量中添加配置信息,名称为NLS_LANG,值为步骤一中的结果。

现在有道云笔记6.XX版本已不能通过删除panelad解决问题,只能修改panelad的属性来实现隐藏ad控件。

具体的方法如下:

  1. 将安装目录下Youdao\YoudaoNote\theme文件夹下的build.xml文件复制到桌面并打开。

  2. 删除PanelAd标签ass属性里的 panelclient

  3. 将AdWraperMid标签的bounds值修改为0,0,0,0

  4. 保存文件,再将build.xml复制回原来的文件夹,替换原来的文件

原由

偶然看到edu邮箱可以申请idea的免费授权,购买苹果设备也能有优惠。就想着看看学校的邮箱还能不能进去。尝试了很多次,都是提示密码错误。百度找回密码的方法,提示学校有内网的平台。为了进入学校内网,我登上了学校的图书馆,找到之前用于连接学校图书馆数据库的VPN。发现我的账号还可以用。但是试了下,登录内网平台,提示我已离校。遂放弃,就顺便逛了逛学校的文章数据库,点开了超星图书。突发奇想,我既然可以在浏览器看,那么就可以把书籍下载下了才对。

超星对于网页版有限制,只能打印最多5页。想通过虚拟打印机转pdf的方式是行不通的。

打印限制

阅读全文 »