一、關(guān)于界面
界面對于一個程序,仿佛就是容貌對于一個人,重要性是不言而喻的。
一個程序的界面做的很漂亮是很好,但是如果界面不能很好的反映功能,那再漂亮的界面都是垃圾一堆,這方面我是有體會的,當(dāng)你的大部分精力全放在如何
做一個漂亮的界面的時候,災(zāi)難就降臨了,你將永遠(yuǎn)無法把程序的功能做好!如果想把程序做好,就不要考慮漂亮的界面,等到功能全部實現(xiàn)的時候,界面自然
就會出現(xiàn),到時候美化也不遲。
這個問題上,Delphi的程序員可能遇到的最多,因為滿天飛的都是漂亮的控件,這個也好,那個也好,不用真是可惜,于是找個一堆控件,一個個的試驗過來
,功能全然不顧。其實用戶用一個軟件,不是因為界面漂亮,而是因為功能強。即使是在DOS窗口下跑的程序,只要功能強,用戶照樣會津津有味的使用,如果功
能弱的一塌糊涂,即使界面做成無比酷,最后的命運也是被刪除。所以,寫一個軟件的時候,請首先從功能入手,而不是界面!
那么是不是不用考慮漂亮的界面呢?也不是。終究漂亮的界面是很吸引眼球的,但是要是按照我的意思,先弄個普通的界面,最后美化,會造成一個問題,就
是要修改很多代碼,比如:
procedure TMainForm.Button1Click(Sender : TObject)
begin
FWidth := StrToInt(Edit1.Text);
FHeight := StrToInt(Edit2.Text);
FScreenSize := FWidth * FHeight;
end;
上面的代碼運行的時候是沒有什么問題的,但是一旦你換了一個Edit控件,或者是只是換了Edit的名字,工作量就出來了,一個兩個的變化還沒有問題,假如
這個Edit1.Text在代碼里出現(xiàn)了100多個地方呢?怎么辦?我的方法是把程序的界面和功能分開!代碼盡量不要和具體的控件相關(guān)聯(lián)。如下:
procedure TMainForm.SetParam(const Width, Height : string);
begin
FWidth := StrToInt(Width);
FHeight := StrToInt(Height);
FScreen := FWidth * FHeight;
end;
procedure TMainForm.Button1Click(Sender : TObject)
begin
SetParam(Edit1.Text, Edit2.Text);
end;
這個例子有點極端,好像是畫蛇添足,但是當(dāng)你大量的修改控件或者更換控件名字的時候,作用就顯示出來了。到你最后想美化界面的時候,修改代碼的工作
量會減輕很多。因為只要傳入的參數(shù)更換一次就可以,而不是在無數(shù)的地方進行修改。
原則:界面和實現(xiàn)分開
二、全局變量
不要使用全局變量?。?!即使設(shè)定的全局變量你認(rèn)為一萬年也不會變,也不要使用,因為說不定那天修改了一個功能,這個全局變量就要拆成兩個變量了,那
么問題就會出現(xiàn),還是通過參數(shù)傳遞吧。還是來個例子:
//main
const
ShowWidth = 384;
ShowHeight = 288;
...
// SetParamDlg 子窗口
SpinEdit1.Value := MainForm.ShowWidth;
SpinEdit2.Value := MainForm.ShowHeight;
上面的代碼工作的不錯,但是假如有一天客戶說我要分辨率可變,怎么辦?在const里重新加入ShowWidth1、ShowWidth2、、、?最后const的體積會越來越大
,查const的時候會累死你,那換一種方法:
//main
function ReadWidth : integer;
function ReadHeigth : integer;
SetParamDlg.Width := ReadWidth;
SetParamDlg.Height := ReadHeight;
//SetParamDlg
SpinEdit1.Value := FWidth;
SpinEdit2.Value := FHeight;
是不是比較好一點?
原則:盡量在一開始設(shè)計的時候把所有看起來目前不會變化的參數(shù)也做成動態(tài)的。
三、一個小問題
這是我在一個網(wǎng)站上看到的,比較有意思,而且感覺很容易犯,這里就抄襲一下了,不過這只是編程技巧,不是方法
function sum(a : array of word; count : word) : longword;
var
i : word;
begin
result := 0;
for i := 0 to count - 1 do inc(result, a[ i ]);
end;
上面的代碼有問題么?乍看是沒有問題,但是說不定什么時候他就當(dāng)?shù)袅?。為什么?因為Count是個WORD,假如傳入?yún)?shù)的時候Count=0會發(fā)生什么事情呢?對
了,WORD翻轉(zhuǎn)了,那就等他循環(huán)FFFF次吧:)所以請注意無符號類型的操作!
累了,自己都感覺沒寫好,休息ing,歡迎磚頭,歡迎高手來發(fā)表意見....