iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

C# 從入門到WebApi系列 第 11

[Day11] 論物件導向三本柱之一(封裝)

  • 分享至 

  • xImage
  •  

前言

說起物件導向程式設計
其實在學生時代就有提過
但真正開始使用是這一年出社會才終於理解其重要性
在最近換了新公司
組內有幾名寫python的工程師(都算是新鮮人吧(雖然我也是))
內部再討論一些話題的時候我才知道原來他們不太熟物件導向的概念
(它們跟我說 python有private這個東西哦 我不知道)

這邊開始會有點抽象

既然都選擇學習物件導向的語言了 那為什麼不好好使用它的特性呢

什麼是物件導向

我在[Day4] 我知道Class 班級對吧中有提到"物件"的概念
物件導向就是用程式語言模擬真實世界的行為

但是並沒有明確定義該怎麼做
--- Clean Architecture 的作者 Uncle Bob 如是說

於是有人回頭找了三個詞綴來形容他
分別是封裝 繼承與 多形

什麼是封裝

引用維基百科

封裝(Encapsulation)是指,一種將抽象性函式介面的實作細節部份包裝、隱藏起來的方法。同時,它也是一種防止>外界呼叫端,去存取物件內部實作細節的手段。

看完還是霧煞煞
簡單而言就是將一些共有的內部涵式包裝成Method或class 並取拒絕外部去使用他(宣告為private)
外部在使用這個Class的時候,並不
** 那所有的Method 都宣告成private 其他類別要怎麼使用 **
.
.
** 所以沒有要你將全部都宣告成private 有必要給外部使用的請宣告為public **

我還是不懂你倒底在公三...毀

舉個例子而言
財哥有一台車
Car.cs

using System;

namespace Encapsulation
{
    public class Car
    {
        public string owner = "財哥";
        public string color = "黑色";
        private int speed = 0;
        public int miles;

        public void SpeedUp()
        {
            speed += 10;
        }

        public void Brake()
        {
            speed -= 10;
        }

        public void GetSpeed()
        {
             Console.WriteLine($"現在的速度是{speed}");
        }
    }
}

今天財哥想要痛他的車子
把顏色改成過氣的藍色
於是就把車子開到修車廠
跟維修人員說:
"檳友...麻煩...你...幫我把...車子...漆成...過氣的...藍色...
不是...智障的...那種...藍色"
作為檳友的維修人員馬上開始噴漆
但是他在噴漆的時候發現了這台車的所有權是用貼紙貼上去的
他就把財哥的名字撕下來
貼上自己的名字

這下好了
財哥不但付了痛車的錢
最後車子也變成別人的

那如果我們在設計車子的時候
跟speed一樣有做封裝
對於想要操作speed這個欄位的人
都必須透過SpeedUp()跟Brake()方法來操作
就不會發生維修人員在噴漆
結果不小心將速度調成100
就轟隆隆隆??隆隆隆隆衝衝衝衝???拉風???引擎發動???引擎發動+?+?+?

另外封裝還有一個重點
外部使用者不需要關心 細節是如何實作的
今天財哥開車的時候不用在乎車子是怎麼發動的
他只要輕輕轉一下鑰匙
車子就會發動了

閒話

這才是我一篇的理想字數!!!


上一篇
[Day10] 多執行緒與同步問題
下一篇
[Day12] 論物件導向三本柱之二(繼承)
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言