說明:減号,中劃線,dash,在本文中等同;下劃線,underscore,等同。“連接符”,泛指連接單詞的符号(故意沒使用“連字符”/hyphen,因為連字符通常就是中劃線/減号)。
下劃線在上
直觀的差别
下劃線在超鍊接中可讀性差
深入的差别以下劃線連接的字符串雙擊就會全部選中(注),而減号連接的字符串要全選需要用鼠标。所以下劃線連接更便利,這是一些同學選擇使用下劃線的一個理由。
這個差别已經接近下劃線和減号的本質差别了,那就是它們在“分詞”上的差别。在計算機世界裡,下劃線的連接通常作為一個“單詞”,而減号的連接不是。
注:其實并不是所有軟件中都這樣。随便試了一個版本的Word, 就不是這樣(後面圖中有)。
分詞的差别這裡的“單詞”不是英語的單詞(word),計算機世界裡我們通常說标識符(identifier)。在标識符裡,下劃線的地位和26個字母基本無差别,比數字的地位還高一點,因為數字通常不能做首字母。
在主流的正則表達式裡,用來表示“單詞”的字符,即\w是這樣的:[A-Za-z0-9_],也就是大小寫字母,數字和下劃線。注意,它不包含減号(這裡的減号是用來表示範圍的)。
所以,在計算機世界裡,大家對于"word"所包含的字符的約定基本是一緻的:包含下劃線,但不包含減号。
基于這個分詞原則,除了剛才的雙擊行為的差别,還會産生很多的差别。
排版的差别排版的差别主要體現在自動換行時。減号會作為換行時截斷的邊界,而下劃線通常不會。
Word中分詞/換行的差别
有些考慮不周的軟件,在面對超長的“下劃線單詞”時,由于不分隔還會造成“溢出”(超出了預期的界面區域)。
Jenkins中下劃線超長溢出(上下對比)
搜索的差别如果你的公司做了一款産品,型号叫作 mycompany_myproduct,假如文檔全程都用這個代号,極端點,沒有提到mycompany或myproduct這兩個單詞,那麼,對于某些搜索引擎,通過myproduct或mycompany将搜索不到這個頁面。
如果型号為mycompany-myproduct,通過mycompany和myproduct,則都是可以搜到的。在做SEO時,更需要考慮這種差異。
據說對于百度,兩者的差異比較小;而對于Google,用減号連接則更有優勢。畢竟多數人會傾向用 myproduct 的關鍵字進行搜索。
深入的邏輯從形式和邏輯組合上,共有4種符号用來區分隔斷。
所以,真正有意義的組合是前3個。我們可以選擇其它符号來表達這3種意思,但從外觀及傳統上,空格,減号,下劃線,這3個符号是比較好的選擇。
為什麼要用下劃線?最初,我們要用下劃線,是因為減号用來表示減法了。my-var 表示變量 my 減去 var;如果一個變量含有多個英語單詞,為了區分它們,而你又不想用駱駝命名法MyVar,就要用下劃線的my_var。大多數編程語言裡都這是這樣。
這種對标識符的要求會泛化,比如 Python 裡 package 的名字裡隻能用下劃線而不能用減号,從而導緻作為模塊的文件名不能用減号(但作為一般的不被引用的程序文件還是可以用減号的)。
這種泛化進一步蔓延到了C/C 世界裡,比如Google prefer的C 文件名是下劃線(盡管可以用減号)。
這種泛化最後可能會蔓延到所有需要連接單詞的場景上。畢竟人們更容易接受單一的規則。
可以不用下劃線的編程世界但這不是絕對的。
LISP類語言在能明确區分操作符和連接符的語法裡,标識符就可以包含減号了,比如LISP,操作符是前置的,元素以空格或括号分隔,這樣标識符就可以随意包含減号了。
(let ((my-var 300) (your-var 100))
(print (- my-var your-var)))
上面的和下面的代碼,結果都是200。"var-300", "var-100", 甚至"300-300", "1-100"都隻是标識符而已,不會被當作減法表達式。隻有列表裡的第一個元素是減号才表示減法操作。
(let ((var-300 300) (var-100 100))
(print (- var-300 var-100)))
(let ((300-300 300) (1-100 100))
(print (- 300-300 1-100)))
在XSL中,大量使用帶減号的關鍵字,比如for-each, value-of, copy-of。同樣,你自己的标識符當然也可以包含減号,比如下面代碼中的my-header。
<xsl:variable name="my-header">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
</xsl:variable>
<xsl:template match="/">
<table border="1">
<xsl:copy-of select="$my-header" />
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
CSS中也是這樣。
.banner {
border: solid black 1px;
box-shadow: 1px 2px;
background-color: yellow;
text-align: center;
box-sizing: border-box;
width: calc(100% - 80px);
}
它有專用的關鍵字用來引用變量的值(var),和做表達式計算(calc),所以它可以肆無忌憚地用減号開頭的标識符。
.foo {
--widthA: 100px;
--widthB: calc(var(--widthA) / 2);
--widthC: calc(var(--widthB) / 2);
width: var(--widthC);
}
一種感覺,在HTML的世界裡,似乎很抵觸用下劃線。HTML/CSS/XML/XSL的關鍵字裡,似乎都是用減号而不是用下劃線。
思考:語言隻是一種約定嗎?小時候,一些讀錯的多音字,現在已經變成了正确的。因為大多數人都按照“錯誤”的在讀,比如呆闆,曝光,等等。
畢竟,語言的功用是交流,大多數人都能理解才是重要的,既然絕大多數人都認為它應該那麼念,“将錯就錯”也沒什麼不好。而且,原來的那種“正确”的讀音也沒有反映出更多或更正确的本質。
我就職的上一家公司,到處都是下劃線,比如在Linux内核代碼裡,如果看到下劃線命名的文件,那基本上就是我們公司增加的。換了一家公司後,這種現象有過之而無不及,幾乎凡是需要連接單詞的地方,都是用下劃線。
作為一個中老年碼農,我應該高興,這說明碼農已經開始占領世界了。
那麼,糾結用下劃線還是減号,是不是像糾結生僻的多音字,或茴字有幾種寫法,變得不合時宜?我是否應該随大流?
但據我有限的觀察,在英語的技術世界裡,仍然是有區分地使用兩者,并沒有無腦用下劃線。
另外一點堅持就是邏輯上我們需要這兩種符号:一種表示強連接,一種表示弱連接(如前所述)。兩者并不完全是替代關系。
結語及倡議下劃線和減号都可用于連接字符串,這時它們的本質差别在于:分詞邏輯的不同。
在國内軟件領域,個人觀察,下劃線有被濫用的迹象。但在英文世界裡,在代碼以外,基本仍然遵循英文書寫的習慣,使用減号作為連接符。
所以我倡議:如非不得已,盡量使用減号作為連接符。
概括地說,目标是給機器(比如編譯器)看的領域,比如源代碼和某些語言的文件名,使用下劃線;目标是給人看的領域,比如UI,技術文章,遵循英文書寫習慣,使用減号。這樣具有最好的兼容性。
使用減号的連接
作為個人,入鄉随俗,在某個特定的技術領域、特定的團體,以局部的規則和約定為優先。但另一方面,作為規範的制定者,要考慮“真正的主流”及其内在邏輯,不要輕易将規則擴大化。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!