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