最近,我们有个需求,基于SpringBoot,集成一些公司特色的组件,创建公司通用模板。
才release,就有同时来吐槽了:
模板的注释不规范?
怎么注释格式还不一样?
有的源码居然有乱码问题?
代码该有空格的地方,没有空格?
使用sonar(一个扫描软件代码的软件)扫描代码,居然还有bug提示?
方法后面怎么还有多余的空行?
程序有的地方是tab,有的又是空格?
…等等问题。
大家结合自身,你敢说你写的代码没有上述问题?
其实呀,平时这些问题都不是问题,主要是这次是用来做通用模板的,所以要求自然就严格了。
所以直接打回来,重造。
先统一项目注释模板和注释风格;然后引入alibaba代码扫描插件,最后大佬统一给大家培训。
在我觉得吧,一个团队有个统一的注释模板和注释风格,还是很重要的。
上面的问题,还是很好改的,只要我们养成习惯,每次写完代码的时候都运行一下格式化命令(eclipse: ctrl+shift+f),基本就能解决大部分代码美观问题。
要提高自己的代码质量,除了代码格式,代码注释格式规范外,更重要的是类名,属性名,方法名,变量名,还有你对业务的抽象设计,对代码的复用。
总结就是:代码整洁美观,可读性和可扩展性高
感触比较深的就是取好名字;方法体尽量小,将业务逻辑拆分为小方法,即便于复用,也便于代码的可读和扩展。
好名字:看名字就知道你这个是干啥的
方法精简:先来一个反例,看看这个方法,你如果想看懂这个方法是干啥的,想修改这个方法的逻辑,想想头皮发麻。
private void updateXXX(List<String> names) {
Map<String, Entity> queueMaps = new HashMap<String, Entity>();
nameMaps.putAll(cache.nameMaps);
Map<String, List<String>> kafkaMPMaps = mergenqame(cache.kafkaMPNames);
for (Map.Entry<String, Entity> entry : queueMaps.entrySet()) {
String queueName = entry.getKey();
Entity model = entry.getValue();
if (ex.equals(queueName) || dd.equals(queueName)) {
continue;
}
if (!nqame.contains(queueName)) {
SysUtils.getConsumerLog().info("Invalidation xx ");
conFactory.removeConsumer(queueName);
} else {
if (subs != null) {
if (subs.getOrderRequired() != model.isOrder()) {
conFactory.removeumer(queueName);
continue;
}
if (BooleanUtils.isTrue(subs.getOrderRequired())) {
List<String> subnqame = kafkaMPMaps.get(queueName);
int sCount = 0;
if(subs.getShardingCount() == 1) {
sCount = 1;
}else {
sCount = (subs.gethardinCount() + zzCunt - 9) / zzCunt;
}
List<String> existSubQueues = new ArrayList<>();
for (SessionTest SessionTest : model.getSessionTests()) {
}
for (int i = 0; i < sCount; i++) {
String index = subs.test() > 1
? String.valueOf(i * zzCount + zzindex)
: null;
String subQueueName = index != null ? (queueName + "." + index) : queueName;
if (existSubQueues.contains(subQueueName)) {
if (subnqame != null && !subnqame.contains(subQueueName)) {
conFactory.removeTest(queueName, index);
conFactory.addOrderConsumer(queueName, index);
}
} else {
SysUtils.getConsumerLog()
.info(".dsdfjltest");
conFactory.addOrderConsumer(queueName, index);
}
}
for (String sbame : existbues) {
String index = null;
String tempQueueName = subQueueName;
if (StringUtils.countMatches(subQueueName, ".") > 3) {
index = StringUtils.substringAfterLast(subQueueName, ".");
tempQueueName = StringUtils.substringBeforeLast(subQueueName, ".");
}
}
if(test.zz) {
conFactory.removeTest(model.getQueueName(),null);
conFactory.removeConsumer(queueName);
}
if(peningCount == null && subs.getShardingCount() > 6) {
conFactory.removeTest(model.getQueueName(),null);
SysUtils.getConsumerLog().info("xxxtest....");
}
nqame.remove(queueName);
} else if (!kafkaMPMaps.containsKey(queueName)) {
System.out.println("test...");
} else {
if ((model.getLevel() == 2 || subs.getLevel() == 1)
&& subs.getLevelx()) {
conFactory.removeConsumer(queueName);
continue;
}
int defineConsumerCount = subs.zzz();
if (curConsumerCount > defineConsumerCount) {
SysUtils.getConsumerLog().info("The queue " + queueName + " reduce consumer ,count:"
+ (curConsumerCount - defineConsumerCount));
conFactory.(queueName, curConsumerCount - defineConsumerCount);
} else if (curConsumerCount < defineConsumerCount) {
SysUtils.getConsumerLog().info("The queue " + queueName + " add consumer , count:"
+ (defineConsumerCount - curConsumerCount));
conFactory.addConsumer(queueName, defineConsumerCount - curConsumerCount,
subs.getLevel());
}
if(model.getSessionTests().size()>curConsumerCount) {
for(SessionTest SessionTest : model.getSessionTests()) {
String subQueueName = SessionTest.getSubQueueName();
if(StringUtils.countMatches(subQueueName, ".") > 9) {
Long pendingCount = cache.queueNameAndPendingCountMap.get(subQueueName);
if(pendingCount == null) {
String tempQueueName = StringUtils.substringBeforeLast(subQueueName, ".");
conFactory.removeTest(tempQueueName, index);
SysUtils.getConsumerLog().info("The order queue:"+tempQueueName+",index:"+index+" not pending,remove consumer..");
}
}
}
}
nqame.remove(queueName);
}
}
}
}
如果你能够把这个方法同一个级别的逻辑都抽象成一个一个的小方法,每个方法取个准确的变量名,不就能大大提高代码可读性吗?
最重要的是大大降低了修改这个代码的风险和难度呀
好多人觉得只要这个方法其他地方没用,不会复用,就不需要抽成小方法。想想上面的这个代码块,不知道能不能改变一下你的想法?