<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

代碼不規范,同事兩行淚?

最近參加了一個比賽,然后看到隊友編程的代碼,我覺得真的是覺得注釋和命名規范的重要性了,因為幾乎每個字符都要咨詢他,用老師的話來說,這就是命名不規范的后續反應。所以此時的我意識到寫一篇關于注釋程序的重要性了,因此特地的寫一篇文章規范自己,也幫助新手入門。

  (這篇文章已經是我自己更新的第三遍了,第一次叫淺談注釋的重要性,那時候我剛入門不久;學著學著我會發現變量名也很重要,第二次是規范變量名;這次我又改了,我覺得不止是這些東西,從長遠的來說,編程以后就是自己的工作,或者說工具,所以遵循一套編碼規則很重要,這里我繼續加如自己的想法)

  (又想寫在這里,這是第四次了,我又來回味這個編碼規范的重要性了,這次是被老師批評后,我又來寫了

  我們這些初學者,目前要做的就是遵守代碼規范,這是最基本的,而且每個團隊的規范可能還不一樣,以后工作了,盡可能和團隊保持一致,目前初學者就按照官方的要求即可

  新人進入一個企業,不會接觸到核心的架構級別的代碼,這些東西大多數有大佬寫好了。所以新人要做的就是維護別人的代碼,因此代碼的可閱讀性,良好的可維護性是最重要的,關鍵的影響性能的代碼,不需要我們寫,慢慢的寫得多了,積累的多了,看幾個優秀的代碼就會了了,所以,初學者前期關注代碼規范,不寫bug,就ok)

  (這是第五次添加內容了,這次添加的是軟件開發目錄的規范,為了讓自己理解在開發標準軟件時候如何布局項目目錄結構,以及注意開發規范的重要性)

編程規范的重要性

首先談一下注釋:

????? 注釋不止是為了自己以后看的更清楚,還是為了以后的開發人員所準備的,其實一段時間后,當需要對程序做一些修改或者是改正某個bug的時候,可能未來的我們自己都會忘記相關的細節,所以此時注釋顯得尤為重要。

????? 每條注釋以井號(#)開始,一直到該行末尾結束,一直到該行末尾結束。我們可以在注釋中放任何東西,因為Python 會完全無視他們的存在。為了寫好注釋,這里給出以后幾條規則:

???? (1) 假設讀者的Python 水平和你一樣(比如說,不要去解釋 “ 什么是字符串 ” , 也不要去解釋 “ 什么是賦值語句 ”)

?????(2) 不要去注釋那些毫無意義的事情。比如說:

count = count +1 # add one to count

????? ( 3) 很多程序員會在代碼上寫上一些以 “ TODO ”? 或者? “ FIXME ”開始的注釋,目的就是為了提醒他們回來編寫或清理一些未完成的一些問題。

?????(4) 如果你在編寫某段程序的時候需要使勁思考的話,應該編寫注釋,以后別人不會在這個地方絞盡腦汁。尤其要注意的是,如果你在開發程序的時候或者函數編寫的時候使用要點來描述,盡量寫的細致一點,在開發工作完成之后,還應該將原來的要點全部保留下倆直接做解釋。

???? (5) 同樣,如果某個bug很難查明,或者其修改方案比較復雜,那么你就應該編寫一條注釋對其進行解釋。如果不這么做,那么今后其他復雜該部分的代碼的程序員就會可能認定他們沒有必要這么復雜并將其改為原來的樣子,從而將你的心血付諸東流。

???? (6)如果需要大量的注釋才能解釋清楚某段代碼的作用,那么就應該對這些代碼進行整理,比如,如果需要分別對一個函數的15個列表進行解釋,那么就應該將該函數拆分成更小的代碼塊,每隔分別只處理較小的幾個列表。

?????(7) 過時的注釋還不如沒有注釋,因此修改某段代碼后,一定要檢查相關注釋,并對其做出適當的修改以保證其仍然能夠準確描述代碼的功能。

???? (8) 注釋不是越多越好,弄得整篇代碼都是注釋,卻很少看到代碼,這樣就曲解了注釋的意思了。

????? ?所以說,一定要養成良好的注釋代碼的習慣,邊寫代碼邊注釋,及時的記錄下來你的思路,舉個例子,代碼是魚,注釋就是水,有了正確的注釋,魚才能更好的生存。還有就是多提高自己對代碼的解釋能力,用精煉的語言表達出代碼的核心價值所在,那么你寫的代碼就是成功的。

??? 下面舉個例子

def?find_two_smallest(L):
????'''Return?a?tuple?of?the?indices?of?the?two?smallest?values?in?list?L'''
????smallest?=?min(L)
????min1?=?L.index(smallest)
????L.remove(smallest)
????next_smallest?=?min(L)
????min2?=?L.index(next_smallest)
????L.insert(min1,smallest)????#為了獲取第二個最小值在原始列表中的索引,我們還需要根據實際情況給min2加1
????if?min1<=min2:
????????min2+=1
????return(min1,min2)

???? Python 中的特殊注釋(大家注意一下)

比如:Python有一行聲明python編碼格式的單行注釋。這行注釋指定文件為? utf-8 ?編碼。這行特殊注釋只能放在文件的第一行或者開頭

#_*_coding:utf-8_*_

還有一種是說明腳本語言是python的,是要用/usr/bin下面的程序(工具)python,這個解釋器,來解釋python腳本,來運行python腳本的。

#!/usr/bin/python

?再說一下規范命名變量:

因為名字不能亂起,要是你一個想法,他一個想法,大家都對對方的名稱不了解,這樣也很難持續下去,因此這里說一下變量規范命名的規則和注意事項。

1,變量定義規則:

    1,變量名只能是字母,數字或者下劃線的任意組合

    2,變量名的第一個字符不能是數字

    3,關鍵字不能生成變量名

2,變量規范命名注意事項:

    1,變量名不能過長

    2,變量名詞不達意思

    3,變量名為中文,拼音

3,總體命名規則:

**    **1 ,盡量單獨使用小寫字母‘l’,大寫字母‘O’等容易混淆的字母。
    2 ,模塊命名盡量短小,使用全部小寫的方式,可以使用下劃線。
    3 ,包命名盡量短小,使用全部小寫的方式,不可以使用下劃線。
    4 ,類的命名使用CapWords的方式,模塊內部使用的類采用_CapWords的方式。
    5 ,異常命名使用CapWords+Error后綴的方式。
    6 ,全局變量盡量只在模塊內有效,類似C語言中的static。實現方法有兩種,一是all機制;二是前綴一個下劃線。
    7 ,函數命名使用全部小寫的方式,可以使用下劃線。
    8 ,常量命名使用全部大寫的方式,可以使用下劃線。
    9 ,類的屬性(方法和變量)命名使用全部小寫的方式,可以使用下劃線。
    10,類的屬性有3種作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public屬性前,前綴一條下劃線。
    11 ,類的屬性若與關鍵字名字沖突,后綴一下劃線,盡量不要使用縮略等其他方式。
    12 ,為避免與子類屬性命名沖突,在類的一些屬性前,前綴兩條下劃線。比如:類Foo中聲明__a,訪問時,只能通過Foo._Foo__a,避免歧義。如果子類也叫Foo,那就無能為力了。
    13 ,類的方法第一個參數必須是self,而靜態方法第一個參數必須是cls。

下面說一下排版問題:

一,代碼排版:

    1 ,縮進。4個空格的縮進(編輯器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
    2 ,每行最大長度79,換行可以使用反斜杠,最好使用圓括號。換行點要在操作符的后邊敲回車。
    3 ,類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其他地方盡量不要再空行。

二,文檔排版:

    1 ,模塊內容的順序:模塊說明和docstring—import—globals&constants—其他定義。其中import部分,又按標準、三方和自己編寫順序依次排放,之間空一行。
    2 ,不要在一句import中多個庫,比如import os, sys不推薦。
    3 ,如果采用from XX import XX引用庫,可以省略‘module.’,都是可能出現命名沖突,這時就要采用import XX。

三,空格的使用:

**    總體原則,避免不必要的空格**
    1 ,各種右括號前不要加空格。
    2 ,逗號、冒號、分號前不要加空格。
    3 ,函數的左括號前不要加空格。如Func(1)。
    4 ,序列的左括號前不要加空格。如list[2]。
    5 ,操作符左右各加一個空格,不要為了對齊增加空格。
    6 ,函數默認參數使用的賦值符左右省略空格。
    7 ,不要將多句語句寫在同一行,盡管使用‘;’允許。
    8 ,if/for/while語句中,即使執行語句只有一句,也必須另起一行。

最后談一下對自己和大家的建議

    1 ,編碼中考慮到其他python實現的效率等問題,比如運算符‘+’在CPython(Python)中效率很高,都是Jython中卻非常低,所以應該采用.join()的方式。
    2 ,盡可能使用‘is’‘is not’取代‘==’,比如if x is not None 要優于if x。
    3 ,使用基于類的異常,每個模塊或包都有自己的異常類,此異常類繼承自Exception。
    4 ,異常中不要使用裸露的except,except后跟具體的exceptions。
    5 ,異常中try的代碼盡可能少。比如:

try:
value?=?collection[key]
except?KeyError:
return?key_not_found(key)
else:
return?handle_value(value)

要優于

try:
#?Too?broad!
return?handle_value(collection[key])
except?KeyError:
#?Will?also?catch?KeyError?raised?by?handle_value()
return?key_not_found(key)

6 ,使用startswith() and endswith()代替切片進行序列前綴或后綴的檢查。比如:

Yes:&nbsp;?if?foo.startswith('bar'):
優于
No:&nbsp;?if?foo[:3]?==?'bar':

    7 ,使用isinstance()比較對象的類型。比如

Yes:&nbsp;?if?isinstance(obj,?int):?

優于

No:&nbsp;?if?type(obj)?is?type(1):

    8 ,判斷序列空或不空,有如下規則

Yes:&nbsp;?if?not?seq:
if?seq:

優于

No:&nbsp;?if?len(seq)
if?not?len(seq)

    9 ,字符串不要以空格收尾。
    10 ,二進制數據判斷使用 if boolvalue的方式。

?軟件開發目錄規范的重要性

為什么要設計好目錄結構?

"設計項目目錄結構",就和"代碼編碼風格"一樣,屬于個人風格問題。對于這種風格上的規范,一直都存在兩種態度:

  1. 一類同學認為,這種個人風格問題"無關緊要"。理由是能讓程序work就好,風格問題根本不是問題。

  2. 另一類同學認為,規范化能更好的控制程序結構,讓程序具有更高的可讀性。

我是比較偏向于后者的,因為我是前一類同學思想行為下的直接受害者。我曾經維護過一個非常不好讀的項目,其實現的邏輯并不復雜,但是卻耗費了我非常長的時間去理解它想表達的意思。從此我個人對于提高項目可讀性、可維護性的要求就很高了。"項目目錄結構"其實也是屬于"可讀性和可維護性"的范疇,我們設計一個層次清晰的目錄結構,就是為了達到以下兩點:

  1. 可讀性高: 不熟悉這個項目的代碼的人,一眼就能看懂目錄結構,知道程序啟動腳本是哪個,測試目錄在哪兒,配置文件在哪兒等等。從而非??焖俚牧私膺@個項目。

  2. 可維護性高: 定義好組織規則后,維護者就能很明確地知道,新增的哪個文件和代碼應該放在什么目錄之下。這個好處是,隨著時間的推移,代碼/配置的規模增加,項目結構不會混亂,仍然能夠組織良好。

所以,我認為,保持一個層次清晰的目錄結構是有必要的。更何況組織一個良好的工程目錄,其實是一件很簡單的事兒。

目錄組織方式

關于如何組織一個較好的Python工程目錄結構,已經有一些得到了共識的目錄結構。在Stackoverflow的這個問題上,能看到大家對Python目錄結構的討論。

這里面說的已經很好了,我也不打算重新造輪子列舉各種不同的方式,這里面我說一下我的理解和體會。

假設你的項目名為foo, 我比較建議的最方便快捷目錄結構這樣就足夠了:

Foo/
|--?bin/
|???|--?foo
|
|--?foo/
|???|--?tests/
|???|???|--?__init__.py
|???|???|--?test_main.py
|???|
|???|--?__init__.py
|???|--?main.py
|
|--?docs/
|???|--?conf.py
|???|--?abc.rst
|
|--?setup.py
|--?requirements.txt
|--?README

簡要解釋一下:

  • bin/: 存放項目的一些可執行文件,當然你可以起名script/之類的也行。

  • foo/: 存放項目的所有源代碼。(1) 源代碼中的所有模塊、包都應該放在此目錄。不要置于頂層目錄。(2) 其子目錄tests/存放單元測試代碼;(3) 程序的入口最好命名為main.py。

  • docs/: 存放一些文檔。

  • setup.py: 安裝、部署、打包的腳本。

  • requirements.txt: 存放軟件依賴的外部Python包列表。

  • README: 項目說明文件。

除此之外,有一些方案給出了更加多的內容。比如LICENSE.txt,ChangeLog.txt文件等,我沒有列在這里,因為這些東西主要是項目開源的時候需要用到。如果你想寫一個開源軟件,目錄該如何組織,可以參考這篇文章。

下面,再簡單講一下我對這些目錄的理解和個人要求吧。

關于README的內容

如何寫標準的README文件,請看博客:http://www.cnblogs.com/wj-1314/p/8547763.html

這個我覺得是每個項目都應該有的一個文件,目的是能簡要描述該項目的信息,讓讀者快速了解這個項目。

它需要說明以下幾個事項:

  1. 軟件定位,軟件的基本功能。

  2. 運行代碼的方法: 安裝環境、啟動命令等。

  3. 簡要的使用說明。

  4. 代碼目錄結構說明,更詳細點可以說明軟件的基本原理。

  5. 常見問題說明。

關于requirements.txt和setup.py

setup.py

一般來說,用setup.py來管理代碼的打包、安裝、部署問題。業界標準的寫法是用Python流行的打包工具setuptools來管理這些事情。這種方式普遍應用于開源項目中。不過這里的核心思想不是用標準化的工具來解決這些問題,而是說,一個項目一定要有一個安裝部署工具,能快速便捷的在一臺新機器上將環境裝好、代碼部署好和將程序運行起來。

這個我是踩過坑的。

我剛開始接觸Python寫項目的時候,安裝環境、部署代碼、運行程序這個過程全是手動完成,遇到過以下問題:

  1. 安裝環境時經常忘了最近又添加了一個新的Python包,結果一到線上運行,程序就出錯了。

  2. Python包的版本依賴問題,有時候我們程序中使用的是一個版本的Python包,但是官方的已經是最新的包了,通過手動安裝就可能裝錯了。

  3. 如果依賴的包很多的話,一個一個安裝這些依賴是很費時的事情。

  4. 新同學開始寫項目的時候,將程序跑起來非常麻煩,因為可能經常忘了要怎么安裝各種依賴。

setup.py可以將這些事情自動化起來,提高效率、減少出錯的概率。"復雜的東西自動化,能自動化的東西一定要自動化。"是一個非常好的習慣。

setuptools的文檔比較龐大,剛接觸的話,可能不太好找到切入點。學習技術的方式就是看他人是怎么用的,可以參考一下Python的一個Web框架,flask是如何寫的: setup.py

當然,簡單點自己寫個安裝腳本(deploy.sh)替代setup.py也未嘗不可。

requirements.txt

這個文件存在的目的是:

  1. 方便開發者維護軟件的包依賴。將開發過程中新增的包添加進這個列表中,避免在 setup.py 安裝依賴時漏掉軟件包。

  2. 方便讀者明確項目使用了哪些Python包。

這個文件的格式是每一行包含一個包依賴的說明,通常是flask&gt;=0.10這種格式,要求是這個格式能被pip識別,這樣就可以簡單的通過 pip install -r requirements.txt來把所有Python包依賴都裝好了。具體格式說明:點這里。

關于配置文件的使用方法

注意,在上面的目錄結構中,沒有將conf.py放在源碼目錄下,而是放在docs/目錄下。

很多項目對配置文件的使用做法是:

  1. 配置文件寫在一個或多個python文件中,比如此處的conf.py。

  2. 項目中哪個模塊用到這個配置文件就直接通過import conf這種形式來在代碼中使用配置。

這種做法我不太贊同:

  1. 這讓單元測試變得困難(因為模塊內部依賴了外部配置)

  2. 另一方面配置文件作為用戶控制程序的接口,應當可以由用戶自由指定該文件的路徑。

  3. 程序組件可復用性太差,因為這種貫穿所有模塊的代碼硬編碼方式,使得大部分模塊都依賴conf.py這個文件。

所以,我認為配置的使用,更好的方式是,

  1. 模塊的配置都是可以靈活配置的,不受外部配置文件的影響。

  2. 程序的配置也是可以靈活控制的。

能夠佐證這個思想的是,用過nginx和mysql的同學都知道,nginx、mysql這些程序都可以自由的指定用戶配置。

所以,不應當在代碼中直接import conf來使用配置文件。上面目錄結構中的conf.py,是給出的一個配置樣例,不是在寫死在程序中直接引用的配置文件??梢酝ㄟ^給main.py啟動參數指定配置路徑的方式來讓程序讀取配置內容。當然,這里的conf.py你可以換個類似的名字,比如settings.py?;蛘吣阋部梢允褂闷渌袷降膬热輥砭帉懪渲梦募?#xff0c;比如settings.yaml之類的。

來源:戰爭熱誠?

https://www.cnblogs.com/wj-1314/p/7551184.html

-END-

點下方卡片獲取 各種教程資料↓↓↓

已標記關鍵詞 清除標記
相關推薦
??2020 CSDN 皮膚主題: 編程工作室 設計師:CSDN官方博客 返回首頁
彩票送彩金