[雜記] 一些我自己的代碼規範

一些我自己的代碼規範

寫代碼的時候,代碼規範確實是一個不大不小的問題。爲了防止代碼變成“屎山”,養成一個好的代碼習慣還是十分重要的。本文就簡單記錄一些章魚自己的代碼規範,(不出例外的話)這些代碼將會在本人的所有項目中直接複用。

實用工具

具體來講,當我們想用到一個小工具時,比如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
    image

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。

To be continued or modified...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章