周末加班重构代码的几点感慨
? ? ? ?上半年的時候在公司實習,做了一個基于django的度量衡工具網站,就是把數據從數據庫里面抓出來,統計分析,然后生成各種各樣的圖表包括餅圖、柱狀圖、線圖、以及各種組合起來的比較復雜的圖。需要支持前臺事件響應,就是在圖上進行點擊拖動等操作的時候,會有對應的響應。比如說需要深入到餅圖的更小粒度。整個網站的架構選用的是django,至于為什么選這個,原因無外乎:django對數據型的網站支持特別好;django是基于python的,這點尤其重要,python的開發相當敏捷,方便,對這種個人英雄主義的項目,尤其重要。前臺圖表都是基于js的,這是為了兼容的考慮,沒有選取基于flash的比如基于flex的那些東東。我們選取的是highcharts插件。
? ? ? ? 前面這么多都是背景介紹,我想說的是在項目進行的過程當中,由于需求頻繁變動,導致程序架構非常紊亂。由于是數據型的網站,最大的毛病在于參數的傳遞和解析上。前臺js代碼的參數的封裝,url的拼接,后臺參數的解析。函數形參的定義等等都是顯式的完成,完全沒有考慮可擴展性。恍然已經處于半離職狀態幾個月了,想想活干的不漂亮,總有點不爽,所以在上周末,抽時間去公司對代碼進行了大規模的重構。雖然說前段時間輕輕的看了一下設計模式,但是自問沒有到可以使用設計模式來解決問題的地步。主要有下面幾個感慨:
? ? ? ?在參數過多的情況下,一個很簡單的辦法,就是定義一個數組,或者python里面的字典。這樣都能有效的解決問題,當然這些方法都行,但是我在弄的時候是把對象作為一個對象來定義的,主要基于的考慮是,項目的參數很多,而且從前臺傳入的時候有一個解析的過程。而且參數的格式在不同的地方也不一樣,再者就是項目有些地方的計算量非常大,為了提高效率,需要將很多中間結果進行緩存,使用了memcache來緩存中間結果,memcache是一個key-value的內存緩存系統,速度快,支持分布式。為了將各個統計模塊的結果進行緩存,需要將參數打包成一個key,以上種種問題,如果將參數定義成一個字典或者數組的話,是無法很好解決的,所以將參數定義成了一個對象,對象內置很多格式化的函數。這樣就將對象傳來傳去。
? ? ?使用對象作為參數,前面提到的問題都得到很好的解決,但是又會帶來一個新的問題,我們知道,對象作為函數的參數的時候,實際上傳入的是引用,意思是如果我們在函數內部對對象的內容進行修改的話,實際上會改變實參對象的內容。這一點又不滿足要求了。可能你會說,為什么不在函數內部原樣復制一個對象參數。我的確是這么干的。但是在python里面不能使用a = b的這種復制辦法,python 提供了copy()來對一個對象進行復制,當然我使用的是deepcopy(),至于copy和deepcopy的區別,有個簡單的說法是,copy只復制父對象,不復制父對象中的子對象,而deepcopy則是最徹底的復制,當然效率啊性能啊,會有一定的影響。
? ? 上面的問題解決以后,基本上后臺的參數優化就只剩下體力活了。
? ? ?關于memcache的好處,用過的人都知道,尤其是在大數據量和數據庫交互的時候,我們可以將頻繁的查詢結果放到緩存中,這樣頻繁的查詢可以直接從內存讀取結果,能顯著的提高用戶體驗,一種網上的說法是一臺服務器,將memcache設為最大,永久不失效。然后專門作為緩存機器,memcache是天然支持分布式的,和hadoop類似,幾臺機器可以輕輕的配置一下就可以連接成一個大的緩沖池。
? ? 最后想說的就是python。python作為一門腳本語言,已經超出了常規的腳本語言的范疇,python在科研領域比如說科學計算,文本處理等方面都有對應的庫,使用相當方便,個人認為這對那些非計算機專業的人來說,python可以說是他們的救星。他們可以用這個來搭建簡單的web系統,當然也可以搭建很復雜的。可以用這個來做實驗。結果展現也有很豐富的畫圖庫。對計算機專業的人員來說,python敏捷開發的首選語言。當你無聊的時候想寫點小程序實現一些很有意思的功能的時候,python將是您的首選。
? ? ?這也難怪,有人會將python作為黑客必學語言之一。
? ? ?最后引進不知道那位boss的話,life is short , you need python!
轉載于:https://www.cnblogs.com/xuq22/archive/2011/11/14/3769452.html
總結
以上是生活随笔為你收集整理的周末加班重构代码的几点感慨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim 折叠的用法
- 下一篇: iframe 的一点经历