天天看點

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

[畢業生的商業軟體開發之路]開發第一個Windows應用程式

近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些徘徊在職場門口的學生一些建議,希望能給這些初學者進入軟體開發行業帶來一些幫助,使得畢業生能更順利的進入軟體開發公司開始職場生涯,人生來一個完美的轉彎。

       近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些徘徊在職場門口的學生一些建議,希望能給這些初學者進入軟體開發行業帶來一些幫助,使得畢業生能更順利的進入軟體開發公司開始職場生涯,人生來一個完美的轉彎。

---------------------------------------------------------------------------

開發第一個Windows應用程式

        在本章筆者帶着讀者使用VS.NET2010開發第一個Windowns應用程式。初步了解使用C#進行Windows應用開發。

本軟體的功能需求就是開發一個能進行加減乘除的電腦。

建立C# Windows應用程式項目

        筆者點選VS.NET開發環境的菜單“檔案-建立-項目”,顯示了如下圖的“建立項目”對話框。

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

        在該對話框中,筆者進行以下四步操作。

1.       在“已安裝的模闆”樹[袁永福版權所有]狀清單中選中“Windows”節點。

2.       在右邊的清單中選中“Windows 窗體應用程式”項目。

3.       在“名稱”文本框中輸入“第一個Windows應用程式”。

4.       在“位置”文本框中輸入儲存程式檔案的目錄路徑。

筆者點選“确定”按鈕關閉對話框,則VS.NET會自動生成一個Windows應用程式的架構。此時VS.NET開發環境界面如下

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

        學過VB的可以發現,這個使用者界面和VB的使用者界面很相似。對于會VB的初學者來說,使用C#開發Windows應用程式和VB差不多,隻是背景程式設計語言由VB改成C#。

        在這個VS.NET的使用者界面中,主要的使用者界面元素有最左邊是控件工具箱,中間是窗體設計器,右上方為工程資源樹狀清單,右下方為控件屬性編輯清單。

WinForm控件工具箱

        該界面最左邊為Windows控件工具箱,上面列出了所有的可以使用的控件。使用者按下該清單中的某個控件圖示,然後滑鼠拖拽到左邊的窗體上即可在窗體上建立一個指定類型的控件。比如如下圖所示,使用者按下“Button”項目然後拖拽到窗體上,則會在窗體上新增了一個按鈕控件,控件的位置就是滑鼠光标所在位置,控件大小采用預設大小。

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

        另外當工具箱中的控件項目按下後,将滑鼠移動到窗體設計器中。此時滑鼠光标就變成附加控件圖[袁永福版權所有]标的十字形。比如使用者按下“Button”項目,然後滑鼠移動到窗體設計器中,則滑鼠光标樣式為“

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

”。此時開發人員在窗體設計器中使用滑鼠拖拽操作在窗體上畫上一個指定位置指定大小的控件。

        在預設情況下,控件工具箱中列出的控件是夠用的。但這裡并沒有列出微軟.NET架構自帶的所有的Windows控件,而且也不包含第三方的控件,為了使用沒有預設列出的控件,筆者需要往控件工具箱上添加新的控件。

        如下圖所示,筆者滑鼠右擊工具箱,在彈出的快捷菜單中點選“選擇項”菜單項目。

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

        則會顯示如下圖所示的“選擇工具箱項”的對話框

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

        該對話框中最重要的是“.NET Framework元件”分頁标簽頁面。該頁面列出了本系統安裝的基于.NET平台的元件。

        在.NET元件頁面[袁永福版權所有]中列出了目前VS.NET所能識别的所有的Windows控件,人們可以在某個控件前面設定打勾使得該控件能顯示在工具箱的控件清單中,不打勾就不顯示。

        對于從第三方獲得的已經開發好的控件,開發者可以點選“浏覽”按鈕來選擇包含控件的.NET程式集檔案,比如“MyControls.DLL”。然後控件清單中出現了開發人員選擇的.NET程式集中所包含的控件項目,開發人員就可以在這些控件前面打勾使其顯示在工具項目中的控件清單中。

WinForm窗體設計器

        VS.NET的Windows窗體設計界面中間是窗體設計器。其使用者界面如下

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

        窗體設計器具有以下幾個主要功能

1.       開發人員可以從左邊的控件工具箱中拖拽圖示到窗體上來在窗體中放置各種各樣的控件,控件的位置就是滑鼠拖拽到的位置,控件的大小為預設大小;開發人員也可以按下控件工具箱中的控件圖示,然後在窗體中拖拽畫出指定位置指定大小的控件。

2.       開發人員可以很友善的使用滑鼠拖拽操作來移動控件在窗體中的位置或者修改控件的大小。當窗體中存在可容納子控件的容器控件時,開發人員拖拽時可以修改控件的父子關系。

3.       開發人員可以點選選中某個控件,然後在右邊的屬性清單中檢視和修改控件的屬性。

4.       開發人員可以輕按兩下控件,而且控件具有預設事件,則使用者界面會切換到C#代碼編輯界面,并自動構造出響應控件預設事件的C#代碼結構。開發人員可以直接輸入響應控件事件的程式代碼了。

        在上圖中,窗體上已經放置了兩個Label控件,兩個TextBox控件和兩個Button控件,并設定了控件的位置、大小和一些屬性。當筆者運作程式時,該窗體的運作時的使用者界面如下。

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化

        可以看到窗體在設[袁永福版權所有]計時的顯示效果就基本上等于運作時的顯示效果。實作了一種“所見即所得”的可視化界面設計功能。

可視化軟體開發

        微軟的內建開發環境“Microsoft Visual Studio”中的Visual就是“可視化”的意思。微軟最早是在Visual Basic中實作了可視化的使用者界面設計功能,這引起了軟體開發方法的革命。

        比如對于上圖的那個對話框,在沒有可視化程式開發時,開發人員需要手動的編寫以下的代碼來構造出本窗體的使用者界面。

private System.ComponentModel.IContainer components = null;

private System.Windows.Forms.TextBox txtNumber1;

private System.Windows.Forms.ComboBox cboOperator;

private System.Windows.Forms.TextBox txtNumber2;

private System.Windows.Forms.Button btnCalculate;

private System.Windows.Forms.TextBox txtResult;

protected override void Dispose(bool disposing)

{

    if (disposing && (components != null))

    {

        components.Dispose();

    }

    base.Dispose(disposing);

}

private void InitializeComponent()

{

    this.txtNumber1 = new System.Windows.Forms.TextBox();

    this.cboOperator = new System.Windows.Forms.ComboBox();

    this.txtNumber2 = new System.Windows.Forms.TextBox();

    this.btnCalculate = new System.Windows.Forms.Button();

    this.txtResult = new System.Windows.Forms.TextBox();

    this.SuspendLayout();

    // 

    // txtNumber1

    // 

    this.txtNumber1.Location = new System.Drawing.Point(12, 40);

    this.txtNumber1.Name = "txtNumber1";

    this.txtNumber1.Size = new System.Drawing.Size(84, 21);

    this.txtNumber1.TabIndex = 0;

    // 

    // cboOperator

    // 

    this.cboOperator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;

    this.cboOperator.FormattingEnabled = true;

    this.cboOperator.Items.AddRange(new object[] {

    "+",

    "-",

    "*",

    "/"});

    this.cboOperator.Location = new System.Drawing.Point(96, 40);

    this.cboOperator.Name = "cboOperator";

    this.cboOperator.Size = new System.Drawing.Size(44, 20);

    this.cboOperator.TabIndex = 1;

    // 

    // txtNumber2

    // 

    this.txtNumber2.Location = new System.Drawing.Point(140, 40);

    this.txtNumber2.Name = "txtNumber2";

    this.txtNumber2.Size = new System.Drawing.Size(76, 21);

    this.txtNumber2.TabIndex = 0;

    // 

    // btnCalculate

    // 

    this.btnCalculate.Location = new System.Drawing.Point(216, 39);

    this.btnCalculate.Name = "btnCalculate";

    this.btnCalculate.Size = new System.Drawing.Size(32, 23);

    this.btnCalculate.TabIndex = 2;

    this.btnCalculate.Text = "=";

    this.btnCalculate.UseVisualStyleBackColor = true;

    // 

    // txtResult

    // 

    this.txtResult.Location = new System.Drawing.Point(248, 40);

    this.txtResult.Name = "txtResult";

    this.txtResult.ReadOnly = true;

    this.txtResult.Size = new System.Drawing.Size(87, 21);

    this.txtResult.TabIndex = 0;

    // 

    // frmMain

    // 

    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);

    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

    this.ClientSize = new System.Drawing.Size(356, 122);

    this.Controls.Add(this.btnCalculate);

    this.Controls.Add(this.cboOperator);

    this.Controls.Add(this.txtResult);

    this.Controls.Add(this.txtNumber2);

    this.Controls.Add(this.txtNumber1);

    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;

    this.MaximizeBox = false;

    this.MinimizeBox = false;

    this.Name = "frmMain";

    this.Text = "電腦";

    this.ResumeLayout(false);

    this.PerformLayout();

}

        編寫這樣的代碼是枯燥範圍而且效率低下的過程。開發人員在編寫代碼的過程中需要在腦海中想象出這段代碼運作後的窗體界面。需要多次運作程式顯示窗體檢視運作效果後修改代碼進行控件位置大小的微調。當窗體界面中需要新增或删除控件時會影響其他控件的排版,此時又得多次運作程式顯示窗體來修改代碼進行微調。

        當窗體界面很複雜,開發人員需要編寫和維護幾千行的構造窗體使用者界面的代碼,這一大段代碼開發和維護成本是非常高的。

        而是用可視化的窗[袁永福版權所有]體使用者界面設計功能能大大降低設計和維護窗體使用者界面的成本。在窗體設計器中,開發人員即可看到控件在窗體中的排版效果,并能比較精确的進行控件排版微調,還可以使用控件的屬性編輯器來編輯控件屬性,并能實時的看到使用者界面的修改效果。這樣能很大的提高使用者界面設計工作效率,縮短開發和維護時間。

        另外從開發方式來說,可視化使用者界面設計降低了勞動強度。在沒有可視化設計前,開發人員完全靠寫代碼來拼湊軟體使用者界面,寫代碼是一種高強度的勞動,開發人員需要端坐在電腦前,腦子裡想出代碼,然後雙手在鍵盤上快速的輸入代碼,此時無論身體還是精神處于一定的緊張狀态,勞動強度高,比較容易疲勞。

        而可視化使用者界面設計過程中,大部分操作是靠滑鼠操作的,單手即可完成,是以開發人員不需要端坐,而可以采用比較休閑舒适的坐姿,而且設計過程比較簡單,大腦思考不多,此時身體和精神處于較為放松的狀态,勞動強度低,不容易疲勞。

        有人認為可視化設計降低了對軟體開發人員的要求,對于其成長不利。個人覺得并不是這樣的。

        可視化操作掩蓋了軟體使用者界面的背景實作,由于人們普遍具有惰性,能使用可視化操作完成使用者界面的設計任務後就不深究其背景的實作,這确實不利于開發人員的技術鑽研。不過學海無涯,軟體開發涉及到很多很多技術的細節,若開發人員要了解軟體開發過程中所有的技術細節,尤其是構造使用者界面的比較枯燥乏味的技術細節,這會耗掉相當多的精力,進而減少了對其他技術細節的關注度。

        現代軟體的開發内容分為技術内容和業務内容。對于行業應用軟體,開發人員應當将主要精力放置在行業業務細節,需要花大精力來了解客戶業務需求,包括客戶的業務資料和執行流程。隻有深入了解了業務,開發人員才能利用軟體開發技術來開發符合業務内容的應用軟體。是以開發人員應當花費主要精力在深入了解客戶業務上,充分掌握客戶的業務細節。

        由于人的精力是有限的,是以開發人員應當盡量少的降低對技術細節的精力消耗量,這就是各種應用系統架構出現的原始需求。可視化程式設計就能隐藏大量的技術細節,使得開發人員能快速高效的設計程式,降低花在軟體開發技術細節上的精力消耗。這優化了開發人員的精力配置,使得開發人員不必糾纏在軟體技術細節問題上,更注重于業務的了解和實作,提高軟體開發的生産效率。

        而且可視化軟體設計能降低對開發人員的水準要求,由于可視化軟體開發操作簡單,不需要寫代碼,這能降低軟體開發人員的水準要求,使得大量的低級軟體開發人員也能參與商業軟體的開發。

        一般來說,一個企業的軟體開發人員是高水準的開發人員少,低水準的開發人員多。高水準的開發人員能開發和維護上萬行的源代碼,而低水準的開發人員隻能維護幾千行的源代碼,而高校實習生們隻能編寫幾百行的源代碼。是以不能指望低水準的開發人員能通過編寫程[袁永福版權所有]序代碼來構造軟體的使用者界面。

        若沒有可視化軟體開發,則企業中必然存在大量的不能投入實際工作的開發人員,這對企業來說會有巨大的不必要的成本浪費。而可視化軟體開發掩蓋了一些技術細節,使得低水準的開發人員能比較獨立的進行軟體的使用者界面開發,這樣企業中所有的開發人員都能投入實際工作,不會浪費人力資源,提高企業的盈利水準。

當然,完全的使用可視化的軟體設計确實縱容了開發人員的惰性,大量的沒有鑽研精神的軟體開發人員隻利用了可視化軟體設計的功能而不去思考其掩蓋的技術細節,這不利于由低水準的軟體開發人員更新為高水準的軟體開發人員。筆者見過這類的開發人員,使用VS.NET從事開發工作若幹年,隻會拖拽生成DataSet,然後在窗體上放置若幹個控件,直接綁定到資料源上,幾年下來都是幹這樣的工作。對此少數開發人員覺得工作一段時期自己的水準沒有多大提高而有所焦慮并試圖改變;當然也有很多懶惰的開發人員對此麻木不仁,技術水準原地踏步,終難成大器。

        是以有夢想的開發人員還需要大力發揚鑽研精神,不拘泥于可視化軟體設計帶來的便利,還需要深入了解相關技術細節,也是初級開發人員成長的必由之路。

        有完美主義者認為[袁永福版權所有]讓初學者學習軟體開發,必須抛棄可視化軟體設計,一切用手工編寫代碼來實作功能,這樣做為得是讓學習者一開始就學習技術底層細節。筆者個人覺得不妥:

        從軟體開發學習者的角度來說,一開始就學習技術底層細節就像讓國小生學習高難度的奧數一樣,對于少數天才這是提升能力的較好方式,但對于大多數普通人來說那是拔苗助長。過高的難道将較大的打擊學習者的信心,使得學習者喪失對軟體開發的興趣,容易導緻其放棄學習。

        持精英教育觀點的人士或者會說就是這樣才能大浪淘沙,能發現并培養出高水準的軟體開發人員。可是中國軟體行業需要幾十萬上百萬的軟體開發人員,若通過這種方式培養不知何年那月才能湊齊這個數字。

        從企業的角度來說,一開始就讓初學者或者大學畢業生學習技術底層細節,則時間比較長,可能需要好幾個月甚至一年以上的時間,還得讓老員工花時間悉心指導才可能成功;若經過教育訓練發現初學者不是軟體開發的料則之前的工作全部浪費。這種培養方式對自負盈虧的企業來說成本太高了,得不償失。

        若讓初學者首先學習可視化軟體設計,則學習難度低,速度快,而且能較快的投入實際的軟體開發過程中。是以能讓初學者或者大學畢業生盡快的投入實際工作,為企業帶來工作業績。而且能較快的看到自己能投入實際工作,這對大學畢業生來說是一種激勵,使其能較快的建立起職場自信心,形成對軟體開發工作的興趣,這對企業和個人來說都有好處。

        綜上可以看到,可視化軟體設計确實較大的提高了開發人員的工作效率,降低軟體的開發成本。[袁永福版權所有]

[畢業生的商業軟體開發之路]開發第一個Windows應用程式 - 袁永福 電子病曆,醫療資訊化