7種過(guò)時(shí)的代碼風(fēng)格
如果您已經(jīng)進(jìn)行了十多年的編碼,那么您可能會(huì)擁有一些堅(jiān)定的首選樣式,您會(huì)堅(jiān)定地相信這些樣式,并堅(jiān)持自己的觀點(diǎn)來(lái)捍衛(wèi)它們直到最后。
下面是我曾經(jīng)堅(jiān)定支持過(guò)的一些人,但現(xiàn)在我認(rèn)為我必須放手。
1. 使用m或this表示成員變量
規(guī)則:要區(qū)分成員變量和局部變量,請(qǐng)使用以下任一方法:
- 使用匈牙利表示法,即mMemberVariable與localVariable。 其中m代表成員變量。
- 這個(gè)的使用 this.member變量與局部變量。
過(guò)時(shí)的原因:
原因是當(dāng)我們閱讀代碼時(shí),可以很容易地知道它們是成員變量還是局部變量,而無(wú)需查看它們的聲明。
- class MyClass {
- var mMember = "member"
- fun doSomething() {
- val local = "local"
- println(this.mMember)
- println(local) }}
現(xiàn)在:
如果是現(xiàn)代IDE,則不再需要這種基于文本的區(qū)分。 參見(jiàn)下面的相同代碼,它將自動(dòng)為它們涂上不同的顏色。
> Different coloring of variables
2. 明確聲明Public,Protected或Private
規(guī)則:一個(gè)類(lèi)中的所有變量和函數(shù)都必須明確聲明為public,private或protected。 不要采用默認(rèn)狀態(tài)。
- 需要明確說(shuō)明類(lèi)型,例如 字符串或整數(shù)
- 需要明確說(shuō)明它是私有的還是公共的
- public class MyClass {
- public val publicVariable: String = "100"
- private fun privateFunction() {}
- public fun publicFunction() {}
- }
過(guò)時(shí)的原因:
這是為了避免有人錯(cuò)誤地訪問(wèn)這些函數(shù)或變量,即,如果未聲明函數(shù),則用戶(hù)可能不知道默認(rèn)狀態(tài)(如果是公共狀態(tài)或私有狀態(tài))。
現(xiàn)在:
使用現(xiàn)代IDE,我們無(wú)需明確聲明默認(rèn)值,例如 對(duì)于公開(kāi)的Kotlin。 用戶(hù)不會(huì)無(wú)意中誤認(rèn)為默認(rèn)狀態(tài),因?yàn)樽詣?dòng)完成只會(huì)顯示公共方法。 因此,不太可能有人會(huì)混淆默認(rèn)狀態(tài)。
> The private Function won't appear on auto-complete
如果有任何錯(cuò)誤用法(例如訪問(wèn)私有功能),它不會(huì)僅在編譯時(shí)出現(xiàn)錯(cuò)誤。 立即出現(xiàn)錯(cuò)誤并顯示一條清晰消息。
3. 總是顯式聲明變量類(lèi)型
規(guī)則:所有變量均應(yīng)使用其類(lèi)型聲明,即使從已為其賦值的值很明顯即可,例如 需要明確說(shuō)明類(lèi)型,例如 字符串或整數(shù)
- public class MyClass {
- public val publicVariable: String = "100"
- private fun privateFunction() {}
- public fun publicFunction() {}
- }
過(guò)時(shí)的原因:
這是為了避免有人錯(cuò)誤地訪問(wèn)這些功能或變量,例如 變量分配給錯(cuò)誤的類(lèi)型,并導(dǎo)致編譯錯(cuò)誤。
現(xiàn)在:
如果使用現(xiàn)代編程語(yǔ)言,則在可推斷且明確的情況下,無(wú)需顯式聲明變量的類(lèi)型。 這稱(chēng)為類(lèi)型推斷。 如今,它可以多種現(xiàn)代語(yǔ)言提供。
如果有任何錯(cuò)誤的分配等,它不會(huì)僅在編譯時(shí)出錯(cuò)。 立即出現(xiàn)錯(cuò)誤并顯示一條清晰消息。
> 10 + MyClass().publicVairable will error out immediately as Int and String can't be added together
4. 成員變量應(yīng)始終為私有
規(guī)則:所有應(yīng)為私有的并通過(guò)getter和setter訪問(wèn)的成員變量適用于需要在外部設(shè)置或獲取的成員變量。
- public class MyClass{
- private var member = "member";
- public fun getMember(): String {
- return member;
- } public fun setMember(value: String) {
- member = value; }}
過(guò)時(shí)的原因:
如果我們將其公開(kāi)以進(jìn)行設(shè)置和獲取,則在設(shè)置或獲取它們時(shí)需要執(zhí)行一些操作時(shí),我們需要更改所有訪問(wèn)它的代碼。
因此,如果我們限制使用getter和setter,則可以控制它。
- class MyClass{
- private var member = "member";
- fun getMember(): String {
- println("Setting member") return member;
- } fun setMember(value: String) {
- println("Setting member with $value") member = value;
- }}
現(xiàn)在:
在現(xiàn)代語(yǔ)言(例如Kotlin)中,我們可以在需要時(shí)輕松地將變量getter或setter插入變量,而無(wú)需明確地具有兩個(gè)僅用于設(shè)置和獲取的函數(shù)。
因此,我們可以按以下方式進(jìn)行編碼,而無(wú)需在類(lèi)中添加附加的setter和getter函數(shù)。
- class MyClass { var member = "member"}
當(dāng)我們需要對(duì)setter或getter進(jìn)行操作時(shí),我們可以輕松地添加它們,而無(wú)需更改訪問(wèn)成員的代碼。
- class MyClass {
- var member = "member"
- get(): String {
- println("Setting member")
- return field
- } set(value: String) {
- println("Setting member with $value")
- field = value
- }}
5. 開(kāi)始和結(jié)束大括號(hào)應(yīng)對(duì)齊
規(guī)則:所有大括號(hào)應(yīng)在同一列對(duì)齊,以便我們可以輕松找到它們,例如:
- class MyClass
- { private var member: String = "member"
- fun doSomething(state: Boolean)
- { val local = "local"
- println(member) println(local) }}
過(guò)時(shí)的原因:
原因是通過(guò)垂直查看,我們可以輕松找到它們的對(duì),從而知道函數(shù)的作用范圍在哪里。
現(xiàn)在:
使用新的IDE,只要代碼看起來(lái)很整潔,我們就不再需要在同一列上對(duì)齊開(kāi)始和結(jié)束大括號(hào)。
- class MyClass {
- private var member: String = "member"
- fun doSomething(state: Boolean) {
- val local = "local"
- println(member) println(local) }}
這是因?yàn)槲覀兛梢暂p松折疊或展開(kāi)它們,如下所示。
> Easily expand or collapse code scope
要了解有關(guān)大括號(hào)的更多信息,請(qǐng)查看以下內(nèi)容。
6. 對(duì)所有縮進(jìn)使用制表符
規(guī)則:對(duì)所有縮進(jìn)使用制表符,而不要使用空格
過(guò)時(shí)的原因:
這減少了所需的鍵入次數(shù)。 例如 下面顯示了使用空格時(shí),必須多次鍵入
> The old text editor, one need to type every space
現(xiàn)在:
使用IDE,它將為我們自動(dòng)縮進(jìn)適當(dāng)數(shù)量的空格。 擁有空格還將確保所有代碼在整個(gè)用戶(hù)環(huán)境中看起來(lái)都一致。
> The modern IDE, till perform auto-indentation of spaces
7. 使用分號(hào)結(jié)束代碼聲明
規(guī)則:在結(jié)束代碼語(yǔ)句時(shí),必須使用分號(hào)。
過(guò)時(shí)的原因:
這是必需的,因?yàn)閺那暗木幊陶Z(yǔ)言(包括C和C ++,Java等)使解析器識(shí)別它已經(jīng)結(jié)束。 部分原因是因?yàn)槲覀冇?0列,因此當(dāng)需要為一條語(yǔ)句編寫(xiě)更多代碼時(shí),我們可以為一條語(yǔ)句編寫(xiě)多行代碼。
現(xiàn)在:
使用新的現(xiàn)代語(yǔ)言(例如Kotlin),不再需要編寫(xiě)長(zhǎng)語(yǔ)句(例如,我們可以將變量命名為較短,縮進(jìn)的縮進(jìn)形式)。
即使我們需要編寫(xiě)更長(zhǎng)的語(yǔ)句,我們也不再受限于8列(盡管這不是一個(gè)好習(xí)慣)。 此外,這幾天我們的顯示器更長(zhǎng)longer
> Photo by Fotis Fotopoulos on Unsplash
因此,如果一種語(yǔ)言不允許使用分號(hào),那就去吧!
要進(jìn)一步詳細(xì)說(shuō)明項(xiàng)目4–7,您可以閱讀以下內(nèi)容。
通過(guò)改變對(duì)上述7種編碼樣式的信念,我對(duì)代碼進(jìn)行了如下更改:
世界在不斷變化。 過(guò)去的要求可能不再適用。 借助技術(shù)和工具,我們應(yīng)該始終重新評(píng)估我們?cè)?jīng)擁有的規(guī)則,并繼續(xù)前進(jìn)。
感覺(jué)這么年輕。 看看編碼行業(yè)是如何變化的!