awk新風格(模組化)的業務代碼

來源:互聯網
上載者:User

main.sh (程式入口代碼) 

參數DEBUG會決定logging模組的debug函數是否輸出日誌以方便調試,這其實是我目前形成的理念之一:

一旦我決定在這裡寫下一個輸出語句方便調試,那麼這個語句我就不會再刪除了

我見過很多的研發人員(包括以前的我自己)喜歡在程式裡加上一堆輸出語句(alert,printf,MessageBox)列印一堆沒有什麼含義的語句(例如ssssssss,111111)以及變數的值,之後再刪掉,刪掉之後在添加,添加之後再刪除。。。

其實,他們是為了確定程式狀態,看看程式有沒有運行到添加輸出語句的位置,或者想想看看程式在那個時刻的值到底是啥,但是他們覺得這些日誌語句不屬於商務邏輯,只是輔助用的,而且寫的極亂,所以不願意保留,但是這東西在調試期間由非常有用(尤其是沒有單步調試的開發環境),或者雖然這次開發完畢,刪掉,下次需求發生變化的時候過來重新修改原來已經正確了的程式,又被迫把刪除了的語句給添加上

我現在的理念就是:一旦我需要再這加日誌輸出了,那麼我就永遠不刪除了,因此需要我寫好每一個輸出,保證每個輸出容易被讀懂,是有意義的,再者通過調試狀態的設定,讓這些語句在運行時不輸出,這樣就可以避免效率的降低,下面是我一個例子,因為awk沒有現成的日誌庫,這個logging模組是我自己隨手寫的

#!/bin/shcat $bookListFile | igawk -f stat.awk -v DEBUG=true -v STAT_DATE=$STAT_DATE -v USER_FILE=$auditedUserFile -v STAT_FILE=$statFile -v SCRIPT_FILE=$sqlFile

stat.awk (商務邏輯模組) 

檔案頂部引用的模組都是可以被複用的模組,為了體現模組化的代碼就不提供源碼了,只要知道每個模組都可以幹啥,就可以了

  • assert.awk 提供了 assert函數
  • logging.awk 提供了 debug函數
  • makeSql.awk提供了makeInsertSQL,makeDeleteSQL函數 

我比較得意的一點是我寫完makeSql.awk以後,並且想到他們該怎麼樣複用,我就再也不幹拼SQL這樣的髒活了

@include lib/assert.awk@include lib/logging.awk@include lib/makeSql.awkfunction makeUserList(filename,userList,__ARGVEND__){        while(getline<filename == 1)        {                userList[$0]        }}function readStatResult(filename,statResult,__ARGVEND__,i){        i = 1        while(getline<filename == 1)        {                statResult[i]=$0                i++        }}BEGIN{        makeUserList(USER_FILE,USERLIST)        readStatResult(STAT_FILE,RESULT)        assert(length(RESULT) == 5,"assertion faild : read stat result")}{        listid = $1        userid = $2        digest = $3        debug("debug 1 : userid is "userid)        if(userid in nowUserList)        {                debug("debug 1.1 userid"userid" is find again")        }        else        {                debug("debug 1.2 userid "userid" is first find")                nowUserList[userid]        }}END{        debug("\ndebug 2 : in end block")        newUserCounter = 0        for(i in nowUserList)        {                userid = i                debug("debug 2.1 current userid is "userid)                if(i in USERLIST)                {                        debug("debug 2.1.1 userid "userid" is not new user!")                }                else                {                        debug("debug 2.1.2 userid "userid" is new user!")                        newUserCounter ++                }        }        debug("debug 2.2 today new user count is "newUserCounter)        removeInfo["stat_date"]       = STAT_DATE        makeDeleteSQL("stat_shuqi_book_list",removeInfo,SCRIPT_FILE)        STAT["posted_list"]           = RESULT[1]        STAT["posted_user"]           = RESULT[2]        STAT["new_posted_list"]       = RESULT[3]        STAT["new_posted_user"]       = newUserCounter        STAT["posted_greet_list"]     = RESULT[4]        STAT["new_posted_greet_list"] = RESULT[5]        STAT["stat_date"]             = STAT_DATE        STAT["pv"]                    = 0        makeInsertSQL("stat_shuqi_book_list",STAT,SCRIPT_FILE)}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.