Strong Guarantee using Transaction
Posted on April 29th, 2008 at 23:24 by fr3@K

Abrahams Guarantees

在 C++ 的世界裡, 正確的 exception handling 是專業的 C++ programmer 不可或缺的技巧. 雖然它的概念並不困難, 但實作起來卻常不見得那麼容易.

要做到正確的 exception handling, 首先必須要了解什麼是 exception safety. 一個需要與 exception 打交道的 component 可在其介面實作人稱 Abrahams guarantees 的三種 exception safety 保證之一:

  1. The basic guarantee
  2. 允許操作失敗時改變物件的狀態, 但不能有 resource leak. 且該物件的狀態必須是可靠的仍然可以被解構, 操作失敗後該物件的狀態可以是不完全能被預測的.

  3. The strong guarantee
  4. 操作後的狀態只能是成功完成, 或是將該物件回復到操作之前的狀態並拋出一個 exception.

  5. The no-throw guarantee
  6. 操作不會拋出 exception.

(more…)

del.icio.us:Strong Guarantee using Transaction digg:Strong Guarantee using Transaction spurl:Strong Guarantee using Transaction newsvine:Strong Guarantee using Transaction furl:Strong Guarantee using Transaction Y!:Strong Guarantee using Transaction 黑米共享書籤:Strong Guarantee using Transaction 推推王:Strong Guarantee using Transaction
拒絕 Singleton
Posted on December 12th, 2007 at 1:32 by fr3@K

去年我寫過一篇文章, 大意是在說 大多數人所使用的 Singleton 實作都是有問題的. 在文章靠近後面的部份, 我也介紹了一種較少為人知, 我常用在 lifetime 是全局但 scope 是局部的 (global) 變數的 Singleton 實作. 雖然這實作離 fool proof 還差得遠, 在使用者能夠正確地 include header 的情況下, 它可能已經是最接近 bullet proof 的實作了.

“好吧, 那我就用類似你的 Singleton 實作總行了吧!?” 先別急著動手改 code, 實作是容易更換的, 但使用 Singleton Pattern 的原因卻與更重要的介面, 甚至架構的設計思維息息相關. 工作的實務經驗以及本身的興趣研究讓我體會到, 大多數的情況下 Singleton 的使用是可以避免的. 在這些非必要情況卻依然採用 Singleton 的原因常是:

  • 沒把問題想清楚
  • 好玩
  • 因為有個叫作 Singleton 的 pattern

(more…)

del.icio.us:拒絕 Singleton digg:拒絕 Singleton spurl:拒絕 Singleton newsvine:拒絕 Singleton furl:拒絕 Singleton Y!:拒絕 Singleton 黑米共享書籤:拒絕 Singleton 推推王:拒絕 Singleton
WIN32 的 _TCHAR 與 std::wstring 的問題
Posted on November 20th, 2007 at 3:28 by fr3@K

我知道很多人一直是這樣做的, 可是我從沒搞懂為什麼在 windows 平台上, 用上了 _TCHAR, _TEXT 再 define 個 _UNICODE. 或是用上了 whar_t 與 std::wstring. 就能算是 Unicode 化的程式?
(more…)

del.icio.us:WIN32 的 _TCHAR 與 std::wstring 的問題 digg:WIN32 的 _TCHAR 與 std::wstring 的問題 spurl:WIN32 的 _TCHAR 與 std::wstring 的問題 newsvine:WIN32 的 _TCHAR 與 std::wstring 的問題 furl:WIN32 的 _TCHAR 與 std::wstring 的問題 Y!:WIN32 的 _TCHAR 與 std::wstring 的問題 黑米共享書籤:WIN32 的 _TCHAR 與 std::wstring 的問題 推推王:WIN32 的 _TCHAR 與 std::wstring 的問題
NULL 指標兩三事
Posted on September 16th, 2007 at 21:51 by fr3@K

最近被我面試的十來位應徵者, 除了一位之外, 都不清楚以下兩個 pointer to NULL (指向 0 的指標) 的基本特性:

  • delete 一個指向 NULL 的指標是安全的
  • 以一個指向 NULL 的 C-style 字串為參數呼叫 strlen 會造成死機 (segmentation fault, access violation or whatever)

(more…)

del.icio.us:NULL 指標兩三事 digg:NULL 指標兩三事 spurl:NULL 指標兩三事 newsvine:NULL 指標兩三事 furl:NULL 指標兩三事 Y!:NULL 指標兩三事 黑米共享書籤:NULL 指標兩三事 推推王:NULL 指標兩三事
Resource Management using auto_ptr - Not Always So Simple
Posted on September 6th, 2007 at 23:03 by fr3@K

接續兩個多禮拜前, 那篇 囉唆的開場

話說那天面試 A 君作答最後一題的過程中, 或許是 A 君作答的速度慢了. 突然想到自己沒有用過真實世界的例子仔細檢驗過我所謂好方法. 面試後想像了幾個狀況, 我的 C++ 世界開始出現烏雲…
(more…)

del.icio.us:Resource Management using auto_ptr - Not Always So Simple digg:Resource Management using auto_ptr - Not Always So Simple spurl:Resource Management using auto_ptr - Not Always So Simple newsvine:Resource Management using auto_ptr - Not Always So Simple furl:Resource Management using auto_ptr - Not Always So Simple Y!:Resource Management using auto_ptr - Not Always So Simple 黑米共享書籤:Resource Management using auto_ptr - Not Always So Simple 推推王:Resource Management using auto_ptr - Not Always So Simple
Resource Management using auto_ptr - Intro
Posted on August 19th, 2007 at 2:14 by fr3@K

周五下午在新上任的工作進行了第一次面試. 被面試的這位應徵者 (就稱為 A 君吧) 已有三年以上在工作上使用 C++ 的經驗, 對自己的 C++ 能力的評比給的是熟悉 (還沒到精通) . 在聊了可能一個鐘頭左右後, 他表示自己寫程式很少發生 memory leak, 卻又舉例不出具體作法, 只表示這是經驗與習慣使然. 針對這點, 我在白板上出了個題目:

    class foo {};
    class bar
    {
      foo* fp_;
    public:
      bar(foo* fp)
      : fp_(fp)
      {
        // ....
      }
      ~bar()
      {
        delete fp_;
      }
    };
    
    bar* create_bar()
    {
      foo* fp = new foo;
      return new bar(fp);
    }
    

    假設你是負責維護 create_bar 的 programmer. 並且, 呼叫 create_bar 的使用者一定會記得 delete 掉被該 function new 出來的 instance . 請問 create_bar 這個函數有沒有潛在的 leak? 如果有, 可以如何改善?

(more…)

del.icio.us:Resource Management using auto_ptr - Intro digg:Resource Management using auto_ptr - Intro spurl:Resource Management using auto_ptr - Intro newsvine:Resource Management using auto_ptr - Intro furl:Resource Management using auto_ptr - Intro Y!:Resource Management using auto_ptr - Intro 黑米共享書籤:Resource Management using auto_ptr - Intro 推推王:Resource Management using auto_ptr - Intro
給留言朋友的 Mini HTML 教學與建議
Posted on May 27th, 2007 at 1:47 by fr3@K

最近一些朋友在我這邊留言, 貼出來的結果常常不如預期. 我也是過來人, 很清楚他們雖然都是 programmer, 但其實對 HTML 並不熟悉. 就跟我一開始寫這個 blog 的時候一樣. 現在的我當然比以前好多了, 勉強還有一兩樣東西可以拿出來與其他人分享.
(more…)

del.icio.us:給留言朋友的 Mini HTML 教學與建議 digg:給留言朋友的 Mini HTML 教學與建議 spurl:給留言朋友的 Mini HTML 教學與建議 newsvine:給留言朋友的 Mini HTML 教學與建議 furl:給留言朋友的 Mini HTML 教學與建議 Y!:給留言朋友的 Mini HTML 教學與建議 黑米共享書籤:給留言朋友的 Mini HTML 教學與建議 推推王:給留言朋友的 Mini HTML 教學與建議
Avoid Pointer Parameters and Inheritance
Posted on May 22nd, 2007 at 23:16 by fr3@K

Preamble

Microsoft 的 MFC 是最早被大量採用 (massive adoption) 的 C++ library 之一. 等到我開始接觸 C++ Standard Library 這東西都已經是玩了兩年 MFC 以後的事. 還記得, 從一開始對 MFC 的讚嘆與擁抱, 幾年後對它的不屑, 到更後來的理解 (理解不好其實也是有原因的).

即便不少 programmer 知道 MFC 是一套瑕疵遍佈的 library, 可能也知道那些地方有問題. 但它以及部份其他 library 聯手對於更多 C++ programmer 造成的傷害已經留下不容易抹滅的痕跡. 它讓許多 programmer 以為這些東西本來就該這樣 (that’s the way things supposed to be), 當有一天這些被誤導的 programmer 有機會可以選擇另一套 library 或是自行設計的時候, 很容易就陷入 MFC 帶給他們已先入為主的錯誤觀念.
(more…)

del.icio.us:Avoid Pointer Parameters and Inheritance digg:Avoid Pointer Parameters and Inheritance spurl:Avoid Pointer Parameters and Inheritance newsvine:Avoid Pointer Parameters and Inheritance furl:Avoid Pointer Parameters and Inheritance Y!:Avoid Pointer Parameters and Inheritance 黑米共享書籤:Avoid Pointer Parameters and Inheritance 推推王:Avoid Pointer Parameters and Inheritance
Minimizing Function Scope
Posted on May 13th, 2007 at 6:45 by fr3@K

Intro

C++ 函數可以根據用途放在 (宣告/定義) 不同的 scope. 一個 function 可以是 free function, member function 或是 static member function. 它們不但可以被放在指定的 namespace 裡面. 後兩者更可被賦予 public, protected 或 private 的存取控制 (access control). 這篇要談的不是這些 function 的不同, 更不是三種存取控制的差異. 而是要談如何決定一個 function 該被宣告在哪裡.

過度使用 C++ 的 language feature 可說是在 C++ 程式中常見到的毛病. 即便是有數年經驗的程式設計師所寫出來的程式也會有這樣的問題. 其中, 最容易犯下的, 也是最難抗拒的誘惑之一是 - 沒有充分的理由, 就把 function 擺在不恰當的 scope (通常為會導致更多 coupling 的 scope). 譬如說, 把因為某個 class 而寫的 function 宣告為該 class 的 (static) member function.

(more…)

del.icio.us:Minimizing Function Scope digg:Minimizing Function Scope spurl:Minimizing Function Scope newsvine:Minimizing Function Scope furl:Minimizing Function Scope Y!:Minimizing Function Scope 黑米共享書籤:Minimizing Function Scope 推推王:Minimizing Function Scope
Working with Region and Rectangle in Emacs
Posted on April 18th, 2007 at 16:22 by fr3@K

Intro

Emacs 的 region 與 rectangle 是兩種常用的範圍選取方式. 兩者都可以把選取的部份暫存在 kill ring 與 register (Emacs 的 兩種暫存機制) 裡. 通常 register 多被用在暫存 rectangle, 而 kill ring 幾乎都是與 region 一起搭配使用. 這兩種組合用法不一樣. 要是沒有好一點的方法, 要熟悉兩者的操作還真不是件容易的事情.

(more…)

del.icio.us:Working with Region and Rectangle in Emacs digg:Working with Region and Rectangle in Emacs spurl:Working with Region and Rectangle in Emacs newsvine:Working with Region and Rectangle in Emacs furl:Working with Region and Rectangle in Emacs Y!:Working with Region and Rectangle in Emacs 黑米共享書籤:Working with Region and Rectangle in Emacs 推推王:Working with Region and Rectangle in Emacs

Page 1 of 3[ 1 ]23»