Анализ возможных путей развития программного обеспечения, страница 2

    return result;

}

ComplexNumber ComplexNumber::substract(ComplexNumber& x,ComplexNumber& y)

{

    ComplexNumber result;

    result.real=x.real-y.real;

    result.image=x.image-y.image;

    return result;

}

ComplexNumber ComplexNumber::divide(ComplexNumber& x,double y)

{

    ComplexNumber result;

    result.real=x.real/y;

    result.image=x.image/y;

    return result;

}

CSqrRoot::CSqrRoot(void)

{

}

CSqrRoot::~CSqrRoot(void)

{

}

void CSqrRoot::initA(double a)

{

    mAparam = a;

}

void CSqrRoot::initB(double b)

{

              mBparam = b;

}

void CSqrRoot::initC(double c)

{

              mCparam=c;

}

CSqrResult CSqrRoot::solve()

{

              CSqrResult result;

              if (mAparam==0)

              {

                            if (mBparam!=0)

                            {

                                           result.x1=result.x2=-mCparam/mBparam;

                                           result.status=CSqrResult::C_OK;

                            }

                            else

                            {

                                           result.status=CSqrResult::C_ERROR;

                            }

              }else

              {

                            ComplexNumber det = ComplexNumber::complexSqrt(mBparam*mBparam-4*mAparam*mCparam);

                            result.x1=result.x2=-2*mBparam;

        result.x1=ComplexNumber::add(result.x1,det); 

        result.x2=ComplexNumber::substract(result.x2,det);

        result.x1=ComplexNumber::divide(result.x1,4*mAparam);

        result.x2=ComplexNumber::divide(result.x2,4*mAparam);

              }

              return result;

}

Расчет метрик для варианта 1

Вычисление метрики Холстеда

Операторы

Число операторов

Операнды

Число операндов

::

19

real

12

=

31

Image

2

==

1

iReal

2

.

34

iImage

2

!=

1

0

6

1

a

64

Unary -  

3

b

38

/

3

c

6

*

6

mAparam

5

return

5

mBparam

6

{

18

mCparam

3

}

18

result.x1

6

(

22

result.x2

6

)

22

result.status

2

Binary -

3

det

3

4

3

2

7

n1= 15

n2=17

N1 = 187

N2 = 173

N= N1+N2 = 187+173=360

n=n1+n2= 15+17 =32

V=N*log2(n)=360*log2(32) = 1800

Цикломатическая сложность

Определяем как сумму цикломатических сложностей всех непустых методов класса

CC = 13

Число линий кода

LoC = 33

Индекс сопровождаемости

MI = MAX(0, (171 — 5.2 * ln(1800) — 0.23 * 13 — 16.2 * ln(33)) * 100 / 171)= 49,038

Глубина дерева наследования =1  (нет наследования)

Связность классов =3

Для второго варианта модификации кода

Вычисление метрики Холстеда

Операторы

Число операторов

Операнды

Число операндов

::

10

real

2

=

19

Image

2

==

1

iReal

2

.

9

iImage

2

!=

1

0

5

1

x

унарный  -

8

a

50

/

6

b

15

*

11

c

2

Return

1

result.real

{

14

result.image

}

14

x.real

(

24

y.real

)

24

x.image

бинарный -

y.image

y

mAparam

8

mBparam

8

mCparam

3

result.x1

4

result.x2

3

result.status

2

det

4

4

6

2

6

n1= 14

n2=17

N1 = 143

N2 = 124

N= N1+N2 = 143+124=267

n=n1+n2= 14+17 =31

V=N*log2(n)=267*log2(31) = 1322,7

Цикломатическая сложность

Определяем как сумму цикломатических сложностей всех непустых методов класса

CC = 13

Число линий кода

LoC = 19

Индекс сопровождаемости

MI = MAX(0, (171 — 5.2 * ln(1322,7) — 0.23 * 9 — 16.2 * ln(19)) * 100 / 171)= 42.33

Глубина дерева наследования =1  (нет наследования)

Связность классов =3

Таким образом несмотря на большие значения строк кода и индекса цикломатичности второй вариант является более привлекательным в общем индексе сопровождаемости.