# 由「抽象一致性」思考如何书写可读性代码

iMouseWu

## 场景

1. 用户实体User

2. 通过用户Id查找用户的订单信息接口`List<Order> orders = orderService.queryOrders(long userId)`

3. 通过用户Id查找用户退款订单Id列表`List<String> orderIds = orderRefundService.queryRefundOrderIds(long userId)`

4. 查找所有用户的信息`List<User> users = UserService.queryAllUsers()`

5. 要求查询用户订单消费总金额(除去退过款的订单)

## 实现

### 实现一

``````public List<User> queryUserStatistics(){
List<User> users = UserService.queryAllUsers()
for (User user : users) {
long userId = user.getAccountId();
List<Order> orders = orderService.queryOrderInfo();
BigDecimal totlePayAmount = filterRefundOrderAndCalculateAmount(orders,accountId);
user.setSumPayAmount(totlePayAmount);
}
}
private BigDecimal filterRefundOrderAndCalculateAmount(List<Order> orders, long     userId) {
List<String> orderIds = orderRefundService.queryRefundOrderIds(userId);
BigDecimal totlePayAmount = BigDecimal.ZERO;
for (Order order : orders) {
if (!orderIds.contains(order.getOrderId())) {
}
}
}

``````

### 实现二

``````public List<User> queryUserStatistics(){
List<User> users = UserService.queryAllUsers()
for(User user : users){
BigDecimal sumPayAmount = calculateTotleConsumeAmount(user);
user.setSumPayAmount(sumPayAmount);
}
}
private BigDecimal calculateTotleConsumeAmount(User user) {
long userId = user.getUserId();
List<Order> orders = orderService.queryOrderInfo(userId);
return filterRefundOrderAndCalculateAmount(orders, userId);
}

private BigDecimal filterRefundOrderAndCalculateAmount(List<Order> orders, long     userId) {
List<String> orderIds = orderRefundService.queryRefundOrderIds(userId);
BigDecimal totlePayAmount = BigDecimal.ZERO;
for (Order order : orders) {
if (!orderIds.contains(order.getOrderId())) {
}
}
}
``````

### 实现三

``````public List<User> queryUserStatistics(){
List<User> users = UserService.queryAllUsers()
for(User user : users){
BigDecimal sumPayAmount = calculateTotleConsumeAmount(user);
user.setSumPayAmount(sumPayAmount);
}
}
private BigDecimal calculateTotleConsumeAmount(User user) {
long userId = user.getUserId();
List<Order> orders = orderService.queryOrderInfo(userId);
List<String> orderIds = orderRefundService.queryRefundOrderIds(long userId);
return filterRefundOrderAndCalculateAmount(orderPayAmountVOs, orderIds);
}

private BigDecimal filterRefundOrderAndCalculateAmount(List<Order> orders,List<String>         orderIds) {
BigDecimal is = BigDecimal.ZERO;
for (Order order : orders) {
if (!orderIds.contains(order.getOrderId())) {
}
}
}
``````

## 说明

### 说明一

1. 查找用户的订单消费总额和用户信息

1. 查找用户信息

2. 计算订单消费金额

2. 计算订单消费金额

1. 查找所有的订单信息

2. 查找退款信息

3. 过滤退款信息,计算消费金额

4. 查找所有的订单

5. 过滤退款订单

6. 计算消费金额

3. 过滤退款订单

1. 查找退款订单

2. 过滤

### 说明二

1. 计算订单消费金额

1. 查找所有的订单信息

2. 过滤退款并计算消费金额

2. 过滤退款并计算消费金额

1. 查找退款信息

2. 过滤退款信息

3. 计算消费金额

## 总结

1. 在编写代码的时候,尽量让方法或者类保持「抽象一致性」,这里说尽量的意思就是说明在很多时间可以违反这个约定(因为有的时候会觉得很没有必要,保持抽象一致性,就代表着你的方法里面可能需要很多私有方法,并且在极端情况下私有方法里面的代码数很少)

2. 「抽象一致性」从不同的角度看,可能会有不同的结果,所以尽量选一个更加符合当前业务的角度(比如说实现一和实现二)
PS：关于抽象一致性更加详细的描述,可以翻看我以前的提问对抽象层次一致性的看法

##### iMouseWu

Conding with Java

1.6k 声望
51 粉丝
0 条评论