iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 1
2
自我挑戰組

開發雜記系列 第 1

切割DEBUG版本

  • 分享至 

  • xImage
  •  

前言

筆者剛開始寫程式的時候,隨著時間推移,常常會發生打掉重練的情況,隨著所學越來越多,打掉的頻率也越來越高。而當年的筆者尚未接觸到測試、重構的領域。備份程式永遠採用複製貼上配合時間編流水號的方式。隨之所養成的壞習慣就是很多時候經常寫function1、function2 來區隔新舊方法。而某些時候為了調整正式版於測試版。總是在程式內以區域備註(/**/ )的方式進行切換,久了總會忘記。出社會以後,因為這樣導致了很多次更版的災難。

後來因為開始大量需要設定測試機與正式機,為此開始尋找解套。某次發現Visual Studio 內建 DEBUG這個前置處理器宣告可以實現我的需求。

定義

在計算機科學中,預處理器是程序中處理輸入數據,產生能用來輸入到其他程序的數據的程序。輸出被稱為輸入數據預處理過的形式,常用在之後的程序比如編譯器中。所作處理的數量和種類依賴於預處理器的類型,一些預處理器只能夠執行相對簡單的文本替換和巨集展開,而另一些則有著完全成熟的程式語言的能力。
---引用自維基百科

根據維基百科的定義,預處理器可以視為專門寫給組譯器的一種描述語句。事實上,筆者更早年在學習C/C++的時候。我們定義標頭檔(.h)就曾使用過 #IFNDEF #DEFINE #ENDIF等相關語法。當時只知道這可以提供給組譯器使用。後來改用C#的時候經過查詢MSDN才知道有如此多的用法。本篇無法描述全部,僅針對筆者常用的幾個方法討論。

切換開發版發布版

首先,我們都知道程式經過開發測試沒有問題後將會重新Compiler程式進行部署。而善用Visual Studio內建DEBUG 的宣告,可以將我們的程式碼切割。例如:

        static void Main(string[] args)
        {
#if DEBUG
            Console.WriteLine("DEBUG");
#else
            Console.WriteLine("NOT DEBUG");
#endif
            Console.ReadKey();
        }

上述程式碼中,如果我們將建置的平台切換為Debug,則會輸出DEBUG。否則使用Release方式這列印NOT DEBUG的字樣,如此一來我們就可以定義Debug時專用的變數而快速切換了。

開發新功能用

這是一個前輩所教的方法,由於商業邏輯不斷更新,迫使我們不得不更新系統的功能。但是程式只有一份,往往正在修改A功能的時候,QC部門回報一個BUG必須馬上處理,但是新的功能已經改下去了。還原或繼續做新功能會變得進退兩難。(當然,前提是還沒有導入版本控管分支的概念。)就可以定義新的功能,將新的功能用#IF XXX 的方式加以保護,如下:

#define _FEATURE_127_  //新增127號功能 .....
using System;

namespace ItHome2016
{
    class Program
    {
        static void Main(string[] args)
        {
#if _FEATURE_127_
            Console.WriteLine("實做 127 號功能");
#else
            Console.WriteLine("原始的方法");
#endif
            Console.ReadKey();
        }
    }
}

當我們定義 FEATURE_127 的時候,該功能才會被啟動。目前,筆者大量在重構程式時,仍會採用這種方式保留至少前一版的CODE 在source code 內,以確保當時的邏輯沒有被誤改。而當經過多次確認以後,才會將程式碼轉換為新的。這樣一來,可以快速暫停一個開發中的功能。
(題外話:事實上,開發新功能還是儘量使用 版本控制-分支功能)

其他提示詞

當然除了#IF #ELSE #ENDIF #DEFINE 以外,當程式碼過長的時候,將使用#REGION 以及#ENDREGION進行區塊化,以增加可讀性;為了避免其他同仁誤用版本,將可能採用 #ERROR進行描述,提醒Build版的同仁作業是否正常。有關其他的定義可以參考MSDN的說明,日後有機會筆者在進行討論。

後記

首次參與鐵人賽,希望以較簡單的篇幅紀錄自己的經驗,希望對新入手的人有所幫助。如有描述錯誤的地方,還請告知。筆者不才,再此獻醜了。

參考文獻

C# 前置處理器指示詞:https://msdn.microsoft.com/zh-tw/library/ed8yd1ha.aspx


下一篇
cs檔分身術:partial class
系列文
開發雜記4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言