我們在工作中經(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)
寫測試
路由不要透露內(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ā)問題
如果第三方接口耗時較長,需要對其做超時控制
外部因素的排除(提前問好第三方有什么限制,是否是針對該接口的 還是針對全局的,對于其他的有什么影響)
思考整體的方案設(shè)計,以及方案設(shè)計的優(yōu)點和缺點,是否有其他方案可以
編寫測試用例,然后先測試成功
思考邏輯點,先看接口是否正常,在深入看每個邏輯訪問 成功 失敗 是否對業(yè)務(wù)有影響,有影響如何進行處理
測試正常的邏輯功能,debug一步一步的測試,不要去跳出,每次都需要仔細看看是否異常
注意go語言如果是指針類型,那么不管內(nèi)部什么類型都會替換地址,導(dǎo)致后續(xù)引用有可能出現(xiàn)問題,要注意
自測仔細去思考所有的可能,然后模擬測試
測試完,自己需要再去驗證一遍上線的代碼
后續(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)
猜你還喜歡下面的內(nèi)容