2022-01-03|閱讀時間 ‧ 約 8 分鐘

咬文嚼字幫變數取名字

寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。就好像網址一樣,要取得好,才容易辨識、記憶。對企業而言,網址是兵家必爭之地,被網路蟑螂給捷足先登,那可就得花一大筆錢才能消災了。
變數名稱要有意義,這是老生常談,但要怎麼個有意義法,那可就傷腦筋了。現在養成的習慣做法,就是如果有參考資料,例如參考某篇論文或文件寫的,那就用參考資料內的慣用字眼。當然啦,在註解的部分,一定要把參考資料的來源交代清楚,也要完整說明變數的意義,這樣以後就可以按圖索驥,很容易就知道程式寫的是什麼了。
這次在寫Game of Life時偷懶,隨便在網路上搜尋到那幾條規則,挑了個中文的,也沒詳細看完,就直接寫起程式來了。結果,在一剛開始取變數名稱時,就糾結了好久。勉強把變數名稱搞定後,寫到那幾條規則時,怎麼覺得怪怪的,似乎邏輯上有些問題,只好乖乖的去讀維基百科,英文版的。看過英文版的維基百科後,才知道走了好些個冤枉路,直接用裡頭使用的單字就好,根本不需要在那邊糾結。
之所以要讀英文版的,是因為根據經驗,中文在描述科學或工程技術的內容時,很容易會語意不清,沒法描述得很精準。英文當然也會碰到類似的問題,但比起中文來,還是比較容易描述得精準一些。例如,「向前看」這句中文,如果是指方位的話,那很清楚,就是看「前面」的意思,但如果是指時間呢?是指「未來」還是「過去」?如何把一件事描述得很精準,不管是用中文還是英文,對作者來說都是考驗,只是因為語言的天性,英文佔了那麼些便宜,但要說到文學上朦朧美的意境,那我就覺得英文比不上中文了。
那一開始取變數名稱的時候,到底在糾結些什麼呢?這個Game of Life是發生在棋盤狀的二維世界中,所以很自然的就會想到可以用處理影像的方式來處理。cell對應的,就是pixel。cell只有活或死兩個狀態,對應到pixel就只有0或1兩個值,所以可以用處理黑白影像的觀點來寫。既然是處理影像,那就要有個二維array來存放影像。這個array的名稱要取什麼呢?直接就叫cell嗎?不是很好,
看不出來是cell生存的地方。那map如何?就當是game的地圖。這主意不錯,只是Spyder顯示map被用掉了。habitat 呢?cell又不是動物,這字眼不合適。environment呢?怪怪的。糾結了老半天,最後決定用world這個字,勉強接受而已啦!
光是決定array的名稱就花了不少時間,在寫註解時,也一樣是一個頭兩個大,糾結了不少時間,就只是要挑個合適的字眼。哪個字眼這麼難決定啊?就「狀態」啊!
先等等!註解就只是註解,又不會被執行,那用中文寫不就得了,幹嘛用英文來虐待自己?是可以用中文啦!不過Python官網裡頭的建議是說,母語不是英文的人在寫註解的時候,除非百分之一萬確定就只有使用你的母語的人會看你的程式,不然就應該用英文寫,畢竟註解對於程式的可讀性來說,是非常重要的,當然要能讓越多人看得懂越好。所以囉!即便要使出洪荒之力,也都要用我那破得不能再破的英文來寫。
回到令人糾結的「狀態」。英文裡頭state和status都是狀態的意思,那該用哪個字啊?這時候就可以感受到英文的精準和中文的朦朧美了。「state status difference」這幾個關鍵字一搜尋,馬上一卡車的連結出現,有中文的、英文的、簡體的、繁體的,任君取用,顯然這問題困擾著不少人哩。其實如果常搜尋類似的相似字詞問題,就可以發現,有些英文字詞間的差異,即便是母語為英文的人都說不清楚,只說在某些情況下會用這個字,某些情況下會用那個字,某些情況下這兩個字可以互換,不影響含意。現在有專門在講「搭配詞Collocations」的書,倒是該多看一看,語言這種東西,有時候是沒啥道理可言的,像極了愛情啊!
讀了好些說明之後,總算稍微理出個頭緒來了。status指的是在一個過程或程序中,某個時間點的狀態;state指的就只是某個時間點的狀態,無關過程或特定的程序。例如網購的時候,我們可以查現在貨品的status,因為這是一個貨品從出貨到送達我們手中的過程。至於state,我們常說水有液態、氣態、固態三種不同的狀態,這時用的就是state這個字。
好啦!搞清楚了state和status這兩個字的差別了,那描述cell的狀態該用哪個字呢?cell就只有活或死兩個狀態,而且同一個位置上的cell,在不同時間點,並不一定是同一個,有可能是原本的cell死掉之後,另一個活的cell佔據了同樣的位置。換句話說,同一個位置上的cell,並沒有「成、住、壞、空」的生滅過程。既然如此,那就應該用「state」這個字囉!
糾結了好久,總算把變數名稱和註解搞定,開始寫程式。好笑的是,當程式寫了一部份,發現那幾條一開始查到的中文版規則怪怪的,不得不摸摸鼻子,乖乖地去讀維基百科(當然是英文版的:P),而在Rules這節有著這麼一句話:
The universe of the Game of Life is an infinite, two-dimensional orthogonal grid of square cells, each of which is in one of two possible states, live or dead, (or populated and unpopulated, respectively).
好嘛!還能怎麼樣咧?universe!universe!universe!人家用的是universe這個字,只好兩眼翻白,把world全部改成universe。至於state這個字,倒是選對了,只是浪費了不少時間。這就是偷懶的結果,偷雞不著,蝕把米啊!不過話又說回來,雖然繞了遠路,浪費了時間,但也不是完全沒收穫,至少有運動到,增進了身體健康……喔!不是啦!是至少把state和status這兩個字的差別給搞清楚了。
等一下~~~這事還沒了!為什麼「生」和「死」兩個狀態,維基百科那段話中,用的是「live」和「dead」? dead這字沒問題,可live這字就怪了,活著的英文不是alive這個字嗎?根據查到的資料,live當形容詞時,有好幾個意思,其中一個意思和alive一樣,但是live是attributive adjective;而alive是predicate adjective。也就是說,live會放在要形容的名詞前,alive則放在要形容的名詞之後。原來如此啊!
咬文嚼字將告一段落時,電腦喇叭裡正流瀉出Dana Winner唱的The Sound of Silence...
Youtube真是個好東西!沒有它,大概這輩子不可能會知道有Dana Winner這麼棒的歌手。同一首歌,還可以聽到許多不同的版本。
People talking without speaking. People hearing without listening.
語言文字會隨著時間的流逝轉化含意,因而能承載描繪更多人們的喜、怒、哀、樂,但這卻也苦了學習的人。程式語言是人造的,雖然有一定的規則可遵循,不會有奇怪的例外或隱喻,學習起來比自然語言要輕鬆多了。但是啊但是,它還是跟自然語言一樣,會有新的元素或觀念加入,也會淘汰某些不再適用的元素或觀念。不管是程式語言還是自然語言,都是語言,想要運用自如並能體會其中的美,練習與閱讀是必須的。
程式語言、閱讀、美,這三個能有什麼關連?寫多了、讀多了就知道!
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.