1. 泛型 + Singleton Patterns (II)

    上篇因為貼 code , 放一起實在太長了, 只好分兩篇... 吊完胃口, 不囉唆了, 直接看我想出來的解法. 原則還是跟一般的函式庫一樣, 我希望先做出一個 base class, 把 singleton 的實作細節都處理掉, 函式庫的目的是讓使用你 lib 的人會很快樂才對, 因此 base class 可以辛苦點沒關係, 但是絕不能讓用你 code 的人得做苦工...

    好了, 我實做出來的版本, code 如下:

        7     public class GenericSingletonBase<T>

        8         where T: GenericSingletonBase<T>,

        9         new()

       10     {

       11         public readonly static T Instance = new T();

       12     }

    沒看錯, 就是只有這幾行... 接下來貼的 code 是, 如果我自己要實作 singleton pattern 的 class 時, 該如何來用這個 lib:

       14     public class GenericSingletonImpl1

       15         : GenericSingletonBase<GenericSingletonImpl1>

       16     {

       17         public GenericSingletonImpl1()

       18             : base()

       19         {

       20             Console.WriteLine("GenericSingletonImpl1.ctor()");

       21         }

       22     }

    扣掉非必要的 constructor, 其實 class 繼承的部份寫完, 就沒有其它必要的 code 了, 很好, 又滿足了我一個要求...

    再來就剩最後一個, 要用這個 class 的 code 會不會像上一篇的例子一樣醜? 每次都要自己 casting ? 再看一下 code ...

       21             GenericSingletonImpl1 o1 = GenericSingletonImpl1.Instance;

       22             GenericSingletonImpl1 o2 = GenericSingletonImpl1.Instance;

       23             GenericSingletonImpl1 o3 = GenericSingletonImpl1.Instance;

    很好, 收工... 哈哈... 謝謝大家的收看 [:D]

    2006/10/27 系列文章: 泛型 + Singleton Patterns .NET

  2. 泛型 + Singleton Patterns

    聽起來 singleton 跟 generic 好像搭不上邊, 不過搭配 .net framework 2.0 的 generic 機制, 倒是可以讓 singleton 好做很多... 我先簡單寫一下不使用 generic 時的做法...

    只有單一 class 要實作 singleton 很簡單, 只要寫這樣的 code 就可以:

        7     public class SampleSingletonClass

        8     {

        9         private static SampleSingletonClass _instance = null;

       10         public static SampleSingletonClass Instance

       11         {

       12             get

       13             {

       14                 if (_instance == null)

       15                 {

       16                     _instance = new SampleSingletonClass();

       17                 }

       18 

       19                 return _instance;

       20             }

       21         }

       22 

       23         private SampleSingletonClass()

       24         {

       25             //

       26             //  ToDo: constructor code here.

       27             //

       28         }

       29     }

     很標準的 code, 不是嗎? 不過問題來了... 當我有第二個 class 也要套用 singleton patterns 時, 幾乎一樣的 code 就得再抄一次, 只因為 public static XXX Instance; 這個 static property 的型別不一樣, 很討厭...

    這堆看起來差不多的 code 想要省掉, 那只好動點手腳, 用繼承的技術解決, 不過問題又來了, 型別的宣告... 就像一堆 Collection 物件一樣, 傳回型別宣告為 object 就好了, 不過這樣的 code 用起來實在麻煩... 寫起來就像這樣:

        8     public class SingletonBase

        9     {

       10         public static SingletonBase Instance(Type seed)

       11         {

       12             if (_singleton_storage[seed] == null)

       13             {

       14                 _singleton_storage[seed] = Activator.CreateInstance(seed);

       15             }

       16 

       17             return _singleton_storage[seed] as SingletonBase;

       18         }

       19 

       20         private static Hashtable _singleton_storage = new Hashtable();

       21     }

       22 

       23     public class SingletonBaseImpl1 : SingletonBase

       24     {

       25         public SingletonBaseImpl1()

       26             : base()

       27         {

       28             Console.WriteLine("SingletonBaseImpl1.ctor() called.");

       29         }

       30     }

       31 

       32     public class SingletonBaseImpl2 : SingletonBase

       33     {

       34         public SingletonBaseImpl2()

       35             : base()

       36         {

       37             Console.WriteLine("SingletonBaseImpl2.ctor() called.");

       38         }

       39     }

    看來不怎麼漂亮? 不過看在重複的 code 只寫一次就好的份上, 醜一點關起門來就看不到了. 不過這樣就沒事了? 不... 用起來更醜... [:'(]

       11             SingletonBase.Instance(typeof(SingletonBaseImpl1));

       12             SingletonBase.Instance(typeof(SingletonBaseImpl1));

       13             SingletonBase.Instance(typeof(SingletonBaseImpl1));

       14 

       15             SingletonBase.Instance(typeof(SingletonBaseImpl2));

       16             SingletonBase.Instance(typeof(SingletonBaseImpl2));

       17             SingletonBase.Instance(typeof(SingletonBaseImpl2));

     

    實在無法接受這種 quality 的 "class library" ... 這種 code 看起來一點美感都沒有, 就像文筆不好的人在寫文章一樣...

    處女座的個性, 實在不能容忍這種 code 出現在我的 project 裡... 碰到這種問題, 直覺的解決辦法就是:

    1. 透過 inherence, 把這些重複的 code 集中到 super class 一次解決
    2. 同樣邏輯, 要套用到不同型別的應用, 就用 generic 的方式處理

    不過要實作還沒那麼簡單, 試了半天, 總算找出一種看起來最得意的解法... <待續>

    2006/10/26 系列文章: 泛型 + Singleton Patterns .NET

  3. Microsoft Windows XP Media Center Edition 2005

    最近裝了台 PC, 灌了 MCE 2005 ... 用起來只有一個字... 爽!!!

    最近台灣引進了 TiVo 這套系統, 應該不少人聽過吧? PC + TV card + MCE2005 就是像 TiVo 這樣子的東西, 只不過都是 Microsoft 靠一堆軟體弄的... 不用額外買專用的機器, 也不用像 TiVo 要付月租費...

    用起來如何? 就是用電腦看電視而以, 我沒有接在電視上, 而是直接用 LCD monitor 看, 爽度差了點, 不過我也習慣了, 我們家都是用 monitor 在看電視... 哈哈. 用 MCE 跟一般 TV card 付的軟體看電視, 差別蠻大的... 我列幾個我覺的特別好用的地方:

    1. Microsoft 的軟體很多人覺的不怎麼樣, 不過再怎麼樣也比電視卡廠商寫的軟體強多了...
    2. Microsoft 提供線上的節目表更新, 因此選台爽多了, 第幾頻道名字是啥, 現在播的節目是啥, 還有節目簡介通通都有了...
    3. 有節目表後, 預約錄影也簡單多了, 選節目按錄影就搞定, 連續劇也是選好後直接幫你把每一集都錄下來
    4. Time Shift, 節目看一半可以隨時按暫停 or 倒轉, 要上廁所倒飲料不用等到廣告...
    5. 錄到硬碟, 要看要刪很方便
    6. 電腦沒用會自動進入待機狀態, 預約錄影時間到時會自己醒來開始錄...

    其它當然有一堆好處, 我就不提了, 反正我也用不到... 如果以後買了 LCD TV, 我一定要擺台電腦在旁邊.. [:D]

    抓幾張畫面...

     

    預約錄影清單... 當然節目的相關資訊都在裡面.

     

    節目表... 左下角會用PIP方式顯示目前正在播放的節目畫面..

     

      

    播放畫面, 我錄的 "超人特攻隊" ... 它的操作界面都是特別針對電視能看的清楚的畫面, 還有都是能搭配搖控器操作... keyboard / mouse 不是必需品.

     

    選台時下方會出現的頻道 and 節目資訊..

     

     

     

    Orz, 這篇是勸敗文嘛...

    2006/09/25 有的沒的

  4. Canon PowerShot G7 出現了...

    期待了半天的G7, 等著把用了多年的G2換掉的新機, 沒想到這麼令人失望...

    早就有要換掉G2的打算了, 不過一直找不到合適的機種, G2其實我用的很滿意, 只是有些地方還是可以改進改進...

    1. 專用電池太麻煩 (換成3號電池最好)
    2. CF card可以換一換了, 現在的SD比CF划算 and 好用的多
    3. 拍Video的功能我很需要, G2的video實在遜了點

    不過想要保留的優點有:

    1. 可以外加閃光燈, 這個太重要了... 室內跳燈一打, 隨便照都很漂亮 [H]
    2. 翻轉LCD
    3. 有搖控器
    4. 大光圈 (F2.0)
    5. RAW support
    6. Canon 的操作方式用慣了, 比它牌的好用

    之前認真的考慮過 Canon S3 IS, 不過缺了 (1), 其它都還可以接受, 就這樣龜下來了, 想說還是等 G 系列的出來再說吧, 沒想到這次 G7 改了一堆, 跟本不像 G 系列了...

    缺點 (1) 還在, (2) (3) 沒了, 而優點 (2) (3) (4) (5) 全沒了, 額外多的好處都是對我不大重要的...

    1. Face Detect, 會自動偵測畫面中的臉來測光對焦...
    2. 1000 萬像素 (6mp 1/2.5", 10mp 1/1.8", 換算起來 CCD 的密度差不多, 同樣技術的話, 畫質半斤八兩吧... )
    3. Digic III chip

     

    看了真是 Orz, 看來我要換的話, 目前最合適的機種還是 Canon PowerShot S3 IS 吧... G7 就不考慮了, G8 ? 看看我撐不撐的到 G8 現身.. 哈哈.. 反正這篇沒啥目的, 純脆發發牢騷用的, 我都是隨時鎖定要買的東西, 不過啥時買? 就看啥時有敗家的衝動了...

    2006/09/25 有的沒的

  5. Windows Live Writer...

    看起來真不錯啊, 感謝小熊子提供情報, 這樣用起來真舒服...

    像 e-mail 一樣, 打完之後直接傳到網站上... Web based HTML editor 做的再好, 就是不如一個簡單的 editor ap 方便..

    補張圖爽一下... [H]

    2006/08/16 有的沒的