一些我自己的代碼規範
寫代碼的時候,代碼規範確實是一個不大不小的問題。爲了防止代碼變成“屎山”,養成一個好的代碼習慣還是十分重要的。本文就簡單記錄一些章魚自己的代碼規範,(不出例外的話)這些代碼將會在本人的所有項目中直接複用。
實用工具
具體來講,當我們想用到一個小工具時,比如logger,肯定會希望直接把前人(或自己)的代碼拿來用。但當我們上網開始找代碼準備照抄時,往往又會覺得別人寫的代碼總是看着不太順眼。思考一番後,往往又會決定自己重新寫一份。如果自己寫的時候偷了懶,可能導致這個小工具和當前項目耦合到了一起,不利於日後複用。所以,章魚認爲有必要把平時用到的小工具都封裝保存好,以後直接複用,既節省精力,又能保證代碼風格一致。
logger
輸出,log。這大概是一個項目中最常用的功能。格式輸出,輸出到文件,帶着log_level輸出.......這些功能每次都要寫,每次都不重樣。爲了讓代碼更美觀,我直接借鑑了yongchaoHe學長的代碼風格,整理出了C和C++兩個版本的logger,代碼在logger/src
-
Usage
-
C
跟printf用法相同,直接
LOG_INFO("n = %d\n", n);
-
C++
跟cout用法相似,直接
logger << "n = " << n << endl;
也可以快捷地輸出一行
logger.info("n = ", n);
-
-
Result
bash script
在編寫bash腳本時,也最好採用上文的輸出格式。當編寫多個腳本時,可以將一些共用的函數裝到一個“頭文件”
裏,每個腳本引用這個“頭文件”即可。
在具體的項目中,腳本所在的目錄在這裏:
.
├── bin
├── other_folders
│ ...
└── scripts
├── other_scripts.sh
| ...
└── utils.sh
這個utils.sh就是頭文件,其代碼是utils.sh。
-
Usage
只需在其它文件裏寫
scrp_path=$(cd `dirname $0`; pwd) . ${scrp_path}/utils.sh
即可加載此頭文件
命令行參數
無非就是getopt,原理大家都懂,但是每次重寫一遍估計都和之前長得不太一樣。爲了防止重寫(可以直接ctrl c+v),這裏整理了C和C++兩個版本,代碼還是在logger/src。
-
Usage
-
C
parse_conf(argc, argv);
結果保存在全局變量
struct conf_t conf;
中 -
C++
Config cfg; cfg.parse(argc, argv);
用
Logger &logger(cfg.logger);
即可得到對logger的引用。
-
計時與等待
同樣是一個令人頭疼的問題。此前每次想要sleep或者gettime時,總要思考幾個問題:需要包含哪些頭文件?結果的格式是啥樣的?於是乾脆把它們封裝成幾個固定的函數接口好了。
-
Usage
double gettime_s(); double gettime_ms(); double gettime_us(); void sleep_s(int n_s); void sleep_ms(int n_ms); void sleep_us(int n_us);
中斷
直接用Ctrl+C來終止死循環並不是一個很優美的做法。相對地,用自定義的函數處理SIGINT和SIGTERM是一個很好的習慣。
用signal
來註冊一個信號處理函數。當信號處理函數捕獲一個SIGINT或者SIGTERM信號時,會將一個全局的變量force_quit
設爲1。而所有原本的死循環也都要不停地檢測force_quit
是否爲1。
代碼見logger/test中的QuitTest。