2020年4月20日 星期一

白話設計原則

  • 里氏替換原則(Liskov Substitution principle)
    是對子類別設計的勸說或約束,要求在不修改使用端的程式演算法之下,使用到父類別實例的地方,改用子類別的實例去替代,都不會出錯

  • 依賴反轉原則(Dependency inversion principle,DIP)
    古老以前,要設計上層的的功能,得須了解下層元件有哪些功能再針對這些元件去設計,設計完之後,上層就被這些元件綁死了,上層強烈依賴下層,而且耦合度非常高。後來改成要下層去依照上層的需求來設計元件,所以才叫依賴反轉。
    不過現在一般都是依賴在一個介面,上層依介面提供的功能來使用,下層依介面設計提供服務的元件,而且耦合度降低。而介面標準也成了兵家必爭之地。

  • 開閉原則(對擴展開放,對修改封閉)
    概念上是說一個類別設計完成之後,就不應再去更動它,若要增加新功能,應該用繼承或組合去擴展,也就是說用擴展代替修改。

  • 封裝變化
    是指須要修改程式碼的部份獨立出來,通常都用策略模式來解決

  • 單一職責原則(Single responsibility principle)
    簡單地說就是類別的合理分割,但問題就在怎樣分割,分割到怎樣的程度才叫合理,十個人做十個都不一樣,只能說設計時要盡量考量清楚,途中有發現不適合也要大膽改正,畢竟日後的維護要比設計時花更多的精神和時間

  • 介面隔離原則(英語:interface-segregation principles)
    對於特定的使用端(角色)只提供符合它的介面給它用就好,實際運作的物件不要暴露給它。


2020年3月3日 星期二

莫名其妙的問題

以下程式使用 MinGW 8.1.0 64位元版(x86_64-posix-seh) 編譯

採用 Release 和 Debug 兩種模式編譯的執行結果不一樣(另人傻眼)

本來想說是不是編譯器的 bug,但有以下的訊息:
the compiler can assume that the address of 'p' will never be NULL [-Waddress]

更另人傻眼了

2020年2月21日 星期五

武漢病毒酒精稀釋公式推導

由於 75% 消毒用酒精缺貨,若能拿到 90% 清潔用酒精來稀釋也是個辦法,不過不可以直接使用自來水,而是要用 RO 過濾水。以下是稀釋公式的推導。

首先須釐清問題已給出的相關資料:
  1. 溶液(Solution)是指含有溶質(Solute)和溶劑(Solvent)的混合物,即
    溶液 = 溶質 + 溶劑
  2. 溶度(Solubility) 為 $\frac{溶質}{溶液} \times 100\%$

2020年1月15日 星期三

打造在 Win10 的 C++ 編譯環境

此文有點像廢文,因每人須求不同,所以做法也不一樣,所以只能說給大家作為參考。

這裡用的編譯器是 MinGW 系列,可到這裡下載,至此文發佈時間為止,提供了如下最新的版本:
▲MinGW 各版本列表

2019年5月18日 星期六

LifeCustody 物件終結插件

CxxlMan2 程式庫的核心主要建構在垃圾回收(Gabage Collector)機制,藉由 cxxlObject 和 Smart_Ptr 的相互搭配,達到 cxxlObject 物件無 Smart_Ptr 持有時就會自動銷毀,但若有某些原因,要讓物件不想被繼續使用了,如何通知各 Smart_Ptr 放棄持有呢?這個插件就為了達成這樣的目的。

下載點:
LifeCustody_Src_20200430.zip

2018年10月26日 星期五

插件成了 header only 的罩門

什麼是 header only? 可以先看此文了解一下 http://zevoid.blogspot.com/2012/04/c11-extern-template.html

簡單的說,header only 是把一個 class 的程式碼就包含在這個 class 中,而這個 class 就放在引入檔(.h)中供大家使用。有別於引入檔只放 class 介面,程式碼則放在 .cpp 中。

header only 的好處是執行快,因一大部份的函數可以用 inline 的方式呼叫,另外也不用再加 .cpp 或是還要連結程式庫(lib 或 dll)。

但有一個不得不面對的問題,class 的程式碼因不放在特定的 .cpp 中,那麼使用它的模組(exe、lib、dll)都得編譯出各別的執行碼,一般來說除了程式會比較胖之外,也沒有其它不好的影響。但是遇到插件就出問題了。

插件是一個 dll 檔,特點是要用的時候才載入,不用的時候可以卸載,但若某一個 class 產生的物件,其執行碼在那個被卸載的 dll 中,就會出大問題了,以下範例程式就是在演示這種情況。