乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      論程序設(shè)計(jì)方法

       心之所指 2006-01-03
      論程序設(shè)計(jì)方法
      http://tech.163.com/school · 2005-04-04 22:28:23 · 來源: vckbase

        如果你是初學(xué)者----------------請(qǐng)不要閱讀;
         但有志成為中高級(jí)程序員--------請(qǐng)務(wù)必閱讀;
         如果你是中級(jí)程序員------------請(qǐng)務(wù)必閱讀;
         如果你高級(jí)程序員--------------請(qǐng)批評(píng)指正。


         本文是我在“軟件工程師班”開學(xué)第一節(jié)課的講義,和“計(jì)算機(jī)軟件設(shè)計(jì)發(fā)展”講座
      上的內(nèi)容整理而成。寫作本文的目的是引導(dǎo)學(xué)生從更高的層次來看待程序設(shè)計(jì)方法,為將來
      成為高級(jí)程序員而做好理論準(zhǔn)備。

        一、計(jì)算機(jī)硬件環(huán)境對(duì)軟件設(shè)計(jì)方法的限制

         計(jì)算機(jī)的發(fā)明到現(xiàn)在已經(jīng)60年了,計(jì)算機(jī)程序設(shè)計(jì)方法也伴隨著計(jì)算機(jī)硬件技術(shù)的提
      高而不斷發(fā)展。硬件環(huán)境對(duì)軟件設(shè)計(jì)既有嚴(yán)重的制約作用,也有積極的推動(dòng)作用。

        
      在我的大學(xué)母校(此處刪除6個(gè)字),數(shù)學(xué)系的一些老師,有幸成為了我國(guó)第一代的計(jì)算機(jī)
      DIY一族。呵呵,不要以為是組裝PC機(jī)呦,他們組裝的可是小型機(jī)。一人多高鐵皮柜大小的
      主機(jī),加上紙帶機(jī)(后期改進(jìn)為讀卡機(jī)),組裝好后,除了供學(xué)校自己的科研使用外,還在
      全國(guó)各地銷售了十
      幾臺(tái)。當(dāng)時(shí)(七十年代)一臺(tái)的售價(jià)是10幾萬元人民幣,如果換算到今天,相當(dāng)于價(jià)值大約
      為100多萬元,非常高檔的小型計(jì)算機(jī)了。下面大家猜猜,這么高檔的計(jì)算機(jī),它的內(nèi)存是
      多少那?(都把嘴閉好了,我要公布答案了)—— 4K。

         一塊50公分見方的內(nèi)存板,

         插入到主機(jī)箱中,好了------ 1K;
         再插一塊內(nèi)存板,好了------ 2K;
         再插一塊內(nèi)存板,好了------ 3K;
         再插一塊內(nèi)存板,好了------ 4K;
         再......不行了,插不起了,太貴了!這就是當(dāng)時(shí)的環(huán)境。這樣的環(huán)境下,用什么寫
      程序那?當(dāng)然只有機(jī)器碼了。先用匯編寫,然后翻閱手冊(cè)手工改寫為機(jī)器碼,然后打卡或穿
      紙帶,輸入運(yùn)行。可以想象,在當(dāng)時(shí)的條件下,什么叫好的程序那?什么叫優(yōu)秀的程序那?
      —— 技巧!

         程序設(shè)計(jì)的最初始階段,是講究技巧的年代。如何能節(jié)省一個(gè)字節(jié),如何能提高程序
      運(yùn)行的效率,這些都是要嚴(yán)肅考慮的問題。而所謂的程序的易讀性,程序的可維護(hù)性根本不
      在考慮范圍之內(nèi)。

         今天,35歲以上的學(xué)習(xí)過計(jì)算機(jī)的朋友可能都使用過一種個(gè)人計(jì)算機(jī)——APPLE-II(
      中國(guó)也生產(chǎn)過這種計(jì)算機(jī)的類似產(chǎn)品“中華學(xué)習(xí)機(jī)”)。主頻1M,內(nèi)存48K(擴(kuò)展后,最多
      可達(dá)到64K)。我就是使用這樣的計(jì)算機(jī)長(zhǎng)大的
      :)。當(dāng)年,類似的個(gè)人計(jì)算機(jī)產(chǎn)品,還有PC1500,Layser310等。這種計(jì)算機(jī)上已經(jīng)固化了
      BASIC 語言,當(dāng)然只是為學(xué)習(xí)使用。要想開發(fā)出真正的商業(yè)程序,則必須使用匯編,否則的
      話,程序就比蝸牛還要慢了。于是,程序設(shè)計(jì)中對(duì)于技巧的運(yùn)用,是至關(guān)重要的了。

         題外話1:

         比爾蓋茨是 BASIC 的忠實(shí)擁護(hù)和推動(dòng)者。當(dāng)年,他在沒有調(diào)式環(huán)境的狀況下,用匯編
      語言寫出了一款僅有 4K 大小的 BASIC 解釋器,且一次通過。確實(shí)另人佩服。(不象現(xiàn)在
      微軟出品的程序,動(dòng)輒幾十兆。)這也許就是比爾對(duì) BASIC
      情有獨(dú)忠的原因,每當(dāng)微軟推出(臨?。┮粋€(gè)新技術(shù),則他會(huì)立刻在 BASIC 中提供支持。

         題外話2:

         在 APPLE-II 上有一款游戲軟件“警察抓小偷”,當(dāng)年熬夜玩游戲,樂趣無窮。后來
      這款游戲被移植到了PC上,咳~~~根本沒有辦法玩,因?yàn)樾⊥颠€沒跑就被警察抓到了。硬件
      的速度提升,另我無法再回味以前的時(shí)光了。

        二、結(jié)構(gòu)化程序設(shè)計(jì)

         隨著計(jì)算機(jī)的價(jià)格不斷下降,硬件環(huán)境不斷改善,運(yùn)行速度不斷提升。程序越寫越大
      ,功能越來越強(qiáng),講究技巧的程序設(shè)計(jì)方法已經(jīng)不能適應(yīng)需求了。記得是哪本書上講過,一
      個(gè)軟件的開發(fā)成本是由:程序設(shè)計(jì) 30% 和程序維護(hù) 70%
      構(gòu)成。這是書上給出的一個(gè)理論值,但實(shí)際上,從我十幾年的工作經(jīng)驗(yàn)中,我得到的體會(huì)是
      :程序設(shè)計(jì)占 10%,而維護(hù)要占 90%。也許我說的還是太保守了,維護(hù)的成本還應(yīng)該再提高
      。下面這個(gè)程序,提供了兩種設(shè)計(jì)方案,大家看看哪個(gè)更好一些那?

         題目:對(duì)一個(gè)數(shù)組中的100個(gè)元素,從小到大排序并顯示輸出。(BASIC)

         方法1:冒泡法排序,同時(shí)輸出。

      FOR I=1 TO 100
        FOR J=I+1 TO 100
         IF A[I] > A[J] THEN T=A[J]: A[J]=A[I]: A[I]=T
        NEXT J
        A[I]
      NEXT I
         方法2:冒泡法排序,然后再輸出。

      FOR I=1 TO 100
      FOR J=I+1 TO 100
      IF A[I] > A[J] THEN T=A[J]: A[J]=A[I]: A[I]=T
      NEXT
      NEXT

      FOR I=1 TO 100
      A[I]
      NEXT

        
      顯然,“方法1”比“方法2”的效率要高,運(yùn)行的更快。但是,從現(xiàn)在的程序設(shè)計(jì)角度來看
      ,“方法2”更高級(jí)。原因很簡(jiǎn)單:(1)功能模塊分割清晰——易讀;(2)也是最重要的
      ——易維護(hù)。程序在設(shè)計(jì)階段的時(shí)候,就要考慮以后的維護(hù)問題。比如現(xiàn)在是實(shí)現(xiàn)了在屏幕
      上的輸出,也許
      將來某一天,你要修改程序,輸出到打印機(jī)上、輸出到繪圖儀上;也許將來某一天,你學(xué)習(xí)
      了一個(gè)新的高級(jí)的排序方法,由“冒泡法”改進(jìn)為“快速排序”、“堆排序”。那么在“方
      法2”的基礎(chǔ)上進(jìn)行修改,是不是就更簡(jiǎn)單了,更容易了?!這種把功能模塊分離的程序設(shè)
      計(jì)方法,就叫“
      結(jié)構(gòu)化程序設(shè)計(jì)”?!?

      三、對(duì)程序設(shè)計(jì)中技巧使用的思考

         我可以肯定,大家在開始學(xué)習(xí)程序設(shè)計(jì)的時(shí)候,一定都做過這樣一個(gè)題目:求100以內(nèi)
      的素?cái)?shù)。老師在黑板上,眉飛色舞地寫出了第一個(gè)程序:(C程序)

         方法1:

      for(i=1; i<100; i++)
      {
        for(j=2; j< i; j++)
         if(i%j == 0) break;
         if(j >= i) printf("%d,", i);
      }
         然后,老師開始批判這個(gè)程序“這個(gè)叫什么呀?太慢了!因?yàn)槲覀兌贾来笈紨?shù)不可
      能是素?cái)?shù)了,因此,要排除掉!” 于是,意尤未盡地寫出了第二個(gè)程序:

         方法2:

      printf("2,");
      for(i=3; i<100; i+=2)
      {
        for(j=2; j< i; j++)
         if(i%j == 0) break;
         if(j >= i) printf("%d,", i);
      }
         老師說:“看!我們只改動(dòng)了一點(diǎn)點(diǎn),程序運(yùn)行的速度就提高了一倍多”。然后運(yùn)用
      誘導(dǎo)式教學(xué)法繼續(xù)提問“程序的效率,還能再提高嗎?能!”,得意地寫出第三個(gè)程序:

         方法3:

      printf("2,");
      for(i=3; i<100; i+=2) ‘‘不考慮大偶數(shù)
      {
        for(j=3; j< i/2; j+=2) ‘‘不考慮用偶數(shù)去測(cè)試,而且只驗(yàn)算到一半就足夠了
         if(i%j == 0) break;
         if(j >= i) printf("%d,", i);
      }
         “大家看,我們又只改動(dòng)了一點(diǎn)點(diǎn),運(yùn)行速度又提高了一倍多。可以了嗎?不可以!
      我們還能再提高”。于是又高傲地寫出了第四個(gè)程序:

         方法4:

      printf("2,");
      for(i=3; i<100; i+=2)
      {
        int k = sqrt(i);
        for(j=3; j<= k; j+=2)
         if(i%j == 0) break;
         if(j >= k ) printf("%d", i);
      }
         然后,開始證明為什么我們判斷素?cái)?shù)的時(shí)候,只需要驗(yàn)算到平方根就足夠了:

         假設(shè)p是合數(shù),那么令:p=a*b。反正法:由于我們已經(jīng)判斷了p的平方根以內(nèi)的整數(shù)都
      不能被p整除,于是 a>SQRT(p)?;谕瑯拥睦碛?b>SQRT(p)。于是 p = a * b > SQRT(p)
      * SQRT(p) = p 得出矛盾, 命題得正。

         的確,“方法4”的確比“方法1”的運(yùn)行速度要提高了好幾倍,甚至好幾十倍。但我
      們仔細(xì)分析測(cè)試看看。

         (1)“程序4”到底比“程序1”快了多少那?我在某臺(tái)計(jì)算機(jī)上進(jìn)行測(cè)試(P4,
      1.5G)得到的速度對(duì)比表:

      計(jì)算范圍 100 1000 10000 100000
      速度差 0.00秒 0.01秒  0.18秒 15秒
        
         (2) 在10萬以上,才會(huì)看出一些差別。而這種差別根本就不夠底償程序設(shè)計(jì)階段的
      付出。如果計(jì)算的范圍再大,那么不管是“方法1”,還是“方法4”都不是好的算法。(計(jì)
      算素?cái)?shù)的另外一個(gè)比較優(yōu)秀的算法叫“漏篩法”)

         (3)寫出“方法1”,只要具有小學(xué)四年級(jí)的數(shù)學(xué)水平就夠了,而“方法4”則需要初
      中三年級(jí)的水平并且還要具備一些“數(shù)論”的知識(shí)。

         (4)從維護(hù)性看,如果你寫的程序需要另外一個(gè)程序員來維護(hù),或者若干時(shí)間以后,
      你重新來閱讀這段程序,那么就會(huì)對(duì)這個(gè)程序產(chǎn)生很多疑問:這個(gè)求平方根是干什么用的?
      其實(shí),就這個(gè)題目來說,使用到“方法3”就已經(jīng)足夠了。

         總結(jié)發(fā)言:

         I. 計(jì)算機(jī)的價(jià)格每年下降一半,而運(yùn)算速度每年提高一倍”,因此我們應(yīng)該把速度提
      高的任務(wù)交給硬件實(shí)現(xiàn)。

         II. 從易讀性、維護(hù)性出發(fā),程序員只負(fù)責(zé)按定義給出軟件實(shí)現(xiàn)。算法的問題是數(shù)學(xué)
      家解決的。

         題外話:

        
      多年以來,人們一直在尋找動(dòng)態(tài)圖象(影視)的存儲(chǔ)和回放的算法,但效果都不理想。直到有
      人發(fā)現(xiàn),原來在200多年前的數(shù)學(xué)家早就幫我們解決了這個(gè)問題——傅立葉(Fourier)級(jí)數(shù)
      展開。因此我要說,優(yōu)秀的算法不是我們程序員要考慮的問題,我們的任務(wù)只要按照數(shù)學(xué)家
      給出的算法翻譯
      為計(jì)算機(jī)程序語言而已。(這句話恐怕要遭到大多數(shù)程序員拋出的板磚襲擊)再比如,計(jì)算
      一元多次方程解的問題。我們使用的就是牛頓的迭代算法。不要怪我瞧不起你,你能發(fā)明這
      個(gè)方法的話,那就是當(dāng)代的牛頓了。

        四、程序的易讀性與書寫方法

        
      程序是否容易閱讀和維護(hù),與怎么書寫有很大的關(guān)系。說實(shí)在的,C語言中為了方便程序員
      書寫,允許使用++,--,<<,&&,?......這些運(yùn)算符號(hào)。但很多人經(jīng)常亂用,以為自己寫的
      程序多么簡(jiǎn)潔,效率多高。其實(shí),當(dāng)你分行書寫的話則更加容易閱讀和維護(hù),效率也不會(huì)降
      低,因?yàn)榫幾g程序
      早就幫你優(yōu)化為最快捷的代碼了。先看一個(gè)簡(jiǎn)單的例子:

         計(jì)算一個(gè)整數(shù)乘 255(C語言)

         方法1:a *= 255;

         方法2:因?yàn)橐莆贿\(yùn)算比乘法運(yùn)算要快很多倍,因此a*255的運(yùn)算書寫為:

      a =(a<<8)-a; //a*255 = a*256 - a = (a<<8) - a
         方法1的書寫非常簡(jiǎn)單,直截了當(dāng),顯然更容易維護(hù)。而方法2的書寫運(yùn)用了移位的技
      巧,不容易閱讀,但效率最高。是不是真的是這樣那?把這兩個(gè)程序編譯為匯編代碼看看。
      原來無論是方法1還是方法2,它們的匯編代碼都是一樣的:

      mov ecx, eax
      shl eax, 8
      sub eax, ecx
         也就是說,你認(rèn)為非常技巧的書寫方法,其實(shí)編譯器的優(yōu)化功能早就幫你想到了。那
      么方法2的方式就很值得批判了。下面是幾個(gè)有關(guān)C語言書寫方面的重要原則:
       
         1)盡量表達(dá)愿義,多加注釋;

         2)變量名稱和函數(shù)名稱,要使用有意義的符號(hào),并且遵守“匈牙利命名法”;

         3)不要為儉省內(nèi)存,使一個(gè)變量在一個(gè)模塊中表達(dá)多個(gè)含義。

         4)在某個(gè)模塊中,前半部分用i表示計(jì)數(shù)器,由于后半部分不再使用計(jì)數(shù)器了,于是
      又用i來保存某個(gè)中間的結(jié)果。等你維護(hù)這段程序的時(shí)候,保證你肯定會(huì)犯傻的。

         5)在使用條件表達(dá)式的時(shí)候,不要混合書寫運(yùn)算表達(dá)式;

         經(jīng)常有人在書寫for循環(huán)的時(shí)候,使用這樣的方式: for(int a=1,s=0; a<=100 &&
      (s+=a); a++);

         天呀,這樣寫是不會(huì)提高程序運(yùn)行效率的,尤其是當(dāng)運(yùn)算表達(dá)式復(fù)雜的時(shí)候,就更不
      容易閱讀了,還是把運(yùn)算寫到for的循環(huán)體中吧。

      int s = 0;
      for(int a=1; a<=100; a++)
        s += a; //計(jì)算1+2+...+100 這不很好嗎?!
         再比如,if(a=b)這個(gè)寫法在語法上是允許的,但不要使用。要使用也要
      if(0!=(a=b))這樣的方式。 還有值得一提的是慎用“,”(逗號(hào)運(yùn)算符)。

         不要連續(xù)使用++,--,<<,*,& .....這樣的運(yùn)算符號(hào)。

         a = b++-(--c<<1+e&0x0f>>1); //這個(gè)人有病。出這個(gè)題目考試的老師,也有病。

         常量要寫在條件表達(dá)式的左邊;

         if(5 == a) 這是正確的寫法,這樣書寫可以避免勿輸入而導(dǎo)致的 if(a=5)這樣的錯(cuò)誤


         避免程序中{ }的嵌套層次太深;

         最多4層。如果必須大于4層,那么寫成調(diào)用子函數(shù)或宏的方式。

         盡量多地使用斷言;

         當(dāng)你在書寫程序的過程中,憑你的智慧,你一定是知道:程序運(yùn)行到我正書寫的這行
      代碼的時(shí)候某個(gè)變量一定是某個(gè)值。好啦,那么不要憂郁,馬上加上一句代碼:ASSERT(nnn
      == xxx);。將來在調(diào)式維護(hù)這段代碼的時(shí)候,你會(huì)得到無限美妙的回報(bào)。

         書寫需要“成對(duì)匹配”使用的代碼的時(shí)候,在寫使用代碼之前,就先把結(jié)束寫出來;

      file.Open(...); //當(dāng)要打開文件的時(shí)候 char *lp=new char [100]; //當(dāng)要申請(qǐng)內(nèi)存的時(shí)

      ...... //先不要寫這段代碼 ...... //先不要寫這段代碼
      file.Close(); //馬上寫關(guān)閉 delete [] lp; //馬上寫釋放

      xxx.Loack(); //當(dāng)某個(gè)對(duì)象需要鎖定的時(shí)候 for(....)
      ...... //先不要寫這段代碼 { //寫大括號(hào)的時(shí)候
      xxx.Unlock(); //馬上寫解鎖 } //馬上寫大括號(hào)結(jié)束
         和這個(gè)道理相同,在C++的類中,如果需要申請(qǐng)內(nèi)存,那么先在構(gòu)造函數(shù)中給出
      lp=NULL;然后馬上在析構(gòu)函數(shù)中書寫 if(lp) delete []lp;

         可以適當(dāng)?shù)厥褂胓oto;

         在結(jié)構(gòu)化程序設(shè)計(jì)中,goto 是被排斥的。但是,如果適當(dāng)?shù)厥褂?goto 不但不影響斜
      率,而且還能提高程序的可讀性。

         題目:合并2個(gè)文件到一個(gè)新文件中。(不要挑我的毛病呀~~~~~,我使用的是類C的方
      式書寫的。)

      方法1:

      FILE *f1,*f2,*f3;
      if(Open(f1)成功)
      {
        if(Open(f2)成功)
        {
         if(Open(f3)成功)
         {
          ...... //這里是真正干活的地方
          Close(f1);
          Close(f2);
          Close(f3);
         }
         else //f3不成功
         {
          Close(f1);
          Close(f2);
          ......
         }
        }
        else //f2不成功
        {
         Close(f1);
         ......
        }
      }
      else //f1不成功
      {
        ......
      }
      ==========================================================
         方法2:

      FILE *f1=NULL,*f2=NULL,*f3=NULL;
      if(Open(f1)不成功) goto err;
      if(Open(f2)不成功) goto err;
      if(Open(f3)不成功) goto err;
      ...... //這里是真正干活的地方
      err:
      if(f3) Close(f3);
      if(f2) Close(f2);
      if(f1) Close(f1);


         方法1是最最標(biāo)準(zhǔn)的結(jié)構(gòu)化設(shè)計(jì),好嗎?不好!尤其是當(dāng){ }的層次比較深的時(shí)候,估
      計(jì)你尋找真正干活的代碼的地方都找不到。而使用方法2的程序,不但程序容易讀,而且沒
      有{ } 的深度。在C++中,又提供了異常try/catch的設(shè)計(jì)結(jié)構(gòu),而異常的結(jié)構(gòu)則比 goto
      的結(jié)構(gòu)更好、更完善了。


        五、面向?qū)ο蟮某绦蛟O(shè)計(jì)

        
      隨著程序的設(shè)計(jì)的復(fù)雜性增加,結(jié)構(gòu)化程序設(shè)計(jì)方法又不夠用了。不夠用的根本原因是“代
      碼重用”的時(shí)候不方便。面向?qū)ο蟮姆椒ㄕQ生了,它通過繼承來實(shí)現(xiàn)比較完善的代碼重用功
      能。很多學(xué)生在應(yīng)聘工作,面試的時(shí)候,常被問及一個(gè)問題“你來談?wù)勈裁词敲嫦驅(qū)ο蟮某?
      序設(shè)計(jì)”,學(xué)生
      無言,回來問我,這個(gè)問題應(yīng)該怎么回答。我告訴他,你只要說一句話就夠了“面向?qū)ο蟪?
      序設(shè)計(jì)是對(duì)數(shù)據(jù)的封裝;范式(模板)的程序設(shè)計(jì)是對(duì)算法的封裝。”后來再有學(xué)生遇到了
      這個(gè)問題,只簡(jiǎn)單的一句對(duì)答,對(duì)方就對(duì)這個(gè)學(xué)生就刮目相看了(學(xué)生后來自豪地告訴我的
      )。為什么那?
      因?yàn)橹挥薪?jīng)過徹底的體會(huì)和實(shí)踐才能提煉出這個(gè)精華。

        
      面向?qū)ο蟮脑O(shè)計(jì)方法和思想,其實(shí)早在70年代初就已經(jīng)被提出來了。其目的就是:強(qiáng)制程序
      必須通過函數(shù)的方式來操縱數(shù)據(jù)。這樣實(shí)現(xiàn)了數(shù)據(jù)的封裝,就避免了以前設(shè)計(jì)方法中的,任
      何代碼都可以隨便操作數(shù)據(jù)而因起的BUG,而查找修改這個(gè)BUG是非常困難的。那么你可以說
      ,即使我不使用
      面向?qū)ο?,?dāng)我想訪問某個(gè)數(shù)據(jù)的時(shí)候,我就通過調(diào)用函數(shù)訪問不就可以了嗎?是的,的確
      可以,但并不是強(qiáng)制的。人都有惰性,當(dāng)我想對(duì) i
      加1的時(shí)候,干嗎非要調(diào)用函數(shù)呀?算了,直接i++多省事呀。呵呵,正式由于這個(gè)懶惰,當(dāng)
      程序出BUG的時(shí)候,可就不好捉啦。而面向?qū)ο笫菑?qiáng)制性的,從編譯階段就解決了你懶惰的
      問題。

        
      巧合的是,面向?qū)ο蟮乃枷耄鋵?shí)和我們的日常生活中處理問題是吻合的。舉例來說,我打
      算丟掉一個(gè)茶杯,怎么扔那?太簡(jiǎn)單了,拿起茶杯,走到垃圾桶,扔!注意分析這個(gè)過程,
      我們是先選一個(gè)“對(duì)象”------茶杯,然后向這個(gè)對(duì)象施加一個(gè)動(dòng)作——扔。每個(gè)對(duì)象所能
      施加在它上面的
      動(dòng)作是有一定限制的:茶杯,可以被扔,可以被砸,可以用來喝水,可以敲它發(fā)出聲音
      ......;一張紙,可以被寫字,可以撕,可以燒......。也就是說,一旦確定了一個(gè)對(duì)象,
      則方法也就跟著確定了。我們的日常生活就是如此。但是,大家回想一下我們程序設(shè)計(jì)和對(duì)
      計(jì)算機(jī)的操作,卻不
      是這樣的。拿DOS的操作來說,我要?jiǎng)h除一個(gè)文件,方法是在DOS提示符下:c:> del 文件名
      <回車>。注意看這個(gè)過程,動(dòng)作在前(del),對(duì)象在后(文件名),和面向?qū)ο蟮姆椒ㄕ庙?
      序相反。那么只是一個(gè)順序的問題,會(huì)帶來什么影響那?呵呵,大家一定看到過這個(gè)現(xiàn)象:
      File not
      found. “啊~~~,我錯(cuò)了,我錯(cuò)了,文件名敲錯(cuò)了一個(gè)字母”,于是重新輸入:c:> del 文
      件名2<回車>。不幸又發(fā)生了,計(jì)算機(jī)報(bào)告:File read only.
      哈哈,痛苦吧:)。所以DOS的操作其實(shí)是違反我們?nèi)粘I钪械牧?xí)慣的(當(dāng)然,以前誰也沒
      有提出過異議),而現(xiàn)在由于使用了面向?qū)ο蟮脑O(shè)計(jì),那么這些問題,就在編譯的時(shí)候解決
      了,而不是在運(yùn)行的時(shí)候。obj.fun(),對(duì)于這條語句,無論是對(duì)象,還是函數(shù),如果你輸
      入有問題,那么都
      會(huì)在編譯的時(shí)候報(bào)告出來,方便你修改,而不是在執(zhí)行的時(shí)候出錯(cuò),害的你到處去捉蟲子。

        
      同時(shí),面向?qū)ο笥帜芙鉀Q代碼重用的問題——繼承。我以前寫了一個(gè)“狗”的類,屬性有(
      變量):有毛、4條腿、有翹著的尾巴(耷拉著尾巴的那是狼)、鼻子很靈敏、喜歡吃肉骨
      頭......方法有(函數(shù)):能跑、能聞、汪汪叫......如果它去抓耗子,人家叫它“多管閑
      事”。好了,狗
      這個(gè)類寫好了。但在我實(shí)際的生活中,我家養(yǎng)的這條狗和我以前寫的這個(gè)“狗類”非常相似
      ,只有一點(diǎn)點(diǎn)的不同,就是我的這條狗,它是:卷毛而且長(zhǎng)長(zhǎng)的,鼻子小,嘴小......。于
      是,我派生一個(gè)新的類型,叫“哈巴狗類”在“狗類”的基礎(chǔ)上,加上新的特性。好了,程
      序?qū)懲炅?,并?
      是重用了以前的正確的代碼——這就是面向?qū)ο蟪绦蛟O(shè)計(jì)的好處。我的成功只是站在了巨人
      的肩膀上。當(dāng)然,如果你使用VC的話,重用最多的代碼就是MFC的類庫。

        六、組件(COM)程序設(shè)計(jì)

         有了面向?qū)ο蟪绦蛟O(shè)計(jì)方法,就徹底解決了代碼重用的問題了嗎?答案是:否!硬件
      越來越快,越來越小了,軟件的規(guī)模卻也越來越大了,集體合作越來越重要,代碼重用又出
      現(xiàn)的新的問題。
      我用C++寫的類,不能被BASIC重用——不能夸語言;你要干什么,想重用我的代碼?不行,
      這樣你就看見了我的設(shè)計(jì)思想——只能在源程序級(jí)別重用,不能在二進(jìn)制級(jí)別(可執(zhí)行代碼
      及)重用。

         我耗盡畢生的精力,寫了一個(gè)包羅萬象的類庫,但沒有人用。因?yàn)樗麄冋f:你這個(gè)太
      大了,我的程序只有1K,你卻給我一個(gè) 10000MB 的庫——MFC 的尷尬。

        
      太好了,我終于找到了程序中的一個(gè)BUG,已經(jīng)修改完成,而且是只改動(dòng)了一個(gè)字節(jié)。接下
      來我要重新向我的用戶分發(fā)新的版本,我的用戶有......10萬個(gè)——升級(jí)的非魯棒性,不是
      我分發(fā)累死了,就是用戶重新安裝累死了。(魯棒:robust。意為強(qiáng)壯性的,平順的,順滑
      的.....鬼知道是
      哪個(gè)不懂計(jì)算機(jī)的人翻譯的這個(gè)詞匯。)

        
      我想寫一個(gè)集大成的軟件,這個(gè)軟件的功能是我中有你,你中有我。既能實(shí)現(xiàn)文字編輯,又
      能實(shí)現(xiàn)電子表格計(jì)算,又能實(shí)現(xiàn)自動(dòng)翻譯,還能畫圖,還能實(shí)現(xiàn)數(shù)據(jù)庫檢索,還可以看電影
      .....只要用了我的這個(gè)軟件,想要什么就有什么,我要強(qiáng)占整個(gè)軟件的市場(chǎng)------OLE實(shí)現(xiàn)
      的重用功能,只
      要學(xué)會(huì)了COM,這些都不是問題了。

         用戶甲要求我的軟件窗口上下分割,用戶乙要求我的軟件窗口左右分割......我需要
      在我的軟件基礎(chǔ)上,派生出100個(gè)類型,可怎么辦呀?將來怎么維護(hù)呀?------在腳本的支
      持下,實(shí)現(xiàn)同一程序的的靈活配置而重用,問題迎刃而解了。

        
      我是個(gè)老板,你知道我有多痛苦嗎?我手下的員工向我提出加工資的要求,我不得不答應(yīng)呀
      。因?yàn)槿绻@個(gè)員工跳槽了,他的代碼要維護(hù)起來有多難?。。?#8212;—現(xiàn)在好啦,我要求員工
      統(tǒng)統(tǒng)用組件寫模塊,想加工資?門都沒有,威脅我要走?那你走吧,這個(gè)月的工資也不發(fā)了
      。反正用組件寫
      的代碼,我可以很容易地進(jìn)行包容和聚合實(shí)現(xiàn)維護(hù)。(老板的福音,程序員的悲哀)。

         還有好多那,現(xiàn)在想不起來了......

        
      COM程序設(shè)計(jì)方法,就是解決以上問題的一個(gè)方式。有很多朋友覺得COM非常復(fù)雜難懂,不想
      學(xué)習(xí)了。你一定學(xué)習(xí)過程序設(shè)計(jì)的最基本的方法(非結(jié)構(gòu)化設(shè)計(jì):匯編、gwBasic......)
      ,然后,你又學(xué)習(xí)了結(jié)構(gòu)化程序設(shè)計(jì)(C、Pascal......),然后,你又努力學(xué)習(xí)并熟練掌握
      了面向?qū)ο蟮某绦?
      設(shè)計(jì)方法(C++、Delphi、Java......),那么不要怕,要有信心去學(xué)習(xí)組件程序設(shè)計(jì),它只
      是一個(gè)設(shè)計(jì)方法和思想,并且是目前較高級(jí)的方法,如果不掌握,就太可惜了。

         學(xué)習(xí)了結(jié)構(gòu)化程序設(shè)計(jì),你就會(huì)“藐視”那些不遵守結(jié)構(gòu)化設(shè)計(jì)思想而寫出的代碼;

         學(xué)習(xí)了面向?qū)ο笤O(shè)計(jì),你就會(huì)“嘲笑”那些為找BUG而暈頭轉(zhuǎn)向的程序員;

         同樣,學(xué)習(xí)了組件程序設(shè)計(jì),你就會(huì)站在更高的層次看待程序設(shè)計(jì)。

        七、結(jié)束語

        
      寫程序的目的是什么?養(yǎng)家糊口、興趣使然、我的事業(yè)......這些都對(duì)。但我要強(qiáng)調(diào)的是:
      寫程序的目的是為了修改程序。在這個(gè)觀點(diǎn)上,那么寫注釋、寫文檔、選擇語言、選擇結(jié)構(gòu)
      ......都是為這個(gè)服務(wù)的。本文從軟件設(shè)計(jì)方法的進(jìn)化角度來反復(fù)闡述這個(gè)觀點(diǎn),希望愛好
      者能有所體會(huì)和
      思考。

        
      文中所討論的技術(shù)和觀點(diǎn),適合于大多數(shù)情況下的程序設(shè)計(jì),而對(duì)于特殊的應(yīng)用的(驅(qū)動(dòng)開
      發(fā),嵌入式開發(fā),網(wǎng)絡(luò)通訊,實(shí)時(shí)視頻......),這些領(lǐng)域中,由于硬件環(huán)境的限制和極限
      效率的要求,有些觀點(diǎn)就不合適了,需要具體情況具體分析。另外就是對(duì)于程序設(shè)計(jì)的初學(xué)
      者,可以先不考
      慮這么多問題,以掌握基本技巧方法和思想為要。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多