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)}