设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1645|回复: 0

MATLAB 代码规范

[复制链接]

36

主题

373

金钱

561

积分

初级用户

发表于 2019-11-8 15:11:48 | 显示全部楼层 |阅读模式

标识符命名原则
标识符的名字应当直观,其长度应当符合“最小长度,最大信息量”原则

非矩阵变量
变量名应该以小写字母开头的大小写混合形式 譬如:shadowFadingTable,servingSector,rxBufferForRe userID,userPriorityProfile,mcsOneRetrieval等。

循环变量应该以 i 、j 、k 等为前缀,如
  1. for  i_File = 1:nFiles
  2.     for  j_Position = 1:nPositions
复制代码


避免仅用最后的字母s(表示单复数)区别两个变量, 例如point和points. 可以用类似pointArray的形式加以区别。
避免使用一个关键字或者特殊意义的字作为变量名
结构体的命名应该以一个大写字母开头,结构体的命名应该是暗示性的,并且不需要包括字段名(fieldname)应采用Segment.length,避免用Segment.SegmentLength

常数
命名常数(包括全局变量)应该采用大写字母,用下划线分割单词,如MAX_ITERATIONS,COLOR_RED
参数可以以某些通用类型名作为前缀,如COLOR_RED,COLOR_GREEN


草稿变量,含矩阵,结构体,元胞
应用范围比较大的变量应该具有有意义的变量名,作为“草稿变量”的的临时存储空间或者索引可以用短名字。程序员在读到这样的变量的时候,可以假定这个变量的值在没有几行之后的代码中就不会再用到。通常的“草稿变量”整数的时候用 i,j ,k ,m ,n(最好少用i,j,因为他们作为MATLAB中的永久性常量表示虚数单位的)。双精度数的时候常用 x,y 和 z 。m 表示矩阵,没有 m 表示标量
命名上将cell, struct 与MATLAB中最常见的 numeric array ,即数值矩阵区分开来.
n 用于整数变量, 如n_File.
m用于一般的矩阵,如matrix_channelHFResponse;
c用于cell array, 如cell_temp= cell(1, 4);
s用于 struct array, 如 stuct_user= struct('field', {}) ;
matrix,cell,stuct后面的channelHFResponse, user用来表示有特定含义的中间变量,比如matrix_channelHFResponse,用来表示计算channelHFResponse时中间变量。

函数
函数名应该采用小写字母,函数名应该是具有意义的,下划线分割单词
如采用: compute_total_width()避免compwid()
前缀get/set 应该作为访问对象或者属性的保留前缀,如getobj(.)。
前缀compute应该用在计算某些量的函数的地方computespread()。
前缀 is应该用在布尔函数的命名的地方,如 iscomplete()。
Find,initialize类似。


编码及文档注释要求及实例
代码版式
M文件函数说明
  1. function [ 函数输出参数] =  函数名( 函数输入 )
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %此处为函数名,如果不是函数文件就取消此行
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. %创建人:
  6.         %日  期:
  7.         %修改人:
  8.         %日  期:
  9.         %函数变量及功能的简单描述
  10. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  11. --函数主体
复制代码


编码设计
本部分说明了M文件编码的设计,包括以下几个方面:垂直间隔,水平间隔,缩进与对齐,注释。
垂直间隔
空行起着分割块或段落的作用,块(段落)之间一般留一个或两个空行。

空行使用规则
逻辑块之间要留空行
结构体定义之间要留空行
函数定义体之间要留空行
函数体内,完整的控制结构和单独的语句块之间要留空行
逻辑上密切相关的语句序列之间不要留空行
换行注意事项
不在一行使用多个语句。唯一的例外是for语句。For语句的初始化,条件和循环都可以在一行中。例如:
  1. for (bcnl_num = 0; bcnl_num < count; bcnl_num++)
复制代码

或者还有switch语句,如果动作很短并且相同的话(后面有详细描述)。If语句并不是例外:执行语句总是另起一行。例如:
  1. if (bcnl_num > count)
  2.     bcnl_num = count;
复制代码

{}与case总是独占一行

水平间隔
逗号后面要有空格,但是不要在结构的成员与指针操作符前后有空格。例如:foo.index
在 =,&&,+,-,>, <与 || 前后加上空格,包括:如
  1. simpleAverage = (firstTerm + secondTerm) / two;
  2. 1 : nIterations
复制代码

另起一行时,后面一行和前面一行中要继续的地方对齐:
  1. weithedPopulation = (doctorWeight * nDoctors) +...
  2.                     (layerWeight * nLawyers) + ...
  3.                     (chiefWeight * nChiefs);...
  4. function (param1,param2,...
  5.           param3)
复制代码


长行拆分
一行代码不能超过180个字符。长行拆分时,在逻辑断点处分行。拆分时,运算符放在被拆分行的尾部,而不是新行的首部。拆分后的新行应与被拆分行采用能够表现出逻辑关系的对齐方式。
示例:
  1. if (((new_shape.x > left_border) &&
  2.    (new_shape.x < right_border)) &&
  3.   ( (new_shape.y > bottom_border) &&
  4.    (new_shape.y < top_border))) {
  5.   draw(new_shape);
  6. }
复制代码


代码行及行内空格
代码行中不运行出现中文。
关键字后要留空格。像const、inline、case等关键字后要留空格,以辨析关键字;像if、fo、do、while、switch等关键字后要留空格再跟左括号(,以突出关键字。
( 若不在一行的开始,应与前面的字符空格。例如,if、while、do-while、switch、for语句等控制结构块的(应与这些关键字语句之间空格。
,之后要留空格;若;不是一行的结束符,后面也要留空格。
?、:前后都要留空格。
(、[向后紧跟,]、,、;、)向前紧跟,紧跟处不留空格。
一元运算符与所作用的操作数之间不要加空格,如!、~、++、&、*等。
.、->这类运算符前后都不要留空格。


缩进与对齐
缩进的水平是一个TAB键,可将编辑器的TAB符定义为4个空格。
嵌套块之间使用4个空格(一个TAB键)的缩进方式。
模块和子程序头以及子程序声明从第一列起。
下列情况下缩进一个水平:
子程序声明
条件(看下面)
循环的结构
switch语句
case labels
条件的else与if有相同的缩进。因此格式就是:
  1. fid = fopen(fileName);
  2. if(fid~ = -1)
  3.   statements
  4. else
  5.   statements
  6. end
复制代码


switch语句的一般格式:
  1. switch(condition)
  2.   case    ABC
  3.       处理语句;
  4.   case    DEF
  5.       处理语句;
  6.   otherwise
  7.       处理语句;
  8. end
复制代码


注释与它们作注释的代码部分有相同的缩进(见Comments)。
注释
程序内部不同功能模块要空一行,同时附注释说明模块的作用、功能。这样程序结构清晰易懂,便于同学间学习交流。
例如:
  1. %% 注释说明下模块一的功能
  2.        ...模块一...代码...
  3.       此处为空行
  4. %% 注释说明下模块二的功能
  5.           ...模块二...代码...
复制代码


多层循环嵌套要在每一个结束的end 后加注释说明该层循环结束
例:
  1. for            %循环1
  2.     for             %循环2
  3.         for            %循环3
  4.             ......
  5.              代码段
  6.             ......
  7.         end            %循环3结束
  8.     end            %循环2结束
  9. end             %循环1结束
复制代码


用于理解一小段代码含义的注释,统一写在代码上方,如
  1. %(1)初始化
  2. Number = zeros(1,PNumber);             %Number存放每个工件的工序数,PNumber工件个数
  3. for i = 1:PNumber
  4.     Number(i) = MNumber;               %MNumber工序个数
  5. end  
复制代码


用于理解一句代码的意思可以写在代码后方,但是注意不能超过180字符。太长可以考虑写在代码上方
  1. gen = 0;  %迭代计数器
  2. JmNumber = Max_Cell(Jm);               %调用Max_Cell子函数求机器的数量
  3. [PNumber,MNumber] = size(Jm);          %PNumber为工件个数,MNumber为工序个数
  4. trace = zeros(2,MAXGEN);               %寻优结果的初始值,一行存放各代的最优解,一行存放各代解的均值
  5. TotalOP_Number = PNumber*MNumber;      %工序总个数
复制代码


大段代码,有完整的阶段性的运行结果,需要使用%% 形式,使用单元来注释
  1. %% 子函数程序13:Find函数
  2. function  Pos = Find(FindVal,S)
  3. [m,n] = size(S);
  4. Pos = -1;
  5. for i = 1:n  
  6.     if FindVal == S(i)
  7.       Pos = i;
  8.       break;
  9.     end
  10. end
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表