MATLAB编程规范
命名規(guī)范
命名不規(guī)范可能會引起異議。
變量
變量的名字需要體現(xiàn)其意義和用途。
變量名應(yīng)該用小寫字母開頭的混合大小寫。
例如:
linearity, credibleThreat, qualityOfLife另一種方法是使用下劃線分隔復(fù)合變量名的各個(gè)部分。
具有較大作用域的變量應(yīng)該具有有意義的名稱。作用域較小的變量可以有較短的名稱。
用于臨時(shí)儲存的變量可以簡短一點(diǎn)。
一般來說,整型常見的初始變量是i,j,k,m,n;雙精度的是x,y和z.
(matlab中i,j是固定虛數(shù)單位,需要注意。)
前綴n應(yīng)該用于表示對象數(shù)量的變量。
例如:
nFiles, nSegments避免使用同一個(gè)變量名字的不同僅有一個(gè)s后綴的區(qū)別
例如:
point,points
但數(shù)組是可以的如
point,pointArray
表示單個(gè)實(shí)體號的變量可以用No作為后綴,也可以用i作為前綴i。
tableNo, employeeNo iTable, iEmployee迭代變量的命名或前綴為i、j、k等
Ex:
for iFile = 1:nFiles: end同時(shí)對于嵌套循環(huán),迭代變量按字母順序進(jìn)行,同時(shí)是有意義的
for iFile = 1:nFilesfor jPosition = 1:nPositions:end: end應(yīng)該避免使用否定的布爾變量名。
避免使用 isNotFound
縮寫單詞也需要大寫首字母,即使其通常是大寫的。
通常使用: isUsaSpecific
不使用:isUSASpecific
避免使用關(guān)鍵詞或特別意義的詞,如內(nèi)置函數(shù)
常量
命名的常量(包括全局變量)應(yīng)該全部使用大寫,單詞之間使用下劃線分隔。
例如:
COLOR_RED, MAX_ITERATIONS可以使用類型名字作為前綴
例如:
COLOR_RED, COLOR_GREEN, COLOR_BLUE結(jié)構(gòu)體
結(jié)構(gòu)名稱應(yīng)以大寫字母開頭
結(jié)構(gòu)的名稱是隱式的,不需要包含在字段名中。
例如:
Segment.length函數(shù)
函數(shù)名應(yīng)該用小寫書寫
最清晰的做法是讓函數(shù)和它的m文件名相同。
使用小寫可以避免潛在的文件名問題。
例如:
同時(shí)可以使用下劃線隔開,增強(qiáng)可讀性。
函數(shù)應(yīng)該有有意義的名稱。
縮寫或首字母縮略詞在數(shù)學(xué)中廣泛使用是一個(gè)例外。
max(.)可以根據(jù)輸出命名具有單個(gè)輸出的函數(shù)。
mean(.), standarderror(.)沒有輸出參數(shù)或只返回句柄的函數(shù)應(yīng)該根據(jù)它們的功能命名。
plot(.)前綴get/set通常應(yīng)該為訪問對象或?qū)傩远A簟?/h3>
getobj(.); setappdata(.)
前綴compute可以用于計(jì)算某些內(nèi)容的方法中。
computweightedaverage(.); computespread(.)
前綴find可用于查找某項(xiàng)內(nèi)容的方法。
findoldestrecord(.); findheaviestelement(.);
在建立對象或概念的地方可以使用前綴初始化。
initializeproblemstate(.);
前綴is應(yīng)該用于布爾函數(shù)
isoverpriced(.); iscomplete(.)
有一些替代is前綴的方法在某些情況下更適合。這些前綴包括has、can和should:
hasLicense(.);canEvaluate(.);shouldSort(.)互補(bǔ)名稱應(yīng)用于對應(yīng)操作
get/set, add/remove, create/destroy, start/stop, insert/delete, increment/decrement, old/new, begin/end, first/last, up/down, min/max, next/previous, old/new, open/close, show/hide, suspend/resume, etc.避免無意義的重復(fù)。
函數(shù)命應(yīng)該是唯一的。
一般規(guī)則
量綱化變量和常量的名稱通常應(yīng)該有單位后綴。
添加單位后綴有助于避免幾乎不可避免的混合。
incidentAngleRadians
名稱中的縮寫應(yīng)避免使用
減少模糊和歧義
computearrivaltime(.)(建議) comparr(.)(避免)
(注:除了特定短語)
文件和組織結(jié)構(gòu)
M文件
模塊化
將大的整個(gè)程序化為一個(gè)個(gè)模塊,以便調(diào)用或復(fù)用。
明確交互接口
結(jié)構(gòu)可用于避免輸入或輸出參數(shù)的長列表。
分區(qū)
劃分所有子函數(shù)和許多函數(shù)應(yīng)該可以很好地完成一件事。每個(gè)函數(shù)都應(yīng)該隱藏一些東西。
盡可能使用現(xiàn)有函數(shù)
反復(fù)出現(xiàn)的代碼應(yīng)當(dāng)模塊化到一個(gè)函數(shù)內(nèi)
子函數(shù)
只有一個(gè)其他函數(shù)使用的函數(shù)應(yīng)該作為它的子函數(shù)打包在同一個(gè)文件中。這使得代碼更容易理解和維護(hù)。
測試腳本
為每個(gè)函數(shù)編寫一個(gè)測試腳本。這種做法將提高初始版本的質(zhì)量和更改版本的可靠性。考慮到任何難于測試的函數(shù)可能難于編寫。
Boris Beizer: “More than the act of testing, the act of designing tests is one
of the best bug preventers known.”
輸入和輸出
輸入輸出模塊
格式化輸出方便使用。
表述
變量和常量
除非內(nèi)存限制,否則不應(yīng)重用變量。
相同類型的相關(guān)變量可以在公共語句中聲明。不相關(guān)的變量不應(yīng)該在同一語句中聲明。
它增強(qiáng)了對變量分組的可讀性。
persistent x, y, z global REVENUE_JANUARY, REVENUE_FEBRUARY考慮在文件開頭附近的注釋中記錄重要的變量。
% pointArray Points are in rows with coordinates in columns.考慮用行尾注釋來記錄常量賦值。
THRESHOLD = 10; % Maximum noise level found by experiment.全局變量
應(yīng)該盡量減少全局變量的使用。
應(yīng)該盡量減少全局常量的使用。
循環(huán)語句
循環(huán)變量應(yīng)該在循環(huán)之前立即初始化。
result = zeros(nEntries,1); for index = 1:nEntriesresult(index) = foo(index); end應(yīng)該盡量減少在循環(huán)中使用break和continue。
嵌套循環(huán)的結(jié)束行可以有注釋
條件語句
應(yīng)該避免使用復(fù)雜的條件表達(dá)式。取而代之,引入臨時(shí)邏輯變量。
通過將邏輯變量賦給表達(dá)式,程序可以自動編寫文檔。構(gòu)造將更易于閱讀和調(diào)試。
if (value>=lowerLimit)&(value<=upperLimit)&~ismember(value,… valueArray): end替換為
isValid = (value >= lowerLimit) & (value <= upperLimit); isNew = ~ismember(value, valueArray); if (isValid & isNew): end一般的情況應(yīng)該放在if-part中,異常放在if else語句的else-part中。
fid = fopen(fileName); if (fid~=-1): else: end除了臨時(shí)塊注釋外,應(yīng)該避免條件表達(dá)式if 0。
switch語句應(yīng)該包含otherwise條件。
switch (condition) case ABCstatements; case DEFstatements; otherwisestatements; endswitch變量通常應(yīng)該是一個(gè)字符串。
一般情況
避免使用加密代碼
使用括號
表達(dá)式中數(shù)字的使用應(yīng)該盡量減少。可更改的數(shù)字通常應(yīng)命名為常量。
浮點(diǎn)常量應(yīng)該總是在小數(shù)點(diǎn)前加上一位數(shù)字。
THRESHOLD = 0.5;
不要使用 THRESHOLD = .5;
應(yīng)該謹(jǐn)慎地進(jìn)行浮點(diǎn)數(shù)比較。
shortSide = 3; longSide = 5; otherSide = 4; longSide^2 == (shortSide^2 + otherSide^2) ans =1 scaleFactor = 0.01; (scaleFactor*longSide)^2 == ((scaleFactor*shortSide)^2 + … (scaleFactor*otherSide)^2) ans =0排版、注釋和文件
排版
內(nèi)容應(yīng)保持在前80列內(nèi)。
線條應(yīng)該在優(yōu)美的點(diǎn)上分開。
需要進(jìn)行適當(dāng)?shù)膿Q行
totalSum = a + b + c + … d + e; function (param1, param2,… param3) setText ([‘Long line split’ … ‘into two parts.’]);基本的縮進(jìn)應(yīng)該是3或4個(gè)空格。
縮進(jìn)應(yīng)與MATLAB編輯器一致。
一般來說,一行代碼應(yīng)該只包含一個(gè)可執(zhí)行語句。
短的單個(gè)語句if、for或while語句可以寫在一行上。
if(condition), statement; end while(condition), statement; end for iTest = 1:nTest, statement; end留白
用空格環(huán)繞=、&和|。
simpleSum = firstTerm+secondTerm;常規(guī)操作符可以被空格包圍。
simpleAverage = (firstTerm + secondTerm) / two; 1 : nIterations逗號后面可以跟一個(gè)空格。
foo(alpha, beta, gamma) foo(alpha,beta,gamma)一行中多個(gè)命令的分號或逗號后面應(yīng)該跟一個(gè)空格字符。
if (pi>1), disp(‘Yes’), end關(guān)鍵字后面應(yīng)該跟一個(gè)空格。
塊內(nèi)的邏輯語句組之間應(yīng)該用一個(gè)空行分隔。
塊之間應(yīng)由多個(gè)空行分隔。
在能夠提高可讀性的地方使用對齊方式。
weightedPopulation = (doctorWeight * nDoctors) + …(lawyerWeight * nLawyers) + …(chiefWeight * nChiefs);注釋
注釋的目的是向代碼中添加信息。注釋的典型用途是解釋用法,提供參考信息,證明決策的合理性,描述限制,提到需要的改進(jìn)。經(jīng)驗(yàn)表明,最好是在編寫代碼的同時(shí)編寫注釋,而不是打算在以后添加注釋。
注釋不能證明寫得很差的代碼是正確的。
注釋應(yīng)該與代碼一致,但不僅僅是重申代碼。
注釋應(yīng)該易于閱讀。
注釋通常應(yīng)該與引用的語句具有相同的縮進(jìn)。
函數(shù)頭注釋應(yīng)該支持help和lookfor的使用。
函數(shù)頭注釋應(yīng)該討論輸入?yún)?shù)的任何特殊要求。
% ejectionFraction must be between 0 and 1, not a percentage. % elapsedTimeSeconds must be one dimensional.函數(shù)頭注釋應(yīng)該描述任何副作用。
一般來說,函數(shù)頭的最后一個(gè)注釋應(yīng)該重述函數(shù)行。
在函數(shù)頭中使用大寫寫函數(shù)名是有爭議的。
避免函數(shù)頭幫助打印輸出中出現(xiàn)不必要的信息。
將版權(quán)行和修改歷史記錄行與其他的注釋分隔開,避免在幫助文件中顯示出來。
文件
正式文檔
有用的文檔應(yīng)該包括代碼應(yīng)該做什么(需求)、如何工作(設(shè)計(jì))、依賴于哪些功能以及如何被其他代碼(接口)使用,以及如何測試的可讀性描述。為了額外加分,文檔可以包括對替代解決方案的討論,以及擴(kuò)展或維護(hù)的建議。
考慮先寫文檔
變化
管理和記錄代碼變更的專業(yè)方法是使用源代碼控制工具。對于非常簡單的項(xiàng)目,在函數(shù)文件中添加更改歷史注釋肯定比什么都沒有要好。
% date Month Year, Name, 。。。
[1] Johnson R. MATLAB Programming Style Guidelines[J]. 2002(October).
總結(jié)
以上是生活随笔為你收集整理的MATLAB编程规范的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无源定位之时差估计的精确时差估计算法(E
- 下一篇: 基于MATLAB的面向对象编程(1)——