最近關於代碼規範的一些感悟

最近,我們有個需求,基於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);
					}

				}
			}
		}

如果你能夠把這個方法同一個級別的邏輯都抽象成一個一個的小方法,每個方法取個準確的變量名,不就能大大提高代碼可讀性嗎?
最重要的是大大降低了修改這個代碼的風險和難度

好多人覺得只要這個方法其他地方沒用,不會複用,就不需要抽成小方法。想想上面的這個代碼塊,不知道能不能改變一下你的想法?

發佈了51 篇原創文章 · 獲贊 41 · 訪問量 4942
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章