包含標籤 w3HexSchool 的文章

菜雞與物件導向 (15): 最少知識原則

上一篇我們紀錄了依賴反轉原則,到此五大原則介紹完畢…是這樣嗎?太天真了!就像四天王總是五個人一樣,五大原則當然也有第六個!

今天的主角就是五大原則中L位的第一候補:最少知識原則,也被稱作迪米特法則

最少知識原則 (Least Knowledge Principle)

只和直接的朋友溝通,不和陌生人說話

那麼所謂的朋友是什麼呢?就是指這個物件或方法有直接相關的物件啦。例如當我們使用一個方法時,這個方法應該只認識:

  • 該方法所屬的類別
  • 該方法所接收的參數
  • 該方法中建立的類別
  • 該方法所屬的類別所依賴的對象

除此之外對這個方法而言都是陌生人。什麼情況會遇到陌生人呢?有一個蠻常遇到的狀況就符合定義:當我們使用依賴對象的方法,該方法給了我們另一個類別時,我們就正在接觸毫無關係的陌生人。

……

閱讀全文


菜雞與物件導向 (14): 依賴反轉原則

在聊依賴反轉之前,先讓我們聊聊什麼是依賴,所謂的依賴就是一種「受到某個東西影響、牽制」的狀態。

例如說如果有個像我一樣的肥宅每天一定要來一片雞排才能療癒身心,那我就是依賴雞排;
同樣的,如果有個大叔不抽菸就會全身不舒服,就是對香菸有所依賴。

當有「必須要藉由某個人事物來達到目的」的狀況時,就是依賴。

而在程式設計裡面的概念也差不多,如果A模組直接受到B模組的影響,我們就稱A依賴了B,最明顯的狀況就是A模組需要藉由B模組的實例來完成某個功能的時候。

例如「匯出報表」功能建立了一個「Excel 控制類別」的實例以建立檔案;
或是「會員查詢」功能建立了一個「DB 連線」的實例來進入資料庫取得會員資料

遇見這種「必須要藉由某個模組的實例來完成想要的動作」的狀況時,就是依賴。

依賴與耦合

我們在之前的 耦合篇 提過,如果模組和另一個模組之間有關連,那這兩者之間就耦合。以此來看,依賴就是一種耦合的關係,那麼,依賴是健康還是不健康的耦合呢?

現在讓我們用 多型篇 用過的「老闆徵工程師」的例子來舉例一下:現在有間小小公司,老闆請來了小明當工程師,並請他開工撰寫產品程式碼。

當「撰寫產品程式」對「工程師」直接依賴的時候,狀況可能是這樣的:

public Product Work()
{
    Ming programmer = new Ming();
    var product = programmer.Programming();
    return product;
}

過一陣子,老闆發現小明寫出來的東西似乎不太行,於是把小明趕走,另外請了小華。這時候因為「工程師」這個實作類別不一樣了,我們就必須要改一次程式碼:

public Product Work()
{
    Hua programmer = new Hua();
    var product = programmer.Programming();
    return product;
}
……

閱讀全文


7+ Taskbar Tweaker —— 簡單方便的 Windows 工作列調整工具

故事是這樣的——

Win10 工作列的合併設定有這些選項:

當選擇「一律、隱藏標籤」時,工作列上同樣的程式就會摺疊起來:

而「永不」和「當工作列滿時」則會將工作列展開:

好的,那麼像我個性這麼麻煩的人,如果覺得顯示名字很佔位置,可是又不想要摺疊之後按兩次才能打開我要的應用程式,偏偏又很愛開一整排 IDE 的話,有沒有什麼簡單的辦法不要讓圖示合併,但也不要顯示名字呢?

如果有個小工具,可以讓這些工作列的設定更彈性就好了,會有嗎?

……

閱讀全文


讀《離開公司,我過得還不錯》

無論喜不喜歡自己的工作,都應該好好思考自己和工作的關係,畢竟每天花三分之一的時間做這件事,如果和它處得不好,人生也不可能會變好。

這本書並不是那種精神勝利法,又或是超猛接案全攻略之類的書;反而給我的感覺比較像是作者藉著這本書,分享他這一路摸索的心得,和遭遇到的一些困難,看的時候有種像在和作者聊聊天的感覺。

也因為這本書比較接近作者分享他選擇的道路、內容比較廣雜,遇到的部分都稍微說一些,但不是那種針對某個議題深入探討的書籍,所以比較適合想稍微了解自由工作的朋友閱讀。同時也必須了解到,自由工作者也只是眾多職業道路的其中一種,每個人的條件也不盡相同,因此抱持著好奇的心情閱讀,會更有收穫的感覺。

博客來 的書籍簡介就可以看到,目錄真的把自由工作遇到的議題都碰了一些:從適不適合接案工作,到報稅、勞保、合約、工作場所都聊了一點。因為真的挺廣的,這邊我就只記錄一些我比較感興趣的話題。

……

閱讀全文


菜雞抓蟲: 在 Amazon Linux AMI 安裝 .net Core 時卡在 Requires: openssl-libs

最近遇到在 Amazon Linux AMI 要安裝 .net Core 3.1 環境的時候,會一直跳出
Requires: openssl-libs 而無法安裝的問題,儘管明明已經有 openssl 了,但還是解析失敗找不到依賴,過程一直碰壁,因此在這邊紀錄一下。

過程中嘗試了安裝 openssl-libs(會找不到該套件)、下載 Dotnet 的 tar.gz ,再直接對執行檔下 Dotnet 指令起站台(雖然網站起得來,但執行者會是當下的登入身分,也就是 ‘’@連線進來的IP-伺服器位置,而非由本機執行。後續如果有連線資料庫等檢查權限的地方就很容易出錯)

最後在 Dotnet Core 的 issue 翻到這篇 Cannot install .NET Core 2.0 on Amazon Linux AMI 才成功解決。

首先先將 openssl-libs 的 SPEC 抓下來,然後給 RPM 建置一下。這兩句可以參考一下這篇 RPM 打包︰由一竅不通到動手濫用 (二) 的說明。

wget https://github.com/dotnet/core/files/2186067/openssl-libs-ami.spec.txt
rpmbuild --bb openssl-libs-ami.spec.txt
……

閱讀全文


菜雞與物件導向 (13): 介面隔離原則

今天要記錄的是介面隔離原則,顧名思義是和介面高度相關的原則。因此在閱讀本篇之前,可能需要先對 介面 有一點了解呦。

事情就從上一篇 里氏替換原則 的鳥類物流公司開始說起。老闆痛定思痛,決定先用介面先規定好物流士們的應徵條件,例如裝貨、卸貨、飛行、必須有帥氣的喙等等。

這道命令下來後,倉庫們的企鵝都慌了,來檢查的編譯器瘋狂跳出 Error:「您未實作 IBird 的 Fly() 方法!」這下怎麼辦呢,為了要保住飯碗,企鵝們就必須實作出飛行才行,可是企鵝真的就不會飛呀!

這下子企鵝們只剩下兩個選擇:不實作飛行,但是就不能被當成物流士,最後就會被開除;或是……空實作。

public class Penguin : IBird
{
    public void Fly()
    {
      // Do nothing;
    }
}

企鵝們終於騙過了編譯器檢查員,然而當送貨的命令下來之後,企鵝們再一次卡在倉庫門口發呆,最終物流公司仍然踏上了虧損的老路,再度面臨倒閉危機…

……

閱讀全文


Dark Reader —— 暗黑模式愛好者的 Chrome 必備套件

不能信任那些 Terminal 或編輯器用白底的人。
—— JokeKappa

這禮拜推薦了個常用的 chrome 套件給同樣喜歡黑色背景的同事,這邊也推薦給大家。

絕對不是因為隻狼更新了不小心砍太爽,結果來不及寫介面隔離只能介紹套件水一下,Heiya~

今天要介紹的就是這款 Dark Reader,這是我用 chrome 時首選的暗黑模式擴充套件,在俺寫文的這時候已經超過了三百萬次的下載次數,現在就讓我來記錄一下這款擴充套件的一些特色唄。

……

閱讀全文


菜雞與物件導向 (12): 里氏替換原則

里氏替換原則 (Liskov Substitution Principle)

子類別必須能夠替換父類別

里氏原則還包含了一個概念:子類別替換父類別後,不需要改變,也不會發生任何錯誤或異常

從定義就可以看出來,這項原則是來替我們處理繼承問題的。因此,在開始本篇之前,可能需要先對 繼承 以及 多型 有基本的認識。如果可以的話,也請先看過 介面

那麼,就讓我們從很久很久以前開始說起…

我的子類別進入叛逆期了,怎麼辦?

很久很久以前,有一間公司受到 鴿子封包 所啟發,打算發展鳥類運輸技術,強勢打入無人機市場,用生物智慧掀起對人工智慧的革命。既然鳥類都會飛行,理所當然可以藉由飛行來進行空運,甚至還可以偷偷擊墜那些無人機對手,野心勃勃的老闆立馬徵了一批鳥類物流士,打出「凡是鳥類都可應徵」的旗號,各式各樣的猛禽響應而來,一時之間掀起整個物流業的風暴!

但是好景不常,公司營運之後發貨狀況不佳,頻繁發生丟包問題,甚至有些貨根本就出不了倉庫,虧損越來越大,心急如焚的老闆下令徹查,這才發現—

……

閱讀全文


菜雞與物件導向 (11): 開放封閉原則

開放封閉原則 (Open-Close Principle)

軟體實體(類別、模組、函式等等)應該對擴展開放,而對修改封閉

在我們了解什麼是「對擴展開放」和「對修改封閉」之前,先讓我們談談:什麼是擴展,什麼又是修改呢?

用白話一點的方式來形容,修改就是把東西拆開來改,像是手術;而擴展就是對東西額外加裝模組,像是添購設備。我們用飛行來舉例,像是鳥類直接用翅膀飛行,如果有需要修改飛行方法的話就得對鳥直接進行手術;但如果今天是一個裝備了噴射背包的人,我們只需要把噴射背包換成噴射鞋子、甚至噴射翅膀就可以了,不需要去修改人這個本體。

這邊可以發現開放封閉原則是針對「改變的時候」去做一個行動的建議,例如需求追加和變更等等。凡是變化都有成本,例如變動的難易度、變動造成的影響範圍等等都會影響到成本,若是程式碼冗長、內部邏輯複雜,類別之間互相耦合、影響範圍很廣,導致綁手綁腳或壞東壞西等等狀況,使得修改很困難,成本就會變高,進而使得開發效率變低。

然而,軟體並不是製造完畢就完工的東西,而是隨需求而生、隨需求而變的動態作品,因此程式碼的修改或重構相當頻繁。就像我們在 內聚耦合篇 提過的:軟體面對改變的能力,就像基因適應環境並生存下去的能力。因此,程式必須具有彈性,也就是需要盡可能降低修改的成本。

那麼讓我們回到前面:動手術跟換道具,哪個的成本比較高呢?

面對需求,對程式碼的改動是透過增加新程式碼進行的,而不是更改現有的程式碼  
(《大話設計模式》)

……

閱讀全文


菜雞的 Markdown 筆記

Markdown 是一種寫作用語言,特色是只要用簡單的符號就可以替文章進行排版,例如 # 就代表了標題,因此能相當簡潔迅速地應用 Markdown 語法來撰寫出文件,目前已經被廣泛使用在各個撰寫文章或是文檔的場景中。

例如 Github 用來說明專案的 Readme.md,從副檔名 md 就已經告訴你這是一篇 Markdown;又像是這個部落格的文章,也都是使用 markdown 來寫的。除此之外,像是 Facebook 和 Line 都開始支援簡單的 Markdown 語法了 —— 因為它實在是太方便好用了。

使用Markdown格式撰寫的文件應該可以直接以純文字發佈,並且看起來不會像是由許多標籤或是格式指令所構成 —— markdown.tw

既然用簡單的符號就能完成這些簡潔的排版,我們自然就能把專注的重心挪回到撰寫文章本身,這也就是 Markdown 最大的魅力:專注於內容

也因為 Markdown 的特色就是非常的簡潔乾淨,文檔本身的可讀性就相當的高,撰寫起來也很直覺容易。就如同其說明文件所說的:「Markdown 的目標就是實現『易讀易寫』」

這篇就來稍微紀錄一下 Markdown 的常用語法和好用的編輯環境吧!

……

閱讀全文