深入淺出 C# 4/e 第五章 心得分享


建立時間: 2022年6月17日 23:12
更新時間: 2022年6月29日 01:43

心得

這個章節包含第五章、附錄一 第五章(在 Github 上的 PDF)、附錄二 第五章
主題是封裝,即使程式不封裝,仍然可以正常運行,封裝是為了讓程式更好維護、降低出錯的風險

這個概念在物件導向很常見,回想以前我也是在困惑為什麼要把欄位設成 private
我為什麼不把全部都設成 public 就好,然後又想既然可以全部設成 public 為何存在 private
即使我問了學長、前輩,他們也解釋不清楚,或者根本不想解釋
只記得有個前輩說全部都設成 public 對整個專案會不好,不好在哪卻解釋不出來

簡單的說 private 用意就是不想讓欄位或方法被存取,只想給類別用
雖然隨時都可以再把它改成 public,但可以做到讓維護者意識到這件事
如果有人亂改類型,那就會在版本控制留下紀錄,其他同事會注意到
可能會要求修改,也有可能置之不理

Mac 發生一個問題

我用 visual studio 用 Debug.WriteLine() 一直無法印出資訊,不知道發生甚麼事情
但在 Windows 可以如期輸出,雖然有一點點影響,但我還是先用 Consolw.WriteLine() 練習

關於程式除錯觀念

截至第五章 pdf 內容,可到 Github 下載,連結附在最底下參考區

截圖.png

有時候工程師收到要修正 bug 的時候
有些工程師可能會為了快速解決這個 bug 沒有徹底了解這個問題是怎麼產生的
這樣會導致改 A 壞 B 的情況

我來舉個真實案例好了
以前開發遊戲時常常遇到遊戲音效在未預期的情況下播放

這個原因是有個方法會播放此音效,但在很多情況下程式會執行這些方法

假設程式是這樣

function do_something () {
    // 略
    playSoundEffect("sound_1");
    // 略
}

我看到同事為了快速解決這個 bug,他會這樣做
假設 condition 成立的情況下,不播放 sound_1 音效

function do_something () {
    // 略
    if (!condition) {
        playSoundEffect("sound_1");
    }
    // 略
}

好高興 bug 解決了…
過一陣後又收到遊戲音效在未預期的情況下播放
怎麼會這樣???

原來因為遊戲增加其他功能,會用到同個方法,但又播放到了這個音效
有些人可能會想說,這個工程師都不會自己測一下的嗎
或者好歹也看一下這個方法的程式碼吧,但程式可能會越來越複雜
以下是稍微複雜一點的邏輯

function do_something () {
    // 略
    if (!condition) {
        playSoundEffect("sound_1");
    }
    // 略
}

function do_else () {
    // 略
    if (condition2) {
        do_something();
    }
    // 略
}

假設,其他同事也用了同一個方法解決

function do_something () {
    // 略
    if (!condition && !condition3) {
        playSoundEffect("sound_1");
    }
    // 略
}

function do_else () {
    // 略
    if (condition2) {
        do_something();
    }
    // 略
}

很高興,現在終於又正常播放音效了。
過一陣子後,某位工程師開發程式時遇到了

某工程師: 疑?怎麼呼叫 do_else() 沒播放音效
某工程師: 哇! do_something() 怎麼那麼多條件判斷!
某工程師: 之前是誰寫的?什麼!已經離職的同事

good.jpeg

多跟艾倫學學

參考

觀看次數: 1315
bugc#心得封裝
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!