2009-11-27 147 views
1

我們用包含任意標點符號的任意字符串進行大量的詞法處理。我分爲是否使用魔法字符/字符串或符號常量。使用魔術字符串或常量處理標點符號?

應該將這些示例閱讀爲與語言無關,但大部分都是Java。

在有些情況下標點符號有語義的作用,應當認定爲一個常數明顯的例子:

File.separator"/""\\"; //不用理會,因爲它依賴於操作系統

和我寫的XML_PREFIX_SEPARATOR = ":";

但是讓我們假設我需要用空字符串「`替換""的所有示例。我可以這樣寫:

s = s.replaceAll("\"\"", ""); 

s = s.replaceAll(S_QUOT+S_QUOT, S_EMPTY); 

(我已經定義了所有常用的標點S_FOO(串)和C_FOO(焦炭))

贊成魔術字符串/字符:

  1. 它更短
  2. 閱讀有時很自然(有時)
  3. 命名常量可能並不熟悉(C_APOS VS '\''

贊成常數

  1. 這是很難做的錯別字(例如對比"''" + '"'S_APOS+S_APOS + C_QUOT
  2. 它消除了轉義問題如果正則表達式是"\\s+""\s+""\\\\s+"
  3. 這很容易搜索代碼,標點符號

(有這個限制 - 我不會寫正則表達式,即使正則表達式語法都是編程中最認知功能障礙的部分之一這種方式,我認爲。我們需要更好的語法。)

回答

1

如果定義可能會隨着時間或安裝而改變,我傾向於將這些東西放在配置文件中,並在啓動或按需提取信息(取決於具體情況) 。然後提供一個帶有隻讀接口的靜態類,並在屬性上清除名稱以將信息公開給系統。

用法看起來是這樣的:

s = s.replaceAll(CharConfig.Quotation + CharConfig.Quotation, CharConfig.EmtpyString); 
+0

我很高興看到我並不孤單地提倡這種程度的冗長 – 2009-11-27 08:17:26

+0

我傾向於在團隊中與我合作使用長名稱的東西... – 2009-11-27 08:19:02

1

對於一般的字符串處理,我不會用特殊符號。空間永遠是一個空間,閱讀(寫作!):

s.replace("String", " "); 

比:

s.replace("String", S_SPACE); 

我會特別小心,使用像「\ t」的代表標籤,例如,因爲它們不能輕易地從空間的區別串。

至於喜歡的事情XML_PREFIX_SEPARATORFILE_SEPARATOR,你應該從來沒有處理這樣的常量,因爲你應該使用一個程序庫來爲你工作。例如,你不應該手寫:dir + FILE_SEPARATOR + filename,而是打電話:file_system_library.join(dir, filename)(或者你正在使用的任何等價物)。

這樣,你不僅有東西,像常量的答案,你就會得到更好的處理各種邊緣的情況下,你可能不會想到,現在

+0

我完全同意圖書館。我使用他們,我寫他們。然而,有些時候我需要訪問原語 – 2009-11-27 08:28:46

+0

@ peter.murray.rust:是的,當你需要原語時(例如,在編寫一個庫時!),肯定有很多情況。但是我注意到很多時候當人們詢問基元時,答案是更高層次的抽象,所以我想提供它作爲另一種選擇。 – 2009-11-27 10:38:54