最近修改代码(Matlab)的感受
2007-11-14 23:00
323 查看
最近又对以前写过的柑橘溃疡病检测的代码作了很大的调整。主要集中在三个方面:分解功能模块、统一命名方式与调用方式、循环修改为矩阵运算。
记录一些感受。望自己以后多加注意。
1、不要 在一个函数中集中太多的功能;如果功能模块能分解,那么,就尽最大努力的分解;函数功能愈单一愈好
功能模块分解后能够最大限度的提高代码复用;
调试时也方便许多
2、不要使模块过度灵活或者过度复杂;应该在灵活性与复杂度之间取一个合适的平衡;
与第一个问题似乎差不多
有一个时间段,总喜欢将函数做的非常复杂,希望能够完成好几种类似的功能;每次都采用matlab变参实现,变参多了,使得函数变得非常难以理解。
比如,一个 AdaBoost 函数,它需要完成 AdaBoost 按轮数训练、AdaBoost 按特征数、AdaBoost 测试、同时训练并测试等类似的功能;以前做的就是把所有功能集成在一起;在现在看来,这是一个非常烂的设计。调试困难,调用时无法通过函数名知道其所需要的功能;并且,代码重用非常困难。
在上一次的代码重构中,已经将这些分解了。但分解了仍然不够彻底。现在这个函数已经拆成七八块了。
AdaBoostClassfy AdaBoost 强分类器对一组样本进行分类
AdaBoostWeakLearnerClassfy AdaBoost弱分类器对一组样本进行分类
searchBestWeakLearner 在特征列上获得最优的阈值分类器
trainAdaBoostClassifier 在训练集上训练 AdaBoost 分类器
testAdaBoostClassifier 在测试集上测试 AdaBoost 分类器
testAdaBoost(训练与测试) 将样本随机划分为训练集与测试集,多次训练测试AdaBoost分类器
AdaBoost(训练与测试) 给定训练集与测试集,训练测试AdaBoost分类器
testAdaBoost 与 AdaBoost 类似,均是先训练分类器,而后测试分类器
testAdaBoost 测试多次,并且将样本集分为训练集与测试集
testAdaBoost 通过调用 AdaBoost 函数实现多次的分类器训练与测试
AdaBoost调用 trainAdaBoostClassifier 训练, 调用 testAdaBoostClassifier 进行测试
目前的设计不仅没有任何的重复代码,并且可扩充性也强许多。目前看来,还算一个不错的设计了。也许几个月后看,还存在许多问题。到时候再来解决吧。
3、形成一个习惯的命名方式,并严格执行
变量命名:尽量采用全名
复杂对象(向量、矩阵、结构体、cell)首字母大写
简单变量(int,double)之类,首字母小写
比如:Samples 待分类的样本, cntSamples x cntFeatures 矩阵
boostthresh AdaBoost强分类器的阈值,默认为0.5
同一类型的变量采用同样的命名,比如数量前加:cnt,比如,
样本数量:cntSamples ;特征数量 cntFeatures
函数命名: 动词+名词 方式,尽量采用全名
比如:searchBestWeakLearner 在特征列上获得最优的阈值分类器
trainAdaBoostClassifier 训练AdaBoost分类器
统一命名方式后,结合注释,代码的可读性会大大提高。
4、循环尽量改为矩阵操作
采用矩阵操作后代码会简洁许多,但会变得很难理解。需要增加注释,方便理解。
5、归结几点:
在完成功能的基础上
可读性第一:就是要有良好的代码风格,比如注释良好而丰富、命名易理解、使用变量替换常数、代码缩进、不要写太长的嵌套调用、相关代码集中,等等等等
可扩展性第二:变参需适量控制;函数功能单一;
性能第三:最后考虑性能,matlab里面尽量采用矩阵替换循环
血的教训!!多加注意!!!!!!!
还约需要2.5周才能完成代码重构,任重而道远!!
记录一些感受。望自己以后多加注意。
1、不要 在一个函数中集中太多的功能;如果功能模块能分解,那么,就尽最大努力的分解;函数功能愈单一愈好
功能模块分解后能够最大限度的提高代码复用;
调试时也方便许多
2、不要使模块过度灵活或者过度复杂;应该在灵活性与复杂度之间取一个合适的平衡;
与第一个问题似乎差不多
有一个时间段,总喜欢将函数做的非常复杂,希望能够完成好几种类似的功能;每次都采用matlab变参实现,变参多了,使得函数变得非常难以理解。
比如,一个 AdaBoost 函数,它需要完成 AdaBoost 按轮数训练、AdaBoost 按特征数、AdaBoost 测试、同时训练并测试等类似的功能;以前做的就是把所有功能集成在一起;在现在看来,这是一个非常烂的设计。调试困难,调用时无法通过函数名知道其所需要的功能;并且,代码重用非常困难。
在上一次的代码重构中,已经将这些分解了。但分解了仍然不够彻底。现在这个函数已经拆成七八块了。
AdaBoostClassfy AdaBoost 强分类器对一组样本进行分类
AdaBoostWeakLearnerClassfy AdaBoost弱分类器对一组样本进行分类
searchBestWeakLearner 在特征列上获得最优的阈值分类器
trainAdaBoostClassifier 在训练集上训练 AdaBoost 分类器
testAdaBoostClassifier 在测试集上测试 AdaBoost 分类器
testAdaBoost(训练与测试) 将样本随机划分为训练集与测试集,多次训练测试AdaBoost分类器
AdaBoost(训练与测试) 给定训练集与测试集,训练测试AdaBoost分类器
testAdaBoost 与 AdaBoost 类似,均是先训练分类器,而后测试分类器
testAdaBoost 测试多次,并且将样本集分为训练集与测试集
testAdaBoost 通过调用 AdaBoost 函数实现多次的分类器训练与测试
AdaBoost调用 trainAdaBoostClassifier 训练, 调用 testAdaBoostClassifier 进行测试
目前的设计不仅没有任何的重复代码,并且可扩充性也强许多。目前看来,还算一个不错的设计了。也许几个月后看,还存在许多问题。到时候再来解决吧。
3、形成一个习惯的命名方式,并严格执行
变量命名:尽量采用全名
复杂对象(向量、矩阵、结构体、cell)首字母大写
简单变量(int,double)之类,首字母小写
比如:Samples 待分类的样本, cntSamples x cntFeatures 矩阵
boostthresh AdaBoost强分类器的阈值,默认为0.5
同一类型的变量采用同样的命名,比如数量前加:cnt,比如,
样本数量:cntSamples ;特征数量 cntFeatures
函数命名: 动词+名词 方式,尽量采用全名
比如:searchBestWeakLearner 在特征列上获得最优的阈值分类器
trainAdaBoostClassifier 训练AdaBoost分类器
统一命名方式后,结合注释,代码的可读性会大大提高。
4、循环尽量改为矩阵操作
采用矩阵操作后代码会简洁许多,但会变得很难理解。需要增加注释,方便理解。
5、归结几点:
在完成功能的基础上
可读性第一:就是要有良好的代码风格,比如注释良好而丰富、命名易理解、使用变量替换常数、代码缩进、不要写太长的嵌套调用、相关代码集中,等等等等
可扩展性第二:变参需适量控制;函数功能单一;
性能第三:最后考虑性能,matlab里面尽量采用矩阵替换循环
血的教训!!多加注意!!!!!!!
还约需要2.5周才能完成代码重构,任重而道远!!
相关文章推荐
- 最近涉及reflector中反编代码修改,在此积累经验(三)
- 最近涉及reflector中反编代码修改,在此积累经验
- Frequency-tuned Salient Region Detection MATLAB代码出错修改方法
- Matlab代码修改XML文件的内容
- [考试维护]修改代码的感受
- 最近涉及reflector中反编代码修改,在此积累经验(二)
- C#修改本机的IP,网关等网络地址的代码片段
- FastICA 在matlab代码实现以及运行结果
- Unity修改自动生成的代码模板
- asp.net 读取并修改config文件实现代码
- 大脑提取每一个体素26领域的matlab代码
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(二)
- Java动态修改代码
- GMM聚类及Matlab代码实现
- MapXtreme2004代码 搜索指定点的最近图元(SearchNearst)
- 随机动态规划,随机库存管理,matlab 代码, c 代码
- 在代码中修改TextView的DrawableRight图片
- ASP.NET 中在代码中修改Title的方法
- Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示
- ubuntu12.04修改eclipse提示代码背景颜色