工作學(xué)習(xí)總結(jié)-創(chuàng)新互聯(lián)

優(yōu)化if···else

我們?cè)诠ぷ髦薪?jīng)常會(huì)寫出如下代碼

成都創(chuàng)新互聯(lián)公司成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元巴林左旗做網(wǎng)站,已為上家服務(wù),為巴林左旗各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
   if (xxx != null) {   if (xxx != null) {   if (xxx != null) {   
              }
              ....
          }
      }

看起來也沒什么問題。但是當(dāng)if···else層數(shù)變多,將會(huì)越來越難以閱讀,逐步形成‘屎’代碼

if (xxx == null) {return;
}
// 原來if()邏輯

if 邏輯中的代碼過多,可以考慮封裝對(duì)應(yīng)的子方法,來解決層數(shù)問題

方法相關(guān)

每個(gè)方法有每個(gè)方法的職責(zé),不要在方法中增加額外的邏輯,例如

public void xxx() {// 業(yè)務(wù)邏輯
   xxx.setXxx();
   // 業(yè)務(wù)邏輯
   xxx.setXxx();
   // 業(yè)務(wù)邏輯
   xxx.setXxx();
  ...
  }

優(yōu)化后,注意不要讓你的代碼過于的臃腫

public void xxx() {// 業(yè)務(wù)邏輯
   // 業(yè)務(wù)邏輯
   // 業(yè)務(wù)邏輯
   setXxx(xxx)
}
public void setXxx() {xxx.setXxx();
   xxx.setXxx();
   xxx.setXxx();
}
大最小值
public static void main(String[] args) {int[] nums = {1,2 ,3, 4, 5};
        int min = Integer.MAX_VALUE;
        for (int i = 0; i< nums.length; i++) {if (nums[i]< min) {min = nums[i];
            }
        }
    }

優(yōu)化后

public static void main(String[] args) {int[] nums = {1,2 ,3, 4, 5};
        int length = nums.length;
        int min = Integer.MAX_VALUE; // 如果是有序數(shù)組,這里還可以直接替換int min = nums[length - 1]; 一般不建議使用Integer.MAX_VALUE
        min = nums[length - 1];
        for (int i = 0; i< length; i++) {min = Math.min(min, nums[i]);
        }
    }
Go語言的流式調(diào)用解決多層for

我們?cè)跇I(yè)務(wù)中經(jīng)??赡苡龅竭@種代碼

func GetResult(param []*dto.ActReq) []Stream {var (
		u []Stream
	)
	for _, p := range param {// 業(yè)務(wù)邏輯
		for _, a := range param.aaa {	// 業(yè)務(wù)邏輯
			for _, x := range a.xxx {		// 業(yè)務(wù)邏輯
				for _, b := range x.bbb {// 業(yè)務(wù)邏輯
					if b == "res" {var s Stream
						// 業(yè)務(wù)邏輯
						s.result = a
						u = append(u, s)
					}
				}
			}
		}
	}
	return u
}

優(yōu)化后

type StreamList struct {StreamList []Stream
}

type Stream struct {result interface{}
   flag   string
}

func Builder(param []*dto.ActReq) *StreamList {var (
      u   []Stream
      res = &StreamList{}
   )
   for _, p := range param {  // 業(yè)務(wù)邏輯
      for _, a := range param.aaa { // 業(yè)務(wù)邏輯
         var s Stream
         // 業(yè)務(wù)邏輯
         s.result = a
         u = append(u, s)
      }
   }
   return res.SetStream(u)
}

func (s *StreamList) SetStream(streamList []Stream) *StreamList {s.StreamList = streamList
   return s
}

func (s *StreamList) GetStream() []Stream {return s.StreamList
}

func (s *StreamList) AFilter(pass func(flag string) bool) *StreamList {streamList := make([]Stream, 0)
   for _, stream := range streamList {  // 業(yè)務(wù)邏輯
      if pass(stream.flag) { streamList = append(streamList, stream)
      }
   }
   s.StreamList = streamList
   return s
}

func (s *StreamList) BFilter(pass func(flag string) bool) *StreamList {streamList := make([]Stream, 0)
   for _, stream := range streamList {  // 業(yè)務(wù)邏輯
      if pass(stream.flag) { streamList = append(streamList, stream)
      }
   }
   s.StreamList = streamList
   return s
}

func main() {res := Builder(param).AFilter(func(flag string) bool {  // 處理業(yè)務(wù)邏輯
      if flag == "xxx" { return true
      }
      return false
   }).BFilter(func(flag string) bool {  // 處理業(yè)務(wù)邏輯
      if flag == "xxx" { return true
      }
      return false
   }).GetStream()
   fmt.Println(res)
}
業(yè)務(wù)代碼中錯(cuò)誤規(guī)范
  • Dao層 有邏輯可以進(jìn)行包裝處理,打印對(duì)應(yīng)的req, 沒有邏輯直接返回err

  • Service層進(jìn)行包裝處理,打印對(duì)應(yīng)的req,方便定位,業(yè)務(wù)錯(cuò)誤封裝到common baseError

  • Controller層進(jìn)行統(tǒng)一處理, 業(yè)務(wù)錯(cuò)誤直接返回,內(nèi)部錯(cuò)誤進(jìn)行包裝處理

  • 也可以使用 %w 來找到調(diào)用的層級(jí)關(guān)系

  • fmt.Errorf("[ShopOrder.UpdateOrderReward] is fail, orderID: %d, err: %w", orderID, err)
設(shè)計(jì)注意點(diǎn)
  • 寫測(cè)試

  • 路由不要透露內(nèi)部的信息 防止暴露內(nèi)部方法

  • 對(duì)應(yīng)的一些配置信息,需要進(jìn)行再次封裝,進(jìn)行解耦合

  • 方法的注釋的規(guī)范,方便維護(hù)

    例如:// 方法名 注釋

  • 盡可能確保 err等于nil,其他狀態(tài)不是nil

  • 引用類型,去查看nil指針,注意引用傳遞,盡量不要去修改指針中的值

  • 默認(rèn)值不要為0, 因?yàn)橛锌赡?值有意義,導(dǎo)致無法區(qū)分,還有就是gorm 更新實(shí)體,不會(huì)更新默認(rèn)值。

  • 內(nèi)存用到在進(jìn)行初始化,因?yàn)間o延遲釋放內(nèi)存

  • 預(yù)先知道長(zhǎng)度 用長(zhǎng)度初始化,避免頻繁擴(kuò)容(append)

  • 先把業(yè)務(wù)的主干進(jìn)行確定

  • 遵循開閉原則,內(nèi)部調(diào)用小寫,可以建立service的協(xié)助者

  • Mq消息做冪等

  • 使用golangci golint進(jìn)行代碼的掃描

  • 黑名單考慮用戶多次進(jìn)入和移除黑明單的場(chǎng)景,自動(dòng)退出黑名單的場(chǎng)景

  • 能一層循環(huán)搞定的一層循環(huán)搞定, 代碼重復(fù)引用,抽取方法

  • 訂單的數(shù)據(jù)表是 退單 方面就是 退單時(shí)間+訂單狀態(tài)

  • Mq 中消費(fèi)消息加入角色鎖,防止用戶進(jìn)行刷單

  • 事先知道長(zhǎng)度的 用i 進(jìn)行循環(huán),因?yàn)閍ppend 每次都會(huì)申請(qǐng)新的空間

  • 使用 redis hash數(shù)據(jù)結(jié)構(gòu),在進(jìn)行Hincy 可以進(jìn)行原子操作,而不需要進(jìn)行加鎖

  • Service 和 dao 進(jìn)行解耦合,遵守開閉原則,細(xì)化方法力度

  • 加入分布式鎖 在冪等之前,加鎖保證鎖的力度變小

  • 本地master超前遠(yuǎn)程的master(別人在遠(yuǎn)程的master回滾代碼,這樣需要?jiǎng)h除本地的master重新從遠(yuǎn)程拉去一個(gè)新的master)

  • 如果map中key value中value值為nil,可以使用struct{} 這個(gè)內(nèi)存占比 0

  • 測(cè)試去除的代碼 加todo 防止遺忘,例如協(xié)程。

  • 開發(fā)功能判斷是否需要增加開關(guān)操作

  • 對(duì)于map的并發(fā)讀寫,增加讀寫鎖,防止并發(fā)問題

  • 如果第三方接口耗時(shí)較長(zhǎng),需要對(duì)其做超時(shí)控制

需求思考與總結(jié)
  1. 外部因素的排除(提前問好第三方有什么限制,是否是針對(duì)該接口的 還是針對(duì)全局的,對(duì)于其他的有什么影響)

  2. 思考整體的方案設(shè)計(jì),以及方案設(shè)計(jì)的優(yōu)點(diǎn)和缺點(diǎn),是否有其他方案可以

  3. 編寫測(cè)試用例,然后先測(cè)試成功

  4. 思考邏輯點(diǎn),先看接口是否正常,在深入看每個(gè)邏輯訪問 成功 失敗 是否對(duì)業(yè)務(wù)有影響,有影響如何進(jìn)行處理

  5. 測(cè)試正常的邏輯功能,debug一步一步的測(cè)試,不要去跳出,每次都需要仔細(xì)看看是否異常

  6. 注意go語言如果是指針類型,那么不管內(nèi)部什么類型都會(huì)替換地址,導(dǎo)致后續(xù)引用有可能出現(xiàn)問題,要注意

  7. 自測(cè)仔細(xì)去思考所有的可能,然后模擬測(cè)試

  8. 測(cè)試完,自己需要再去驗(yàn)證一遍上線的代碼

后續(xù)將持續(xù)進(jìn)行更新~~~
歡迎各位也分享與補(bǔ)充

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

新聞標(biāo)題:工作學(xué)習(xí)總結(jié)-創(chuàng)新互聯(lián)
文章起源:http://muchs.cn/article8/heoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)微信公眾號(hào)、企業(yè)建站網(wǎng)站改版、外貿(mào)建站關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化