程序中的變數名總是起的很長怎麼辦?英文單詞的縮寫有規律么?
@陳甫鵃 舉得例子,是一個很好的「介面與實現耦合」的例子。一個介面要用的爽,就要讓人在用的時候根本沒想起要去看實現的衝動,保持一無所知的狀態。現在你把實現通過名字暴露了出來,那根你把private的東西變成public,在心之負擔上是一樣的沉重。
領域相關的東西是可以有縮寫的。譬如我有一個庫專門處理xml,那我一定會把所有叫xml的東西都叫xml,而不是ExtensibleMarkupLanguage。 @陳甫鵃 的那個DomainControllerInformation也一樣,如果真的到處出現,那些成dci也沒有什麼不好。
所以我覺得嘛,題主如果用的是C#,那隻要把自己的東西都明明到看起來和用起來都跟.net framework的感覺差不多就行了
謝邀。
首先,不知道你說的長是個什麼概念,個人覺得,在現在有IDE,有代碼提示的情況下,二三十個字元都算是可以接受的。
我們這裡稍微推廣一下吧,不僅限於變數名,所有標識符(變數名、函數名)都算進去。起標識符名字,關鍵是要清晰,能夠正確的表明含義、功能、作用,保證代碼的可讀性。所以,在保證代碼良好可讀性的前提下,變數名稍微長一些其實沒什麼不好,現在的存儲空間不在乎這一點浪費,現在的編譯器也沒有對變數名的長度做什麼硬性的要求。
在這個原則下,變數名一般就只有兩三個單詞,比如,函數(方法)應該是一個動詞或者動賓短語(動詞+定語(形容詞)+賓語(名詞)),比如getResponse,sendRequest,如果是C裡面的函數,可能會帶有一個前綴,比如說pcap_sendpacket,lua_pushinteger。對於成員變數(成員),則應該是一個名詞或者偏正短語(形容詞+中心語(名詞)),比如RequestHeaders,BufferSize,BackgroundColour。
按照這樣的方法,名字一般都不至於太長。由於前面我們有一個保證可讀性的原則,所以,我個人不提倡使用縮寫。即使是使用,也應該是一些熟知的縮寫,比如dev=device,admin=administrator,def=define,func=function,var=variable,val=value,ret=return,int=integer,if=interface,info=information,stat=statistics等等。而且,在使用的時候,應該保證整個代碼的風格比較統一,不要有的地方用縮寫有的地方不用。
另外,多用一些人家寫的比較好的類庫,就知道那些東西該怎麼命名了。不少答案都在討論長變數名是否可取,有點兒答非所問的嫌疑。問題明明問的是「怎麼辦?」,而沒問「好不好?」。
=======================================首先聲明,我是長變數名的擁躉,可同時也踐行單行最長120左右字元。(寬屏)
+++++++++++=++然後回答問題++++++++++++++++如果你覺得變數名太長了,請檢查是否存在下面的問題:是否在變數名或類名中使用了類型信息如: string nameString // 叫name就可以了。變數名中附加類型是種很不良的風格。是否重複了上下文信息如: class Book 中的成員 string BookName // 叫name就可以了。白痴當不了程序員然後來讀代碼。再如:TcpConnectionBufferSize tcpConnectionBufferSize // 叫size就可以了,只要別叫tcbs是否承擔了過多的責任如:serviceInstanceThatAlsoSupportCallback //其實可以分成兩個變數
=======================================當人們在談論長變數名,推薦長變數名的時候,你得先想想原因,他們到底是要避免什麼問題、解決什麼問題?在我看來,大都是被tcbs, dcic這種變數名虐過,但是他們應該也不會希望看到serviceInstanceThatAlsoSupportCallback這樣的變數名。
凡事都有個度,過尤不及。關於如何縮寫英文單詞,代碼大全這本書有寫,不過我記憶有些模糊了。
1. 按照英語縮寫習慣,大致能保留原意就行2. 禁止使用單個字母,循環計數除外。3. 個人不建議超過三個單詞,盡量不用縮寫。其實關鍵在於基於業務起合適的名字,還有就是保證團隊中每個人都能認同和遵守,合理是最重要的。
補充一點,在Objective-C中,方法名是不在乎長的,它更注重可讀性。
..源代碼讀少了主要靠自己憋都會遇到這個問題看多了就心裡有數了
以下請google(僅c語言):- nasa c style linux kernel coding style c coding style
c naming conventions
-前兩個搜索目標比較確定。後兩個基本看google第一頁就可以了。我說一下我自己喜歡的命名規範,在C#中
1. 從不使用「_」開頭的變數名
2. 不使用匈牙利命名法
3. 當一個變數名為一個單詞時盡量簡化(eg. 「attributes 」簡寫為」attrs「)
4. 使用類名為後綴,如」playButton「、」fileNameTextbox」
5. 數組或列表變數名後加-s,如「var innerExceptions = from ie in ex select ex.InnerException;「
6. 不使用」_「來分割單詞
感謝下 @納米黑客 邀請。
原則上變數名起得長一點不是問題,這倒是說明程序員有一個相對良好的編程習慣。我記得以前我回答過類似的問題:http://www.zhihu.com/question/19869158/answer/13228097
瀏覽了一下已有的回答,我覺得@余天升的回答我最認同,就他了吧。但我在這裡提一個反例作為補充。我見過有程序員把類名寫得過長的,比如:
namespace RetrieveDomainControllerInformationNS { class RetrieveDomainControllerInformation { ... } }函數名變成 public static DomainControllerInformationCollection RetrieveDomainControllerReplicationInformation(...)最後的調用變成:
RetrieveDomainControllerInformationNS.DomainControllerInformationCollection domainControllerInformationCollection = RetrieveDomainControllerInformationNS.RetrieveDomainControllerInformation.RetrieveDomainControllerReplicationInformation(...).
看到問題了沒有?大量的信息關鍵字(Retrieve DomainController Information Collection)重複出現在命名空間,類名、變數名甚至是方法名上。其實這些信息只需要出現一次就好,多出來的根本無助於理解代碼還會讓人讀得窩火。當時我看完代碼之後滿臉黑線地跟同事打賭說寫這代碼的仁兄必定有兩個21寸的顯示器,後來去了一看果不其然,可惜苦了我這隻有一個17寸顯示器的倒霉鬼,哈哈。
順便說一句,其實我不同意@yaocoder的看法,變數名長度對如今多數語言是無所謂的,但有一種例外,就是發布後的瀏覽器端的Javascript。畢竟這東西是從伺服器下載的,每個位元組都是流量啊。這種情況下如果沒有條件做混淆,那麼還是盡量把名字起短一點好。盡量別縮寫,縮寫也盡量用約定俗稱的,現在IDE都自動完成也不用你敲。代碼自注釋性要比你少敲幾個碼重要的多,交流也方便。
盡量用名字空間、代碼文件名、類名、庫名等,分解長變數名的限定詞。
只用在一個函數里的結構名、變數名、函數名等,可以放心縮寫,然後寫很長的注釋。
因為變數名的長短不會影響程序的執行效率,所以可以適當的長一點,寧可寫長一點也不能為了縮短長度而讓自己都看不懂。英文單詞縮寫的規律沒仔細研究過,一般最常見的就兩種形式的:
- 去掉母音字母(如果第一個字母是母音,一般不去掉),只用比較有代表的輔音字母,比如 control -&> ctrl, args -&> arguments
- 取前幾個字母,比如 parameter -&> param,document -&> doc
此外還有些不常用的,比如2 代表to,4代表for,還有比較詭異的i18n等。
其實很多常用單詞的縮寫都是約定俗成的,比如上面舉的幾個例子,一般都是這麼縮寫的。很多開源項目的命名縮寫都是非常規範的,多看看,熟練就好。
比較少見的單詞一般不縮寫,縮寫了很可能別人看不懂。當然有啊,很多約定俗成經典的命名方法,比如將message縮寫成msg,system縮寫成sys,document縮寫成doc等等,如果是一些生僻詞的話一般取前面幾個字母,最好是讓人能夠猜到是什麼意思的。在公司裡面的話一般會有些命名規則表,照著轉換就行。
不知道你所指的語言是否為c++語言(其實關於變數名這塊無在乎語言),我個人比較推崇google的 c++規範,所以建議你仔細閱讀下http://codinn.com/projects/google-cpp-styleguide/view/index.html
多看源代碼,不同的優秀源代碼之間都很有默契,看多了感覺就來了
沒有所謂標準, 只有慣例, 多看一些代碼, 可以看到很多相通的規則. 我很討厭長變數名, 當然前提是你不要隨便自創縮寫, 慢慢積累即可.
補充一個縮寫方法:單詞只保留輔音字幕,如recieve縮寫rcv
大學時不知道匈牙利命名法,變數名取了ijkl這類風格,程序最終結果怎麼都不對,就30多行的代碼硬是找不到錯誤,被白白折騰掉一晚上,後來還是同學旁觀者清幫忙發現了錯誤所在,原來把該寫k的地方用了j。
從那以後,堅決用完整變數名,任何人用ijkl,就給他講我這個故事,強迫對方改正。我特別喜歡用單詞的首字母做變數名,例如在一個很容易看懂的小方法里,變數名都是單字母的,因為意思顯而易見,沒必要表達清楚。我覺得這樣寫出來的js很好看。。。當然多用戶協作的時候不鼓勵這麼寫。。。。
比如我常用的
dict_user 表示用戶字典我會用注釋寫清楚該字典結構list_query表示路徑列表,依然會用注釋說明清楚。table_student表示學生表對象,表結構依然注釋說明清楚。命名其實能讓自己很容易看懂,能讓後來人很容易看懂。其他的,也沒什麼了。被 String str bool b 虐幾次 你就會感覺長變數名是多麼的美好
推薦閱讀:
※如果重新設計C#你最希望增加什麼特性,去掉什麼特性,改變什麼語法?
※Unity3d&Cocos2dx進階書籍推薦?
※new和malloc內部的實現方式有什麼區別?
※如何高效的學習Nginx源碼,汲取養分?
※為什麼說goto是一種不好的用法?
TAG:編程 |