二、子過程
寫一個事件,很多人就是直接開寫,不管代碼有多長,做的事情有多少,只要是在一個事件裡做的,一古腦寫下去,結果是幾個月後重新修改的時候無從下手,因為代碼段實在太長了。那麼為什麼不把代碼段拆開呢?人的注意力有有限的,超過100行的代碼一口氣看下來會暈的,Delphi的前輩告訴我一件事情:所有的過程(這裡的過程包括procedure和function)不要超過25行!因為這個長度的代碼看起來不會讓你頭暈,你會很容易了解這個過程要做的事情。
那麼怎麼把原本在一個事件做的事情拆開呢?方法很多,我的經驗是模塊化。比如一個事件裡要做很多不同的事情,那麼就把不同的事情化為不同的子過程,然後在主過程裡調用,主過程裡大多數就是一些判斷和循環,不會出現具體的實現過程,這樣會生出很多的代碼段,但是會讓你的注意力集中!
原則:一個過程只做一件事情,並且做好它。
參考:VCL的源代碼。看看VCL的源代碼,很少有超過25行的代碼段!
三、參數名
記得當初學SDK的時候,我一看到匈牙利表示法就頭暈,太多了!記不住啊!所以我恨那個發明者:)終於Delphi出現了,戴著鐐铐跳舞的日子過去了!在Delphi裡,定義一個字符串用strDOSometing這樣的變量名是可笑的和不必要的。只要你的過程很短,不出現全局變量,就不需要這樣的前綴。比如:
procedure SubPro;
var
i : byte;
Width, Height : integer;
begin
Width := GetWidth;
Height := GetHeight;
for i:=0 to 9 do
begin
DrawThread := TDrawThread.Create;
DrawThread.Width := Width;
DrawThread.Height := Height;
DrawThread.Start;
end;
end;
我想這樣的代碼段雖然沒有注釋,也很容易知道他要做的事情。所以,請去掉所有的前綴和下劃線,Delphi的程序不需要這些!我們的參數名只要動詞+名詞就可以,只要說明這個參數的作用就可以,多余的東西我們不要,簡單就是美,Pascal的好處就在於代碼像在說話,而不是讀天書,你的腦袋裡是怎麼想的,代碼就是什麼樣子的。優美、簡單,這是Pascal的好處,請遵守!
原則:簡單就是美!
四、子窗口
很多人在調用子窗口的時候是直接對子窗口裡的控件操作的,比如:
if SetAlarmParamDlg.ShowModal = MrOK then
begin
AlarmTimes := StrToInt(SetAlarmParamDlg.Edit1.Text);
AlarmArea := SetAlarmParamDlg.SpinEdit1.Value;
end;
天,假如明天用戶覺得你用的Edit或者SpinEdit的樣子難看,換了一個漂亮的控件,你怎麼辦?不但要修改子窗口的代碼,還要修改主窗體的代碼。一兩個子窗口的程序當然不會讓你痛苦,假如是一個有二十多個子窗體的程序呢?花一天的時間,原因卻只是因為換了一個控件!為什麼不換一個方法?把要用的參數用屬性表示,你會少寫無數的代碼。
// 主窗體
if SetAlarmParamDlg.ShowModal = MrOK then
begin
AlarmTimes := SetAlarmParamDlg.AlarmTimes;
AlarmArea := SetAlarmParamDlg.AlarmArea;
end;
// 子窗體
interface
private
FAlarmTimes : integer;
FAlarmArea : integer;
published
property AlarmTimes : integer read FAlarmTimes write FAlarmTimes;
property AlarmArea : integer read FAlarmArea write FAlarmArea;
implementation
...
FAlarmTimes := StrToInt(Edit1.Text);
FAlarmArea := SpinEdit1.Value;
ModalResult := MrOK;
...
只要這樣堅持下來,你會發現好處大大的,一個子窗口只做他自己的事情,主窗口和他的交互是通過屬性來做的,只要接口不變,子窗口的修改不會影響到主窗口的代碼,不管子窗口的樣子怎麼變換,控件怎麼更換,代碼怎麼修改,整個程序都還是老樣子,只是界面變了而已。
原則:模塊化你的子窗口,窗口也是類,類之間怎麼通信,窗口之間就應該怎麼通信