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

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

我們在工作中經(jīng)常會寫出如下代碼

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

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

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

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

方法相關(guān)

每個方法有每個方法的職責,不要在方法中增加額外的邏輯,例如

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

我們在業(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ù)代碼中錯誤規(guī)范
  • Dao層 有邏輯可以進行包裝處理,打印對應(yīng)的req, 沒有邏輯直接返回err

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

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

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

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

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

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

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

    例如:// 方法名 注釋

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

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

  • 默認值不要為0, 因為有可能0值有意義,導(dǎo)致無法區(qū)分,還有就是gorm 更新實體,不會更新默認值。

  • 內(nèi)存用到在進行初始化,因為go延遲釋放內(nèi)存

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

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

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

  • Mq消息做冪等

  • 使用golangci golint進行代碼的掃描

  • 黑名單考慮用戶多次進入和移除黑明單的場景,自動退出黑名單的場景

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

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

  • Mq 中消費消息加入角色鎖,防止用戶進行刷單

  • 事先知道長度的 用i 進行循環(huán),因為append 每次都會申請新的空間

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

  • Service 和 dao 進行解耦合,遵守開閉原則,細化方法力度

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

  • 本地master超前遠程的master(別人在遠程的master回滾代碼,這樣需要刪除本地的master重新從遠程拉去一個新的master)

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

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

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

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

  • 如果第三方接口耗時較長,需要對其做超時控制

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

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

  3. 編寫測試用例,然后先測試成功

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

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

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

  7. 自測仔細去思考所有的可能,然后模擬測試

  8. 測試完,自己需要再去驗證一遍上線的代碼

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

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

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

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

廣告

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

搜索引擎優(yōu)化