成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

代碼重構實例:消除冗余代碼

開發 架構
這里我們會給出一個WEB開發項目的代碼實例,采用的框架是webpy,語言是Python。后面會給大家看到重構之后的代碼樣例。

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

 
重構之前的代碼
 
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來展現代碼冗余的情況,這兩個API里做了很多一樣的事情,例如使用用戶傳過來的token(身份標識)去系統查詢(getServerToken調用)一旦不匹配告訴用戶token is error,然后繼續檢查token是否超時,最后,整個代碼是包含在try-catch塊中,一旦有意外的事情(例如BUG)發生,需要返回錯誤信息給用戶,只有每個API中間一塊的處理代碼是不一樣的,這還是兩個API,實際上整個功能模塊至少有十幾個API,而且還會繼續增加,那么這種情況下,API越多則冗余代碼越多,并且一旦需要修改就很痛苦,例如,每個catch塊原來就是return出錯誤信息,結果后來要求給模塊增加調試狀態,在打開調試的時候返回異常信息用于調試,上線時異常時則只能返回規矩的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"}'
 
            #執行每個子類具體的代碼
            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函數只做自己應該處理的事情,對于身份的檢測全部交給父類完成,一旦沒通過身份檢測,子類POST里的代碼根本就不會被執行
責任編輯:彭凡 來源: 博客園
相關推薦

2013-09-05 09:50:11

C++代碼優化

2020-11-10 08:54:55

Lombok

2024-06-18 18:36:03

2021-08-03 08:13:48

重構API代碼

2011-09-05 10:30:51

重構代碼庫業務模型

2018-08-24 21:25:02

編程語言代碼重構GitHub

2022-12-26 00:02:24

重構代碼軟件

2019-04-03 08:10:17

代碼架構信息

2010-04-13 08:49:08

JavaLombokJavabean

2024-09-05 10:17:34

2022-07-04 07:37:51

模板模式重構

2013-10-21 17:54:00

代碼重構修改

2022-08-02 08:07:24

單元測試代碼重構

2022-08-01 23:45:23

代碼識別項目

2024-02-22 10:27:00

Python開發

2024-08-06 12:35:42

C#代碼重構

2015-08-11 09:39:25

重構提高代碼質量

2011-08-16 09:47:58

編程

2021-05-26 08:50:37

JavaScript代碼重構函數

2019-02-18 16:21:47

華為代碼重構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产黄色av网站 | 久久免费小视频 | 视频在线一区二区 | 欧美一区二区在线观看 | www.久久.com | 毛片软件 | 欧美午夜视频 | 久在线视频播放免费视频 | av乱码| 免费午夜电影 | 亚洲精品久久久一区二区三区 | 国产免费人成xvideos视频 | 国产999精品久久久 精品三级在线观看 | 精品国产aⅴ | 九九福利| 成人不卡视频 | 久久久久国产精品一区二区 | 天堂一区二区三区 | 黄色毛片免费看 | 国产精品久久久久久久久久久久冷 | 欧美一级片久久 | 欧美激情一区二区三级高清视频 | 99久久精品国产一区二区三区 | 国产精品久久久久久久免费大片 | 成人av一区二区亚洲精 | 精品久久久久久久久久久久 | 亚洲国产成人精品久久久国产成人一区 | 欧美一级片中文字幕 | 欧美不卡视频 | 久久大香| 亚洲一区不卡在线 | 五月激情综合 | 久久91精品久久久久久9鸭 | 国产一区欧美 | 成人三级视频 | 色毛片 | 日本天天操 | 中文字幕在线欧美 | 男女免费观看在线爽爽爽视频 | 国产成人精品免费视频大全最热 | 国产精品99久久久久久久久 |