2015年10月29日 星期四

Getter / Setter 之我見

    寫過 Delphi、C#、VB.Net、Java,對 Property (Getter / Setter) 有特別的感受,甚至有相見恨晚的感覺。

    筆者在非軟體資訊產業,週遭同事的程式設計程度還停留在 copy and paste coding,OOP 物件導向聽過沒感覺,反正結果是對的就好了。

    所有邏輯包在 function 裡就很了不起了,千萬不要跟我說這是時下最流行的 Functional Programing,就算我不懂也沒傻到這程度。

    企業培訓上也把你當成 coding operator (作業員),coding 只要會打字就好是基本能力,所以工作流程偏重在企業流程 Know How,對待軟體開發工作的態度與軟體業界差異很大。開發人員 coding 過程幾乎都是把企業流程直接搬進程式碼裡,缺乏程式碼的分析設計,著重在資料庫 schema 設計,所以物件導向不重要、開發平台老舊,現在 Visual Studio 都出到 2014 了,結果我們還在用 2008。

    連微軟都要投入 Open Source 的時代,我們連 Nuget 都不能用;更不用說其它 Open Source Library。


講太多公事,拉回來。


筆者雖沒受過專業的訓練,倒也在實作過程中有些想法,這篇主要說明對 Property 的使用。


1. Win Form 開發上,筆者很喜歡把 UI 上的 Input Control 轉成 Property 使用,一方面不喜歡在程式碼裡面看到 textBox1.Text,一方面減少 Form 跟程式碼的耦合,解放 UI,也算用上 MVC 的精神吧。

2. 把 Property 當開關使用,怎麼說呢?

如果要寫個打開電燈這個動作,假設會有以下步驟。

按下開關 -> 判斷目前電燈是開著抑或是關著 -> 如果是開著的就把電流迴路切斷 -> 將電燈關起來;如果是關著的就把電流迴路接上 -> 將電燈打開。

如果很多人都要打開電燈,每個人都要作一次上述的動作,這不是很愚蠢嗎?

話說,為什麼我要打開電燈,須要知道那麼多動作。

對照現實生活,你/妳 會這樣作嗎?

當然是開關按下去就沒我的事了。

        private Boolean _turnOnOff = false;

        //電燈開關
        protected Boolean TurnOnOff {
            get {
                return _turnOnOff;
            }
            set {
                _turnOnOff = value;

                if (_turnOnOff)
                {
                    //開燈
                    
                    //1. 電流迴路接上 
                    //2. 電燈亮起。

                }
                else
                { 
                    //關燈

                    //1. 電流迴路斷開 
                    //2. 電燈不亮。
                }
            }
        }

        private void btnTurnOnOff_Click(object sender, EventArgs e)
        {
            //切換開關
            TurnOnOff = !TurnOnOff;
        }

對操作開關的人來說,只要在乎 開 / 關

        private void btnTurnOnOff_Click(object sender, EventArgs e)
        {
            //切換開關
            TurnOnOff = !TurnOnOff;
        }