3

在 MATLAB 中,我可以通过使用以下代码来量化我的代码的简洁程度:

t = mtree('myCode.m','-file');
length(t.nodesize)

正如 CODY ( http://www.mathworks.com/matlabcentral/about/cody/ ) 描述的那样:

Cody 使用节点计数计算来根据解析树中的节点数确定解决方案大小。将大小视为代码长度。编写简洁的代码可以获得更好的结果。注释不影响代码大小。

为了说明 Cody 如何确定大小,这里有两个加一问题的解决方案。

解决方案 1 的大小为 12:

function y = plus_one(x)
  y = x+1;
end

解决方案 2 的大小为 16:

function y = plus_one(x)
  z = x;
  y = z+1;
end

有什么方法可以对 R 代码进行类似的计算吗?R中的代码质量还有其他可量化的指标吗?MATLAB 还可以测量 McCabe 复杂度,例如:

mlint -cyc myCode.m
4

1 回答 1

2

也许这很有用:

#   line1 col1 line2 col2 id parent          token terminal     text
#33     1    1     1   34 33      0           expr    FALSE         
#1      1    1     1    8  1      3         SYMBOL     TRUE plus_one
#3      1    1     1    8  3     33           expr    FALSE         
#2      1   10     1   11  2     33    LEFT_ASSIGN     TRUE       <-
#32     1   13     1   34 32     33           expr    FALSE         
#4      1   13     1   20  4     32       FUNCTION     TRUE function
#5      1   21     1   21  5     32            '('     TRUE        (
#6      1   22     1   22  6     32 SYMBOL_FORMALS     TRUE        x
#7      1   23     1   23  7     32            ')'     TRUE        )
#29     1   25     1   34 29     32           expr    FALSE         
#9      1   25     1   25  9     29            '{'     TRUE        {
#10     1   26     1   26 10     12         SYMBOL     TRUE        y
#12     1   26     1   26 12     29           expr    FALSE         
#11     1   27     1   27 11     29      EQ_ASSIGN     TRUE        =
#19     1   28     1   30 19     29           expr    FALSE         
#13     1   28     1   28 13     15         SYMBOL     TRUE        x
#15     1   28     1   28 15     19           expr    FALSE         
#14     1   29     1   29 14     19            '+'     TRUE        +
#16     1   30     1   30 16     17      NUM_CONST     TRUE        1
#17     1   30     1   30 17     19           expr    FALSE         
#18     1   31     1   31 18     29            ';'     TRUE        ;
#24     1   33     1   33 24     26         SYMBOL     TRUE        y
#26     1   33     1   33 26     29           expr    FALSE         
#25     1   34     1   34 25     29            '}'     TRUE        }

sum(getParseData(parse(text="plus_one <- function(x) {y=x+1; y}"))$terminal)
#[1] 15

sum(getParseData(parse(text="plus_one <- function(x) {z = x; y = z+1; y}"))$terminal)
#[1] 19

我不确定我是否同意这样的一般性陈述

编写简洁的代码可以获得更好的结果。

于 2013-09-30T16:02:30.550 回答