2015-06-09 2 views
4

В настоящее время я занимаюсь простой программой, чтобы понять уравнения, участвующие в получении различных показателей из науки о программном обеспечении Halstead. Я верю, что делаю это правильно, но мне кажется, что я не зарегистрировал все операнды и операторы, чтобы начать с математики.Проблемы, связанные с метрикой сложности Halstead

Программа Я использую это:

/*01*/ // counts how many items in sArray[] are also in tArray[] 
/*02*/ int matched(int sArray[], int tArray[], int sMax, int tMax) 
/*03*/ { 
/*04*/ int count, i, first, middle, last; 
/*05*/ 
/*06*/ for (i = 0; i < sMax; ++i) 
/*07*/ { 
/*08*/  last = tMax - 1; 
/*09*/  for (int first = 0; first <= last;) 
/*10*/  { 
/*11*/   middle = (first + last)/2; 
/*12*/   if (tArray[middle] == sArray[i]) 
/*13*/   { 
/*14*/     count++; 
/*15*/     break; 
/*16*/   } 
/*17*/   if (tArray[middle] < sArray[i]) 
/*18*/   { 
/*19*/     first = middle + 1; 
/*20*/   } 
/*21*/   else 
/*22*/   { 
/*23*/     last = middle - 1; 
/*24*/   } 
/*25*/   } 
/*26*/ } 
/*27*/ return count; 
/*28*/ } 

И я пришел с

  • n1 = число различных операторов = 10
  • n2 = числом различных операнды = 9
  • N1 = общее число операторов = 24
  • N2 = общее количество операндов = 34

Эти заметки показывают различные операторы и операнды найдено:

Операторы
= Назначение (строка 6, 8, 9, 11, 19, 23) = 6
< Меньше (строка 6, 17) = 2
++ Инкремент (строка 6, 14) = 2
- Вычесть (строка 8, 23) = 2
< = Меньше или равно (строка 9) = 1
+ сложение (строка 11, 19) = 2
/Подразделение (строка 11) = 1
== Равно (строка 12) = 1
[] индекс (строка 2 * 2, 12 * 2, 17 * 2 = 6
break (строка 15) = 1

Операнды
Количество (строка 4, 14) = 2
я (строка 4, 6 * 3, 12, 17) = 6
первой (линия 4, 9 * 2, 11, 19) = 5
средний (строки 4, 11, 12, 17, 19, 23) = 6
последний (строка 4, 8, 9, 11, 23) = 5
sArray (строка 2, 12, 17) = 3
tArray (строка 2, 12, 17) = 3
sMax (строка 2, 6) = 2
Tmax (линия 2, 8) = 2

Есть ли что-нибудь жизненно важное я пропустил? Из моего понимания:

  1. Операндов являются значением
  2. Операторов манипулируют и проверьте операнды
+0

Пожалуйста, не указывайте номера строк в фрагментах кода. Если вы хотите обратить внимание на определенную строку, то, например, комментарий к этой строке. –

+4

@JoachimPileborg В контексте этого вопроса более правдоподобно связать номера строк с примечаниями ниже. Не стоит ожидать, что читатель выполнит код, для тестирования программного обеспечения нужно найти количество операторов и операндов, поэтому по этому вопросу я чувствую, что он помогает читателю быстро просмотреть его легко, будь то комментарий или нет.Я не думаю, что вы читали вопрос в целом, это не имело бы никакого значения, – BIW

+0

Я не знаю метрики, но пред-и пост-инкремент считаются одинаковыми или разными? У вас есть оба. – TripeHound

ответ

2

Пункт метрики Халстеда состоит в том, чтобы ответить на множество вопросов, таких как «Насколько сложным является код для чтения», «Сколько усилий было приложено для написания кода» и т. Д. Формула для показателя сложности Халстеда должна обеспечивать подскажите, как ответили на первый вопрос:

Difficulty = (Unique Operators/2) * (Operands/Unique Operands); 

Вы можете видеть, что наличие более уникальных операторов, очевидно, затрудняет чтение кода.

На брекетах: много источников по этому вопросу считают {} операторами, которых я не вижу. Кудрявые фигурные скобки действуют как элемент структуры (пунктуации), и во многих отношениях код легче понять, а не сложнее. (Возьмите, например, условный блок с и без брекетов)

Подсчет имени функции matched имеет значение только в более общем контексте, но не при измерении показателей реализации функции (при отсутствии рекурсии).

Операторы: операторы подсчета могут быть сложными. Например, [], появляющиеся в объявлении функции и [] на строках 12 и 17, на самом деле разные вещи. Первый - объявление массива, второе - operator[] - доступ к элементу по индексу. То же самое с postfix и префиксом ++, имея их обоих в программе, затрудняет чтение.

Та же логика применима и к языку ключевых слов: for, if, else, break, return. Чем больше их в коде, тем труднее читать.

О типах: имена типов в описании переменных также сложны. Некоторые присваивают их операторам, некоторые - операндам. Но если мы снова посмотрим на формулу сложности, мы увидим, что имена типов лучше будут обращаться к операторам, в том смысле, что иметь более разные типы в коде затрудняет чтение, а не проще.

Ваш счетчик для операндов, похоже, в порядке.

Operators 
= Assignment (line 6, 8, 9, 11, 19, 23) = 6 
< Less Than (line 6, 17) = 2 
++ Prefix Increment (line 6) = 1 
++ Postfix Increment (line 14) = 1 
- Subtract (line 8, 23) = 2 
<= Less Than or Equal to (line 9) = 1 
+ Addition (line 11, 19) = 2 
/Division (line 11) = 1 
== Equal to (line 12) = 1 
[] declaration (line 2) = 2 
[] index (line 12, 17) = 4 
for (line 6, 9) = 2 
if (line 12, 17) = 2 
else (line 21) = 1 
break (line 15) = 1 
return (line 27) = 1 
int declaration = 7 

Operands 
count (line 4, 14) = 2 
i (line 4, 6*3, 12, 17) = 6 
first (line 4, 9*2, 11, 19) = 5 
middle (line 4, 11, 12, 17, 19, 23) = 6 
last (line 4, 8, 9, 11, 23) = 5 
sArray (line 2, 12, 17) = 3 
tArray (line 2, 12, 17) = 3 
sMax (line 2, 6) = 2 
tMax (line 2, 8) = 2 

Metrics 
n1 = 17 
n2 = 9 
N1 = 37 
N2 = 34 
Difficulty = (n1 * N2)/(2 * n2) = 32.1 

Я имел в виду Wiki и this page on Virtual Machinery.

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

К слову: 2, здесь точное и точное определение того, что должно учитываться как операторы и операнды в коде C++: http://www.verifysoft.com/en_halstead_metrics.html.

+0

Отличное разъяснение в связи с путаницей, с которой я столкнулся с операторами, и тем, что, как я думал, я знал об операндах, хорошо написано, спасибо. – BIW

0

во-первых, инициализировать счетчик на 0 и следующие операторы не являются значениями они являются переменными.

operators 
matched -1 
() -6 
[] -6 
{} -6 
int -7 
for -2 
if -2 
else -1 
return -1 
= -6 
< -2 
<= -1 
++ -2 
- -2 
+ -2 
/-1 
== -1 
break -1 

operands 
2 -line no. 11 -1 
1 (8,19,23) -3 
0 -1 
count -3 
i -6 
first -5 
middle -6 
last -5 
sArray -3 
tArray -3 
sMax -2 
tMax -2 

N1=50 
N2=40 
n1=18 
n2=12 

Книга, на которую я имею в виду, - это программные метрики и программная метрология Алена Абрана. Вы можете скачать его здесь ->http://profs.etsmtl.ca/aabran/English/Accueil/ChapersBook/Abran%20-%20Chapter%20005.pdf

Надеюсь, он решит все ваши сомнения.

и имена функций, скобки, имена типов, все другие ключевые слова и все другие хорошо известные операторы приходят в разделе оператора

Переменные и постоянные значения, которые вводятся в любые функции или операторы являются операндами.

Следовательно, я придумал этот ответ.

+0

где я иду не так? –

+0

Спасибо за ответ, я ценю, что вы вкладываете время здесь, но у вас больше информации о том, почему у вас есть результат, который у вас есть из любых достоверных источников? – BIW

+0

Из того, что я узнал. Функции braces - это все операторы, а числа const или символы - все операнды. Это не означает, что они являются операторами и операндами. –

Смежные вопросы