• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-90  評論-947  文章-0  trackbacks-0

            我的觀點可能有點激進,我覺得單件模式啥也不是,純粹是個全局變量的貞潔牌坊而已。全局變量如果有必要,用就用了,何必偽裝;如無必要,就算穿上單件模式的馬甲,到頭來也會搞得一片狼籍——隨處可見GetInstance。

            歡迎討論~

            posted on 2010-03-29 10:58 溪流 閱讀(4468) 評論(63)  編輯 收藏 引用 所屬分類: C++

            評論:
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 11:43 | 空明流轉
            單間的實例限定和訪問可控,你能global做到撒?盡白扯。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 11:48 | 溪流
            @空明流轉
            沒白扯。
            如果要限定單一實例,這個類實際上需要是個靜態類。

            訪問可控?我就不懂了,,單件模式訪問哪里可控?  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 12:21 | 陳梓瀚(vczh)
            @空明流轉
            最容易的辦法就是

            [ShitOperator.h]

            class IShitOperator
            {
            public:
            virtual void DoShit()=0;
            };

            extern IShitOperator* GetShitOperator();

            //--------------------------------------------------------
            [ShitOperator.cpp]

            class ShitOperator : public IShitOperator
            {
            ..
            } shitOperator;

            IShitOperator* GetShitOperator()
            {
            return &shitOperator;
            }

            -------------------------------------------------------------

            我TM就不知道一個單件哪來那么多問題,拿一個純虛類一套,不管三七二十一你用沒用到反正我在main之前先創建好了,還有那么多亂七八糟的鎖啊,private constructor什么的干嘛呢。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-29 12:34 | x
            只是一個構建模式而已,如果到處都是,你可以提交一個反模式  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 12:35 | 風雷云雪電
            就C++來言,全局變量和單例是差不都,不過單例相對于全局變量來說,程序員不容易出錯,程序員有可能重新實例化一個類而不是使用全局變量。
            在其他語言中如Java,C#,單例是非常有必要的  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:07 | 溪流
            @風雷云雪電
            就C++而言,如果是不得不用的全局數據,那么它應該早早的就被規定好了的,而且只要做到不跨文件使用,出錯的幾率并不大。如果只能有一個實例,那么這個class可以靜態化。如果不許實例化,可以private掉ctor。

            對于java,C#,單例又體現在哪里?C#已經支持了 static class 的寫法了  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:12 | 溪流
            @x
            因為我看到挺多地方都說單例模式如何如何了得,但是想不通,所以有此感慨。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:13 | 溪流
            @陳梓瀚(vczh)
            例子看懂了。但我看不太明白你的觀點,呵呵  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:37 | Kevin Lynx
            @溪流
            這個問題某種角度來看,就如同對成員變量不管應用情景如何都提供Get/Set一樣,同public一樣了。

            我覺得唯一的區別,還是一種安全控制吧:
            class Singleton
            {
            public:
            static Singleton &GetInstance() { static Singleton ob; .... }
            private:
            Singleton() { ... }
            Singleton( const Singleton & ) ...
            };
            那么,這個Singleton對象就只存在一份。

            當然,也有單件不作constructor的private限制的。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:55 | qiaojie
            單件模式確實是一個錯誤。但是不應該用全局變量代替單件,而是應該用一組全局函數帶代替單件模式,就像系統API那樣。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:59 | 溪流
            @qiaojie
            一組全局函數如果一定要完全OOP則可以封裝到“靜態類”里面:
            class AAA
            {
            public:
            static void foo();
            static void bar();
            //...

            private:
            AAA();
            };  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 14:10 | 溪流
            @Kevin Lynx
            我覺得你這個例子并不說明什么
            這個例子就是通常的單件模式的使用情形。

            1、它沒有避免全局變量的弊端。對結構不太注意的人隨時可以Singleton::GetInstance();

            2、如果它要單一實例,那么這里肯定有一個內在因素。一個比較通常的情況是,這個類是一個框架(或某個框架的一部分)。既然它是框架,那么框架本身自然可以將其隱藏,或者以本框架最頭條使用說明的方式明令禁止實例化。如MFC的CWinApp,如果有人實例化2個CWinApp導致錯誤,一定是那個人太小白了而不是MFC太傻;類似的可能還有NTService的封裝。除此之外可能還有些啥原因我一時羅列不出來。

            3、如果它要被多個局部共享,那么這實際上就是赤果果的全局變量,用了就用了,沒必要假裝沒用過


            至于get和set,我現在還不知道自己感覺到底如何。至少我認為不是所有的都需要public出來的。最多,給所有非隱藏變量個get,給所有非只讀公開變量來個set就差不多了吧。

              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 14:26 | yrj
            @溪流
            一組全局函數如果一定要完全OOP則可以封裝到“靜態類”里面:

            靜態類沒必要
            namespace AAA
            {
            void foo();
            void bar();

            //...

            } // namespace AAA  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 14:32 | 溪流
            @yrj

            我是說,如果要滿足形式上的OOP  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 14:58 | 遠古毛利人
            我覺得單件模式給庫作者使用比較好,因為靜態數據沒法避免用戶多次定義。
            單件的話因為長得顯眼,用戶一看就知道。
            另外,在GetInstance()里也可以做一些復雜的初始化動作,呵呵。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 15:03 | gbb21
            鑒于溪流GG的blog上了我的google reader,于是特來YM  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-29 15:16 | chentan
            用C的思維去思考,就沒有那么多思想負擔了  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 15:45 | 矩陣操作
            @遠古毛利人
            同意你這個看法。C++里面單件形式意義大于實際意義。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 15:47 | 空明流轉
            @溪流
            設計模式的目標在兩個方面:
            一個方面是給你一點你需要的自由,第二個是不給你除了給你的自由以外的東西。

            某種意義上,Singleton是最好的用例。至于Singleton的實現,有很多種。
            VCZH提供的,也是一種實現。

            我看了一下樓上的評論,似乎都狹隘的將Singleton局限在Class::Instance()這樣的GOF標準里面了。
            但是實際上不盡然。特別是橫跨Binary的,或者是C-Compatible的設計,都一定是GetXXX()這樣一個自由函數的實現。

            所以討論Singleton模式,并不只是討論實現,更重要的,是討論兩點,也就是我最初提到的兩點:

            第一,一個類型實例數量的限制;
            第二,訪問感知性(比方說如果我是GetInstance的時候,我每次訪問都可以明明白白的追蹤到訪問點。而Global就比較困難,有時候你很難知道變量在什么時候被修改了。)  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 16:33 | 溪流
            @空明流轉
            前面的論述我基本上接受,但最后兩點還是想不通

            比如第二點,我要知道他什么時候被修改了,如果用的是全局變量,我可能要全工程搜索變量名字,如果是單件模式,我可能要全工程搜索XXX::GeInstance(),這一點我看不出單件模式帶來的任何好處  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 16:34 | OwnWaterloo
            @空明流轉
            >>都一定是GetXXX()這樣一個自由函數的實現

            這沒錯。 而且還要區分2種語意:
            1.
            xxx_init
            ...
            xxx_get

            2.
            xxx_get_and_init
            第2種語意我不喜歡。


            將xxx_get, xxx_init搞成xxx::instance完全是脫了褲子放屁。
            本身就是一個free function的事情, 非要搞出個class出來。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-29 16:51 | 清風
            @溪流
            遇到這種情況,難道你不是在GetInstance函數里檢測被修改的時機嗎.....?  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 17:23 | 唐榮軍
            你已經進步了,等哪次你覺得它還是有必要的時候,就表明你更進一步了。祝好運!  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 17:26 | 空明流轉
            @溪流
            斷點,謝謝。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 19:53 | 陳梓瀚(vczh)
            @OwnWaterloo
            1:堅持所有singleton都必須在main之前自動初始化完成
            2:堅持singleton之間不能有任何使用關系
            3:因此不需要XX_init,get就好了  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 20:05 | OwnWaterloo
            @陳梓瀚(vczh)
            main之前自動初始化也是需要代碼的。

            C++的運行庫會幫忙做這個事情。而C不行。 至少標準C不行。
            編譯器提供的DllMain或者 __atrribute__(constructor)啥啥的不算。

            所以, C里面init是需要的。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 22:10 | 空明流轉
            @陳梓瀚(vczh)
            這種堅持通常都頗具難度。。。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-30 09:28 | hh
            不去老老實實坐點業務 討論這個有1毛的意義嗎?

              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 09:53 | Iloveprogram
            @陳梓瀚(vczh)
            剛學singleton的時候,也是為那些個多線程不安全的問題煩惱過。后來一想何必那么麻煩,在使用以前實例化好就得了,使用的時候直接get。這樣性能又好,又簡潔。
            看到大師也有這種觀點,很是欣慰,呵呵。

            btw,對你現在在做的東西很感興趣,不過我自己水平未到。

              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 09:59 | 溪流
            @hh
            你如果覺得沒意義,大可不必來此浪費時間,謝謝!  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 10:01 | 溪流
            @唐榮軍
            我喜歡你的這種口氣,但希望知道你的具體內容,不然這樣的話我也會說  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 10:01 | 溪流
            @空明流轉
            好的!這算單件模式一個優點吧。。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 10:25 | holyfire
            單件可以在設計時就考慮到自己是唯一的實例,但是用全局對象有幾個問題,

            1:對象可能產生多個實例,如果你的類隱藏的數據成員可能被構造函數修改的話,提供者就會失去控制權。比如一個不小心使用了值參數導致臨時對象被構造。

            2:如果有代碼在main前面執行的話有初始化順序問題

            3:如果這個單件是個基類指針,單件可以在運行時配置并保證多線程安全

            4:如果這個單件在DLL中并會被重新加載,單件模式更方便使用

            5:單件模式和全局變量相比較只是書寫習慣的問題

            那么,如果你的要求很簡單并沒有涉及到以上問題(可能還有一些問題我沒發現),那么全局變量的確可以滿足你的要求。

            很多人都覺得main之前初始化單件很容易,那是你工作的內容面還不夠廣,很多方面會導致你的代碼在main前面執行而且是你不知道的情況下,比如DLL的靜態鏈接庫方式使用,使用第3方庫,比如ACE會修改main宏替換自己的main函數,或者你的代碼本身就在DLL中。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 11:20 | 空明流轉
            @holyfire
            Ace在工程上,就是一坨屎。。。完全沒法用。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:52 | 陳梓瀚(vczh)
            @OwnWaterloo
            不管要不要代碼初始化,只要你堅持所有不同的singleton對象都不需要依賴于其他singleton對象來創建那么就沒有問題。如果不行,那么證明設計有錯,或者沒錯但是很難實現,或者沒錯很容易實現但是很容易寫出bug,總之要改。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:53 | 陳梓瀚(vczh)
            @hh
            你要是能把你做的業務寫到博客,看公司開不開你啦  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:53 | 陳梓瀚(vczh)
            @空明流轉
            控制大工程需要使用一些可能會造成開發起來有一點點麻煩,但是從根本上排除了很多bug的根源的方法。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:55 | 陳梓瀚(vczh)
            @OwnWaterloo
            用一種語言去表達一些概念,如果造成不可消除的重復代碼或模式的話,那么應該在可能的情況下更換語言。舉個例子,你為PC開發軟件,那么C完全沒必要,C++能兼容它。因此你可以引入一點點C++的特征去消除你的困難,剩下的你愛用C寫就用C寫。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:55 | 陳梓瀚(vczh)
            @Iloveprogram
            要以發展的眼光看問題。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:56 | 陳梓瀚(vczh)
            @OwnWaterloo
            話說回來,只要保持singleton必須在main前構造完畢這個原則的話,就算你singleton的創建互相依賴,也是不需要鎖的。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:58 | 陳梓瀚(vczh)
            @holyfire
            那證明你把不該singleton的東西給singleton了,應該修改設計,而不是想辦法實現singleton。

            舉個簡單的例子,我可能需要在很多地方使用相同的正則表達式,那么每次都寫regex(L"....") r;顯然是浪費了構造時間的,所以這可能就會被放在一個全局的地方。那你說應不應該做成singleton呢?顯然是不需要的,你需要的是把你這些regex放在一個Context類里面,在main函數創建,然后傳遞給所有其他對象。

            還有,一個類是否應該成為singleton,不是類自己決定的,而是使用類的那個人決定的。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 16:05 | OwnWaterloo
            @陳梓瀚(vczh)
            >>用一種語言去表達一些概念,如果造成不可消除的重復代碼或模式的話,那么應該在可能的情況下更換語言。

            只所以要說C:
            1. 上面提到了C
            2. C++做二進制兼容的東西很煩

            而且, 如果不了解C++在初始化靜態對象時做了哪些工作, 就會犯錯。
            比如, 很多人都覺得C++靜態對象初始化是線程安全的, 其實是和實現相關的。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 16:12 | OwnWaterloo
            @陳梓瀚(vczh)
            >>不管要不要代碼初始化,只要你堅持所有不同的singleton對象都不需要依賴于其他singleton對象來創建那么就沒有問題。如果不行,那么證明設計有錯,或者沒錯但是很難實現,或者沒錯很容易實現但是很容易寫出bug,總之要改。

            你說得也太武斷了。 設計有問題?
            總有東西的初始化需要申請內存, 能不依賴C heap和C++ free store?

            初始化后有部分東西又需要向atexit注冊, 又依賴另一個全局的東西。
            初始化失敗, 有部分人喜歡寫log(雖然我不喜歡), 再次依賴全局的東西。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 16:14 | OwnWaterloo
            @陳梓瀚(vczh)
            >>話說回來,只要保持singleton必須在main前構造完畢這個原則的話,就算你singleton的創建互相依賴,也是不需要鎖的。

            class evil
            {
            evil()
            {
            pthread_create(... );
            _beginthreadex( ... );
            }
            };

            如果這個例子確實太邪惡, 別忘了還有可能會碰見進程共享數據。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 17:57 | holyfire
            @陳梓瀚(vczh)
            雖然看不明白你想對我表達什么,或者是找錯人了?不過感覺你有點想當然了,好像人人都該像你規定的那樣去做,不過我遇到的問題大多是是工作上實際遇到事,而你說的那個例子更像是用原型模式(Prototype)的情況,當然不應該作為單件模式,而且我并沒有舉例子說什么什么情況下該用單件模式,而是說遇到某種情況用單件模式比全局對象好,麻煩你看仔細點。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 18:50 | 溪流
            到后面我都看不大懂了~~~
            搬張凳子學習了,各位大俠請繼續~  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 22:25 | 陳梓瀚(vczh)
            @OwnWaterloo
            1:初始化的時候連內存都申請不了應該直接崩潰,這是最好的辦法。所以這個不是理由。

            2:main函數執行之前沒有其他線程,不存在共享的讀取問題。如果需要啟動線程,應該讓singleton提供函數讓main函數執行并啟動。任何庫不應該悄悄啟動線程,除了GUI。再者,你應該充分信任平臺API,這是唯一你不可控制的東西。

            3:singleton初始化的時候不相互依賴是一件好事,如果實在非依賴不可,那么一方面說明你可能將不應該singleton得給singleton了,另一方面則有可能是你把本來應該存在同一個singleton得給拆分成多個singleton了,種種設計問題帶來的非依賴不可的結果。

            4:如果一個二進制發行的庫是你開發的話,那么不再庫里面提供singleton是一個很好的選擇。一個程序的所有singleton只能存在在exe里面。話說回來,二進制其實不是問題,你應該堅持你自己的程序和庫都是用同一個編譯器編譯。如果庫沒提供二進制,那么應該索取代碼,是在索取不了,那么使用其他庫。作為一個庫的發行者,要么提供C++代碼,要么提供所有流行編譯器的二進制編譯結果。這才是負責任的,除非你從一開始就不打算跨編譯器或者跨平臺(windows和linux都有主流C++編譯器)。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 22:31 | 陳梓瀚(vczh)
            @OwnWaterloo
            然后我再次強調,一個類是否應該當成singleton,應該取決于調用者而不是類自己,除非因為平臺的API限制(譬如說windows下面的GUI通常都會有的Application類)  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 22:37 | OwnWaterloo
            @陳梓瀚(vczh)
            >>初始化的時候連內存都申請不了應該直接崩潰,這是最好的辦法。所以這個不是理由。

            "申請不了"同"需要依賴內存分配器已初始化" 完全是兩碼事。
            你又跑題了。

            >>任何庫不應該悄悄啟動線程,除了GUI

            這只是"你覺得"應該這樣。
            但你馬上又說了一個反例。

            3. 我只想說對全局某些服務的依賴是很難避免的。
            singleton關我什么事? 我老早不用這種脫了褲子放屁的玩意了。


            >>作為一個庫的發行者,要么提供C++代碼,要么提供所有流行編譯器的二進制編譯結果。這才是負責任的。

            作為一個二進制庫的發布者, 將庫用C實現并提供C++的header-only的綁定層; 或者發布C++的源代碼。
            這才是負責任的。

            所有流行編譯器? 你知道什么叫所有流行編譯器么?
            編譯器種類×編譯器版本×編譯器運行庫版本×你的庫版本

            你覺得你能負這個責, 你就繼續玩吧。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-31 10:42 | sun
            我想還是比較有用的,舉個例子,也是我做過的,創建一個singleton類,需要常鏈接到服務器,時序同步,在不同的線程間共享,非常的高效,尤其是在資源很缺乏的機器上,像iphone設備,碰到了就覺得需要了.......
            其實平時很少用!  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-31 15:40 | 陳梓瀚(vczh)
            @OwnWaterloo
            顯然“所有流行編譯器版本”是一個你只需要下載完寫了從vcproj到的makefile生成器以后就自動完成的事情,一勞永逸也,想做當然能做,而且隨時更新。運行庫版本一律使用static鏈接,因此可以跟你的編譯器版本捆綁在一起。而且,編譯器的【小版本】之間的變化導致lib不能通行應該歸咎于編譯器的質量,而不是你。

            第二,反例當然是要的,有些東西必須成為singleton,典型的GUI就是,一個程序不可能也不應該同時使用N套平行的GUI庫(嵌套關系除外)。所以這個沒有任何問題。

            第三,main之前的任何異常都不要捕捉,任由崩潰。想log就捕捉了log,log完還是要throw;以便崩潰

            第四,二進制發布者那一句我們兩個說法沒有任何區別

            第五,VC++里面沒有看見任何singleton在創建前new還不能用的,如果其他編譯器有,那是編譯器的bug,要么放棄它,要么放棄singleton。

            第六,我的所有觀點都從以下方面出發
            1:盡可能將bug扼殺在搖籃里
            2:制作出來的程序容易被更改  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-31 15:57 | OwnWaterloo
            @陳梓瀚(vczh)
            >>顯然“所有流行編譯器版本”是一個你只需要下載完寫了從vcproj到的makefile生成器以后就自動完成的事情,一勞永逸也,想做當然能做,而且隨時更新。

            這只是構建腳本而已。 我說的是不同編譯器產生出的二進制代碼的兼容性。
            你能用msvc鏈接到一個mingw生成的二進制庫嗎?
            你能用msvc鏈接到前一個crt版本嗎?

            >>運行庫版本一律使用static鏈接,因此可以跟你的編譯器版本捆綁在一起。
            看吧, 你又"一律", "一定" 什么的了。

            這是C++語言本身的問題。 C++的特性太復雜, 而且是一門開放的語言, 所以會有很多二進制上不兼容的特性。
            而且C++這門語言本身就會促使開發者使用復雜的設計。

            >> 一個程序不可能也不應該同時使用N套平行的GUI庫(嵌套關系除外)
            你沒見過而已。 確實有這樣的東西存在。 MFC+WTL+還有一個什么忘記了。
            當然, 那東西確實丑陋。
            不過已經是這樣子了, 推倒重來的代價公司受不起, 用戶也受不起。


            >>main之前的任何異常都不要捕捉,任由崩潰。想log就捕捉了log,log完還是要throw;以便崩潰
            再次強調, "需要全局的依賴" 和 "處理全局初始化錯誤" 是兩回事。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-01 01:46 | 沙城來客
            1.做個標識,讓人家知道這個東西是單例的 明白該怎么用 全局就沒有這種作用,不過到底怎么用是調用者的問題,不過至少自己的份內事情要做好
            2.推遲初始化 在大系統里面一開始一堆全局的大類進行初始化是很恐怖的事情  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-01 15:50 | 陳梓瀚(vczh)
            @OwnWaterloo
            如果你搞定了構建腳本,你怎么還會有vc連接不了mingw的lib的問題呢?已經被生成的一大堆lib搞定了,你挑一個正確的就好了。

            “C++促使程序猿使用復雜的設計”這個東西跟論點沒有任何關系,既然要寫庫,那么肯定會有些約束的。一律和一定跟這個沒有任何沖突。根據第一個觀點,第一,構建腳本好寫。第二,有了足夠的構建腳本你就可以挑選任意種類的lib。第三,因此編譯器相同,因此可以static。因為這是運行庫,運行庫跟程序里面的功能模塊是兩回事,尺寸特別小,static沒有任何壞處,沒有static你還有機會犯錯。

            我們并不需要照顧100%的人的需求,譬如少數公司因為歷史原因造成的N個GUI一起使用等等(其實歷史原因跟singleton的主題并沒有什么大的關系)

            最后,我不認為全局初始化錯誤除了log以外應該做其他事情。如果連初始化都沒搞定,那么顯然應該崩潰。如果不應該崩潰,那么那個東西就不屬于初始化的一部分,而應該類似于“插件”,這種時候不能用singleton,而應該用一個manager來管理這些事情。當然manager需不需要singleton是另外一回事請,總之是在main之后才開始做的。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-01 16:57 | OwnWaterloo
            @陳梓瀚(vczh)
            >> 一大堆lib搞定了,你挑一個正確的就好了。
            挑得出來嗎?

            你會為VC6用戶生成相應的binary嗎?

            客戶使用了-fabi-version 怎么辦?
            客戶使用了-mno-align-double又怎么辦?

            你要規定用戶所使用的編譯參數? 你能規定用戶使用的編譯參數?
            你能確保用戶"僅僅使用你一個人的庫"?

            你想得太簡單了。

            >> 那么肯定會有些約束的
            這些約束會被很不經意的打破。 很難控制住。
            因為C++給了程序員太多可以玩, 可以炫的東西。
            所謂的"心智包袱"。

            >>尺寸特別小,static沒有任何壞處
            算了, 你總是把很有爭議的話說得如此絕對, 我還能說你什么呢。


            而且我第3次強調了, 我不想討論全局初始化失敗應該怎樣。
            你覺得應該怎樣你可以繼續說。

            我上面舉的例子, 僅僅是為了說明對"全局的依賴很難避免"。
            我覺得已經足夠說明了。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-02 12:25 | cexer
            把單件放在其它模式堆里,確實有點雞立鶴群的感覺,它并沒有其它模式那樣有啟發性,所有寫程序的人都知道世上有全局變量這個東西,那何必要取個好聽的名字像模像樣地研究一番呢,《設計模式》的偉大除了讓人學會到很多手法,還有一點就是統一了很多概念,并為之提供了許多標準的名詞方便大家研究,綜上所述,我覺得“單件”就是一個虛名,你喜歡叫它“全局變量”也行,大家心里的概念沒有差別,只是未必真是用全局變量來實現而已,所以不用在一個名字上糾結。

            誰不想用赤祼祼的全局指針,它們原始又純樸,天然無雕飾。可是真的要用它們來實現一份庫級別的代碼,就好像雙手拋飛刀一樣危險,不僅拋的人要兩眼圓睜神經緊繃,連觀眾都要跟著捏一把冷汗。全局變量本來沒有錯,錯的是在它們之上作出的許多美好的假設,假設誰一定在誰之前產生,誰一定在誰之后銷毀,誰依賴著誰,誰又被誰依賴著,誰是線程安全的,誰又一定不會被多線程訪問。互相完全沒有依賴關系,不用額外控制,像終結者一樣智能,完成任務又知道自己終結的全局變量,只是個傳說。

            有很多以單件名字的手法,Meyers 單件,Alexandrescu 單件,Phoenix 單件,Schwarz 計數器,你看它們好多都叫做“單件”,但是你喜歡叫 Meyers 全局對象,Alexandrescu 全局對象,Phoenix 全局對象 也可以。

            我個人覺得,把“全局變量”拿來和“單件”相提并論是很不妥的事件。就好像拿“汽車”和“交通工具”比一樣。不是一個層面上的東西,單件也許是全局變量,也可以不是,“全局”也有多種理解角度,存儲位置(堆上,棧上,靜態數據區),生存區域(線程局部,進程局部,模塊內部),生存周期(何時生,何時死,不死)。只是“全局變量”已經不能說明它的復雜度,但是一提“單件”大家都明白將要說的是什么,這就是“單件”存在的價值,這也是《設計模式》一書提出“單件模式”偉大所在。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-02 15:54 | OwnWaterloo
            @cexer
            用于單件的那些技術, 同樣可以用于全局數據初始化。

            C運行庫為你初始化堆分配器, 不也不需要你多余控制?
            進程終結后也會自己終結。
            呃, C庫不一定會真正釋放, 有可能留給OS。
            那換個例子, atexit。

            所以單件根本不是什么偉大的發明。
            只是OO時代的順應產物。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-03 01:22 | cexer
            @OwnWaterloo
            我說的可能不大清楚,我的意思是“單件模式”只是一種概念,正是類似“全局數據”這種東西的一種抽象形容,不然何以稱“模式”。拿“單件模式”和“全局數據”本身比,是沒有可比性的,一為抽象,一個具體,一為模式,一為實例。它跟OO也沒有關系,一個C全局裸指針,也是一份單件的實體。所以不要再比來比去的了。

              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-03 19:51 | OwnWaterloo
            @cexer
            在我看來恰恰相反, 全局數據與用戶之間的交互形式有若干, 而單件只是其中一種。
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-04 09:53 | hello
            全局變量可以實現單件模式的功能,但是單件模式可以避免生成多個該類型的對象
              回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-10 13:21 | 螞蟻終結者
            還是要看實際情況,并不是任何時候都可以用全局變量替代單例的。
            如在Symbian C++ S60V3以前,是不允許WSD數據(全局變量)存在的,這種情況下必須用Tls Singleton這樣的模式。。。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-10 15:08 | tangxinfa
            單件模式較之全局變量(對象)的一些優點:
            1,防止用戶構造出另一個對象,這也就是為什么稱之為單件。
            將構造函數、拷貝構造函數私有化,而只能通過getInstance()接口獲得唯一的實例。
            2,延遲創建對象。
            只有用到的時候才會創建對象,防止程序啟動時間過長,不做無用功。
            3,全局變量就夠用了,但感覺以后會需要之前兩點特性。
            4,全局變量命名上抓狂了:g_xxxxxxxx,globalXXXXXXXX,想來想去還不如:CXXXXXXXXXX::getInstance()夠直白。
            5,調試時好設斷點。  回復  更多評論
              
            # re: 討論:單件模式的優點何在?有無存在的必要? 2015-05-22 16:35 | lurenjia
            @陳梓瀚(vczh)
            輪子哥。。  回復  更多評論
              
            伊人久久亚洲综合影院| 久久涩综合| 1000部精品久久久久久久久| 久久人人爽人人爽人人片AV不 | 国产精品亚洲综合专区片高清久久久 | 日本加勒比久久精品| 老色鬼久久亚洲AV综合| 9191精品国产免费久久| 亚洲国产精品嫩草影院久久| 久久精品无码一区二区无码| 久久中文精品无码中文字幕| 精品国际久久久久999波多野| 久久www免费人成精品香蕉| 中文字幕热久久久久久久| 久久久久无码精品国产app| 婷婷综合久久中文字幕蜜桃三电影| 狠狠久久综合| 99国产欧美久久久精品蜜芽| 人人妻久久人人澡人人爽人人精品| 91亚洲国产成人久久精品网址| 久久久久se色偷偷亚洲精品av| 久久93精品国产91久久综合| 91精品无码久久久久久五月天| AV无码久久久久不卡网站下载| 日韩人妻无码一区二区三区久久99| 久久丝袜精品中文字幕| 国产亚洲美女精品久久久| 国产精品美女久久久久网| 久久亚洲精品成人av无码网站| 久久精品免费一区二区| 99久久国产精品免费一区二区| 久久成人小视频| 久久久久久精品久久久久| 久久久久九九精品影院| 久久综合精品国产一区二区三区 | 一本色道久久综合狠狠躁| 国产免费久久精品99re丫y| 99精品久久精品一区二区| 亚洲国产精品无码久久SM| 精品无码久久久久国产| 国内精品久久久久久99蜜桃|