我看到了舊時的C語言疤痕……

jopen 11年前發布 | 5K 次閱讀 C語言

我看到了舊時的C語言疤痕……

        英文原文:Old C scars, I see...

        一個月前,我正在寫一個簡單的應用,是用 ruby 去讀 pdf 文件,不知道為什么,文件指針跑到了文件開始地址的前面。我不明白為什么會這樣。于是,像往常一樣,我到 stackoverflow 上發帖求助。得到的第一條回復是:

“你的代碼有C語言的味道….”

        有什么??進一步的閱讀,我發現在 ruby 里有一個很方便的 IO 操作包,根本不需要使用 getc (這是我的習慣用法)——除非在一些特殊情況下。

        我想說的是,用一種新語言編程,在學會這種語言的正確語法前,你需要了解它的基本原理。當你說“我會 XXX 語言”時,你的意思并不是指知道它的語法。而是知道這種語言里有更好的算法實現方法和問題解決方案,否則,你學習這種新語言的意義在哪里呢?!

        讓我們來分析一個問題,假設我們需要找到一個文件的最后一行的開始處(這是我以前做過的一個任務)。

        像我這樣懂得一點C語言的人會這樣寫:

fseek (fp,-1,SEEK_END);
        do {
                fseek (fp,-2,SEEK_CUR);
        }while(fgetc (fp)!='\n');

        用 ruby 也能寫出類似的代碼,讓你一個新學習 ruby 的C程序員來寫,他就會寫出這樣:

i) file.seek (-1,IO::SEEK_END)
    while file.getc != "\n"          file.seek (-2,IO::SEEK_CUR)
    end    

        但是,一個熟練的 ruby 程序員則會寫成這樣:

ii) buff = file.readlines
        file.seek (-(buff.pop) .length,IO::SEEK_END)
        或
iii) lastline = Elif.open ("file.txt") { |f| f.gets }
        file.seek (-lastline.length, IO::SEEK_END)

        對我來說,iii)是最好的實現方法,它能處理大型文件,不管日后它增長到多大。這個 Elif 工具包把文件切割成了很小的片段,把它們放到小的緩沖池里,分析完后從緩沖里清除掉。你可以看一下它的 gem 源文件。如果你研究源文件,你會發現,任何一個需要使用到的字符串對象方法都使用的非常聰明。

        這只是一個簡單的例子,來說明改變思維習慣是如何能巨大的提高你的代碼效率。我知道,作為一個新語言學習者,學會用新的語言風格和思維習慣編程 是很困難的。我記得當老師在課堂上教我們匯編語言時,很多人會先把作業用C語言寫成,然后再寫出匯編代碼,因為他們更熟悉C語言。但是,如果你有了一定經 驗,而你的程序中仍然有一些老的語言的痕跡,這說明你遇到了麻煩。

        所以,如果我學習一種新語言,過程會是:

        基本原理 –> 語法 –> Library/APIs

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!