闽公网安备 35020302035485号


3.从SOLID设计原则到,组件相关的 CRP,CCP,CRP等原则都有从理论到落地的解说。
最近两月一直忙于面试,沟通了没有100个也有80个候选人,大部分人都没有了读书习惯,更不用说技术书籍了,倒是有部分说觉得blog比书籍有用多了。有些说工作太忙,有得说没有用....他们中有的在传统公司朝9晚5,有的在互联网企业996,有从小企业过来的,也有从阿里,快手过来的... 其中一个人的话,让我记忆非常深刻,最后环节,我问他现在还读书不,他说为了进阿里,他非常努力了2年,把《深入理解java虚拟机》读了2遍,《高性能mysql》,《深入理解kafka》... 都仔细阅读了,后来进了阿里,觉得这些书都没有没啥用了,也不在阅读其他技术书籍了,最后我不知道应该说啥,毕竟我没去过阿里,于是结束了面试。
就我自己而言,早些年面试也是被问得体无完肤,也有过这样的心态阅读了大量类似 《深入理解java虚拟机》,《MySQL技术内幕:InnoDB存储引擎》,《RocketMQ技术内幕:RocketMQ架构设计与实现原理》,《从Paxos到Zookeeper:分布式一致性原理与实践》等书籍,确实也让自己在后来的面试中可以从容面对。但越是阅读,越是感觉自己不知道的东西越多,越是想要通过阅读来充实自己。于是又开始阅读系统设计,架构一类的书籍。时至今日,读到《代码整洁之道》时,依然觉得即使在做了10年的编码这件事上,不懂的依然有非常之多(哈哈,也许是悟性不够)。 从前面的名人,到我身边认识的人,大凡优秀的人的,独有阅读的习惯,并且有大量阅读自己专业相关的书籍。
4.尽可能减少类和方法的数量。
//需求变更,改的像辣鸡。
if (CollectionUtils.isEmpty(orderList)) {
List<CfgStore> allStoreList = cfgStoreService.getStoresBLAndBabyBL();
List<CfgStore> bellaList = allStoreList.stream().filter(st -> {
return st.getType() == 0;
}).sorted(Comparator.comparingInt(CfgStore::getStoreId)).collect(Collectors.toList());
ArrayList<ConsultationOrderRank> ballaResult = new ArrayList<>();
int bellaIndex = 0;
for (CfgStore store : bellaList) {
ConsultationOrderRank consultationOrderRank = new ConsultationOrderRank();
consultationOrderRank.setStoreName(store.getNameAlias());
consultationOrderRank.setStoreId(store.getStoreId());
consultationOrderRank.setOrderNum(0);
consultationOrderRank.setSort(bellaIndex);
ballaResult.add(consultationOrderRank);
bellaIndex++;
}
List<ConsultationOrderRank> blRankResult = ballaResult.stream()
.sorted(Comparator.comparing(ConsultationOrderRank::getSort)).collect(Collectors.toList());
List<CfgStore> babyBellaList = storeList.stream().filter(st -> {
return st.getType() == 1;
}).sorted(Comparator.comparingInt(CfgStore::getStoreId)).collect(Collectors.toList());
ArrayList<ConsultationOrderRank> babyBallaResult = new ArrayList<>();
int babyIndex = 0;
for (CfgStore store : babyBellaList) {
ConsultationOrderRank consultationOrderRank = new ConsultationOrderRank();
consultationOrderRank.setStoreName(store.getNameAlias());
consultationOrderRank.setStoreId(store.getStoreId());
consultationOrderRank.setOrderNum(0);
consultationOrderRank.setSort(babyIndex);
babyBallaResult.add(consultationOrderRank);
babyIndex++;
}
List<ConsultationOrderRank> babyRankResult = babyBallaResult.stream()
.sorted(Comparator.comparing(ConsultationOrderRank::getSort))
.collect(Collectors.toList());
Order order = Order.builder().consultationOrderRankStBellaList(blRankResult)
.consultationOrderRankBabyBellaList(babyRankResult).build();
return order;
}
List<CfgStore> others = storeList.stream().filter(store -> {
return !Arrays.stream(storeIdArr).collect(Collectors.toList()).contains(store.getStoreId());
}).collect(Collectors.toList());
Map<Integer, CfgStore> storeMap = storeList.stream().collect(Collectors.toMap(CfgStore::getStoreId, store -> {
return store;
}));
//品牌1门店ID
List<Integer> blIdList = storeList.stream().filter(st -> st.getType().equals(0))
.map(CfgStore::getStoreId).collect(Collectors.toList());
//品牌2门店ID
List<Integer> babyblIdList = storeList.stream().filter(st -> st.getType().equals(1))
.map(CfgStore::getStoreId).collect(Collectors.toList());
//品牌2分组数据
Map<Integer, List<HeOrder>> babyblMap = orderList.stream()
.filter(order -> babyblIdList.contains(order.getStoreId()))
.collect(Collectors.groupingBy(HeOrder::getStoreId));
//品牌2分组数据
Map<Integer, List<HeOrder>> blMap = orderList.stream()
.filter(order -> blIdList.contains(order.getStoreId()))
.collect(Collectors.groupingBy(HeOrder::getStoreId));
//品牌1排行数据
List<ConsultationOrderRank> bellaList = new ArrayList<>();
//品牌2排行数据
List<ConsultationOrderRank> babyBellaList = new ArrayList<>();
//品牌1
for (Entry<Integer, List<HeOrder>> entry : babyblMap.entrySet()) {
CfgStore cfgStore = storeMap.get(entry.getKey());
String storeName = cfgStore.getNameAlias();
if (Strings.isNotBlank(storeName)) {
List<HeOrder> orderNum = entry.getValue();
ConsultationOrderRank consultationOrderRank = new ConsultationOrderRank();
consultationOrderRank.setStoreName(storeName);
consultationOrderRank.setStoreId(entry.getKey());
consultationOrderRank.setOrderNum(orderNum == null ? 0 : orderNum.size());
babyBellaList.add(consultationOrderRank);
}
}
List<CfgStore> otherbabyBlList = others.stream().filter(store -> {
return store.getType() == 1;
}).collect(Collectors.toList());
for (CfgStore store : otherbabyBlList) {
ConsultationOrderRank consultationOrderRank = new ConsultationOrderRank();
consultationOrderRank.setStoreName(store.getNameAlias());
consultationOrderRank.setStoreId(store.getStoreId());
consultationOrderRank.setOrderNum(0);
babyBellaList.add(consultationOrderRank);
}
//品牌2
for (Entry<Integer, List<HeOrder>> entry : blMap.entrySet()) {
CfgStore cfgStore = storeMap.get(entry.getKey());
String storeName = cfgStore.getNameAlias();
if (Strings.isNotBlank(storeName)) {
List<HeOrder> orderNum = entry.getValue();
ConsultationOrderRank consultationOrderRank = new ConsultationOrderRank();
consultationOrderRank.setStoreName(storeName);
consultationOrderRank.setStoreId(entry.getKey());
consultationOrderRank.setOrderNum(orderNum == null ? 0 : orderNum.size());
bellaList.add(consultationOrderRank);
}
}
List<CfgStore> otherBellaList = others.stream().filter(store -> {
return store.getType() == 0;
}).collect(Collectors.toList());
for (CfgStore store : otherBellaList) {
ConsultationOrderRank consultationOrderRank = new ConsultationOrderRank();
consultationOrderRank.setStoreName(store.getNameAlias());
consultationOrderRank.setStoreId(store.getStoreId());
consultationOrderRank.setOrderNum(0);
bellaList.add(consultationOrderRank);
}
//品牌1排序
List<ConsultationOrderRank> blRank = bellaList.stream().sorted(Comparator.comparing(ConsultationOrderRank::getOrderNum).reversed())
.collect(Collectors.toList());
int blSort = 0;
int blIndexCounter = 0;
for (int i = 0; i < blRank.size(); i++) {
// 堆代码 duidaima.com
//订单=0, 订单值不同, 递增
boolean flag = blRank.get(i).getOrderNum() == 0 || (i != 0 && blRank.get(i).getOrderNum() != blRank.get(i - 1).getOrderNum());
if (flag) {
blSort = blSort + blIndexCounter + 1;
blIndexCounter = 0;
} else {
if (i != 0) {
blIndexCounter++;
}
}
blRank.get(i).setSort(blSort);
}
//品牌2排序
List<ConsultationOrderRank> babyBlRank = babyBellaList.stream().sorted(Comparator.comparing(ConsultationOrderRank::getOrderNum).reversed())
.collect(Collectors.toList());
int babySort = 0;
int babyIndexCounter = 0;
for (int i = 0; i < babyBlRank.size(); i++) {
//订单=0, 订单值不同, 递增
boolean flag = babyBlRank.get(i).getOrderNum() == 0 || (i != 0 && babyBlRank.get(i).getOrderNum() != babyBlRank.get(i - 1).getOrderNum());
if (flag) {
babySort = babySort + babyIndexCounter + 1;
babyIndexCounter = 0;
} else {
if (i != 0) {
babyIndexCounter++;
}
}
babyBlRank.get(i).setSort(babySort);
}
我相信作者如果经常阅读技术书籍,写出的代码应该是这样的。 //统计每个品牌每个门店订单数量
for (Integer brandType : brandTypeList){
Map<Integer, Long> theBrandStoreOrderCount = orderList.stream().filter(order -> brandType.longValue() == order.getBrandType()).collect(Collectors.groupingBy(HeOrder::getStoreId, Collectors.counting()));
List<CfgStore> brandStores = storeList.stream().filter(store -> store.getType().equals(brandType)).collect(Collectors.toList());
List<ConsultationOrderRank> storeOrderRank = new ArrayList<>();
brandStores.forEach(store ->{
Long orderCount = 0L;
if (theBrandStoreOrderCount.containsKey(store.getStoreId())){
orderCount = theBrandStoreOrderCount.get(store.getStoreId());
}
ConsultationOrderRank storeOrder = ConsultationOrderRank.builder()
.storeId(store.getStoreId())
.orderNum(orderCount.intValue())
.storeName(store.getStoreName())
.sort(0).build();
storeOrderRank.add(storeOrder);
});
List<ConsultationOrderRank> sortedStoreRank = storeOrderRank.stream().sorted(Comparator.comparing(ConsultationOrderRank::getOrderNum).reversed()).collect(Collectors.toList());
setSortWithSameRankNum(sortedStoreRank);
BrandOrderStatistic statistic = BrandOrderStatistic.builder()
.name(CfgStoreEnum.getValueByCode(brandType))
.storeOrderRank(sortedStoreRank)
.brandType(brandType).build();
brandOrderStatistics.add(statistic);
}
如此这般,我们当时践行了编码里的童子军规:当你离开营地时候,要让它比你来的时候更整洁干净。