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