2014-04-26

2014-04-25

2014-04-24

[讀書筆記] The Practice of Programming - Portability

Portability 
SlideShare上的投影片分享



Why do we worry about portability? 
1. Less maintenance and more utility

2. Environments change
    環境會變 OS會升級

3. A portable program is a better designed program
    同意 一個可移植性的程式 本身抽象化的程度也比較高 設計上會比較好

程式語言
1. 照著標準走 

2. 照著主流走

3. 注意各data type的size 但彼此的 size關係不脫離下列
    sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)
    sizeof (float) <= sizeof (double)

4. 賦值的順序不一定一樣 n = (getchar() <<8) | getchar()
    左邊的getchar()不一定先叫用

5. 注意char的 sign or unsign

6. 注意Struct的size, 計算大小請直接用Struct來計算, 不要用變數相加的方式
    Yes => sizeof (struct X)
    No  => sizeof (char) + sizeof(int)

7. Try several compilers
    既然考慮移植性 就在不同的compiler間 compile看看吧

Headers and Libraries
1. 使用標準lib

2. Header若太肥太亂 請把共同的程式碼抽出來 針對不同環境 把不同的Header集中
   換句話說 共同的程式碼應該在不同環境下都能使用 但是針對不同環境的Header Files 請將它們抽出放到各自的環境上 

3. 如果你取的變數名稱跟標準lib Header定義的一樣 你的名稱會被header汙 染 但是不要跟標準抗爭 請使用別的名字繞過去 

Program Organization
有兩種方法能達到移植性
1. Union
    利用條件式編譯 把所有環境的可能性放在一起
2. Intersection
    抽出共同的部分 根據不同環境塞不同header 作者相當討厭條件式編譯 認為這造成maintain上的困難 

如何避免條件式編譯 看看是否真的有其必要 

Isolation
1. 老話重彈 針對不同環境客製化不同的files
2. Hide system dependencies behind interfaces 盡量抽象化 例如 The I/O Libraries : 我們只會知道Read Write等 最底層最依賴OS的實作放在各語言中
3. 盡量使用Standard Language Library 而不是WINAPI

Data Exchange
作者贊成直接用String做資料交換

Byte Order
有時無可避免使用Binary Data
事實上Binary Data 也比較快比較小 但要注意 little-endian 跟 big-endian的問題
重點是 Sender跟Receiver要講好格式

Portability and Upgrade
1. Change the name if you change the specification 
   若改規格就改名字吧 Name要名副其實
2. Maintain compatibility with existing programs and data 
   要跟舊版保有相容性 就像Java每一版都還會留著舊版API 但在JDK中會註明不建議使用

Internationalization
1. 不要假設ASCII
    用Unicode吧 再用UTF-8轉 c/c++ 就用Wide characters吧
2. 不要假設English
    可以像趨勢的作法 將wording跟UI都抽出 到時方便替換

2014-04-23