新聞中心
我們的Web項目提供了若干個基于HTTP協(xié)議的POST接口,用于給第三方的用戶寫入數(shù)據,為了驗證寫入數(shù)據者的身份,這樣的接口肯定會要求對方傳遞身份標識,接口得到標識以后會驗證寫入者的標識,正確就執(zhí)行請求,錯誤就返回失敗信息,由于是基于同樣的檢測身份的機制,每個接口都做了同樣的事情,體現(xiàn)在代碼里就有大量的冗余代碼,如果要消除冗余代碼,我可以把冗余代碼寫成一個函數(shù),在每一個接口里調用,這樣的話,也會有大量重復的調用語句,感覺還是不完美,于是思考之后還是借助OO來做這個事情,需要說明的是,我們的語言是python,web項目采用的框架是webpy。

成都創(chuàng)新互聯(lián)-專業(yè)網站定制、快速模板網站建設、高性價比宜興網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式宜興網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋宜興地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。
重構之前的代碼 class Apply: def POST(self): try: wi = web.input() token = wi.token projectId = wi.projectId serverToken = getServerToken(db,token) if serverToken == None: return '{"result":"error","message":"token is error"}' if checkExpires(serverToken): return '{"result":"error","message":"token is expires"}' userId = serverToken.userId result = create.joinProject(userId,int(projectId)) if result[0] == True: return '{"result":"ok","message":"ok"}' else: return '{"result":"error","message":"%s"}' %(result[1]) except: if DEBUG: raise return '{"result":"error","message":""}' class AddFolder: def POST(self): try: wi = web.input() token = wi.token serverToken = getServerToken(db,token) if serverToken == None: return '{"result":"error","message":"token is error"}' if checkExpires(serverToken): return '{"result":"error","message":"token is expires"}' userId = serverToken.userId folderName = wi.folderName pFolderId = int(wi.pFolderId) if hasattr(wi,"pFolderId") else 0 projectId = util.unhash17(int(wi.projectId)) if hasattr(wi,"projectId") else 0 folderId,deep,msg = tn.newFolder(db,folderName,userId,pFolderId,0,projectId) if folderId > 0: return '{"result":"ok","message":"%s","folderId":"%s","deep":"%s"}' %(msg,folderId,deep) else: return '{"result":"error","message":"%s","folderId":"%s","deep":"%s"}' %(msg,folderId,deep) except: if DEBUG: raise return '{"result":"error","message":""}' 我從代碼里挑了兩個API來展現(xiàn)代碼冗余的情況,這兩個API里做了很多一樣的事情,例如使用用戶傳過來的token(身份標識)去系統(tǒng)查詢(getServerToken調用)一旦不匹配告訴用戶token is error,然后繼續(xù)檢查token是否超時,最后,整個代碼是包含在try-catch塊中,一旦有意外的事情(例如BUG)發(fā)生,需要返回錯誤信息給用戶,只有每個API中間一塊的處理代碼是不一樣的,這還是兩個API,實際上整個功能模塊至少有十幾個API,而且還會繼續(xù)增加,那么這種情況下,API越多則冗余代碼越多,并且一旦需要修改就很痛苦,例如,每個catch塊原來就是return出錯誤信息,結果后來要求給模塊增加調試狀態(tài),在打開調試的時候返回異常信息用于調試,上線時異常時則只能返回規(guī)矩的JSON字符串給用戶 重構以后 class OpenApiBase: def __init__(self): self.funPOST = self.POST self.POST = self.post def post(self): try: wi = web.input() token = wi.token self.serverToken = getServerToken(db,token) web.debug(str(self.serverToken)) if self.serverToken == False: return '{"result":"error","message":"token is error"}' if checkExpires(self.serverToken): return '{"result":"error","message":"token is expires"}' #執(zhí)行每個子類具體的代碼 return self.funPOST() except: if DEBUG: raise return '{"result":"error","message":""}' class Apply(OpenApiBase):#繼承OpenApiBase def POST(self): wi = web.input() projectId = wi.projectId userId = self.serverToken.userId result = create.joinProject(userId,int(projectId)) if result[0] == True: return '{"result":"ok","message":"ok"}' else: return '{"result":"error","message":"%s"}' %(result[1]) class AddFolder(OpenApiBase):#繼承OpenApiBase def POST(self): wi = web.input() userId = self.serverToken.userId folderName = wi.folderName pFolderId = int(wi.pFolderId) if hasattr(wi,"pFolderId") else 0 projectId = util.unhash17(int(wi.projectId)) if hasattr(wi,"projectId") else 0 folderId,deep,msg = tn.newFolder(db,folderName,userId,pFolderId,0,projectId) if folderId > 0: return '{"result":"ok","message":"%s","folderId":"%s","deep":"%s"}' %(msg,folderId,deep) else: return '{"result":"error","message":"%s","folderId":"%s","deep":"%s"}' %(msg,folderId,deep) 重構以后,每個子類的POST函數(shù)只做自己應該處理的事情,對于身份的檢測全部交給父類完成,一旦沒通過身份檢測,子類POST里的代碼根本就不會被執(zhí)行
網站名稱:代碼重構實例:消除冗余代碼
當前鏈接:http://m.fisionsoft.com.cn/article/dhcdhdh.html


咨詢
建站咨詢
