Метрики Холстеда

М. Холстед вводит аппроксимирующую формулу для измерения теоретической длины программы - N^:

N^ = n1*log2(n1) + n2*log2(n2), (10)

где n1 - словарь операторов;

n2 - словарь операндов программы.

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

- последующая операция уничтожает результаты предыдущей без их использования;

- присутствуют тождественные выражения, решающие совершенно одинаковые задачи;

- одной и той же переменной назначаются различные имена и т. п.

Подобные ситуации приводят к изменению N без изменения n.

М. Холстед утверждает, что для стилистически корректных программ отклонение в оценке теоретической длины N^ от реальной N не превышает 10%.

Значение N^ может быть использовано как эталонное значение длины программы со словарем n. Длина корректно составленной программы N, т. е. программы, свободной от избыточности и имеющей словарь n, не должна отклоняться от теоретической длины программы N^ более чем на 10%. Таким образом, измеряя n1, n2, N1 и N2 и сопоставляя значения N и N^ для некоторой программы, при более чем 10%-ном отклонении можно говорить о наличии в программе стилистических ошибок, т. е. несовершенств.

На практике N и N^ часто существенно различаются.

М. Холстед вводит n* - теоретический словарь программы, т.е. словарный запас, необходимый для написания программы, с учетом того, что необходимая функция уже реализована в данном языке и, следовательно, программа сводится к вызову этой функции. Например, согласно М. Холстеду, возможное осуществление процедуры выделения простого числа могло бы выглядеть так:

CALL SIMPLE (X,Y),

где Y - массив численных значений, содержащий искомое число X.

Теоретический словарь в этом случае будет состоять из

n1*: {CALL, SIMPLE (...)}, n1*=2;

n2*: {X, Y}, n2*=2,

а его длина, определяемая как

n* = n1* + n2*,

будет равняться 4.

Используя n*, Холстед вводит оценку V*

V* = n* * log2 n*, (11)

с помощью которой описывается потенциальный объем программы, соответствующий максимально компактному тексту программы, реализующей данный алгоритм.

Еще одной характеристикой, принадлежащей к метрикам корректности программ, по М. Холстеду, является уровень качества программирования L (уровень программы):

L=V*/V, (12)

где V и V* определяется соответственно выражениями (2) и (11).

Исходным для введения этой характеристики является предположение о том, что при снижении стилистического качества программирования уменьшается содержательная нагрузка на каждый компонент программы и, как следствие, расширяется объем реализации исходного алгоритма. Учитывая это, можно оценить качество программирования на основании степени расширения текста относительно потенциального объема V*. Очевидно, для идеальной программы L=1, а для реальной - всегда L<1.

Нередко целесообразно определить уровень программы, не прибегая к оценке ее теоретического объема, поскольку список параметров программы часто зависит от реализации и может быть искусственно расширен. Это приводит к увеличению метрической характеристики качества программирования. М. Холстед предлагает аппроксимировать эту оценку выражением, включающим только фактические параметры, т. е. параметры реальной программы:

L^ = 2*n2 / (n1*N2) (13)

Оценку L^ М.Холстед называл оценкой реализации программы.

Располагая характеристикой L^, Холстед вводит характеристику I, которую рассматривает как интеллектуальное содержание конкретного алгоритма, инвариантное по отношению к используемым языкам реализации:

I = L^ * V (14)

Введение характеристики I позволяет определить умственные затраты на создание программы.

Процесс создания программы условно можно представить как ряд операций: осмысление предложения известного алгоритма; запись предложения алгоритма в терминах используемого языка программирования, т. е. поиск в словаре языка соответствующей инструкции, ее смысловое наполнение и запись.

Используя эту формализацию в методике Холстеда, можно сказать, что написание программы по заранее известному алгоритму есть N^-кратная выборка операторов и операндов из словаря программы n, причем число сравнений (по аналогии с алгоритмами сортировки) составит log2(n).

Если учесть, что каждая выборка-сравнение содержит, в свою очередь, ряд мысленных элементарных решений, то можно поставить в соответствие содержательной нагрузке каждой конструкции программы сложность и число этих элементарных решений. Количественно это можно характеризовать с помощью характеристики L, поскольку 1/L имеет смысл рассматривать как средний коэффициент сложности, влияющий на скорость выборки для данной программы. Тогда оценка необходимых интеллектуальных усилий по написанию программы может быть измерена как

E = N^ * log2(n/L). (15)

Таким образом, E характеризует число требуемых элементарных решений при написании программы.

Однако следует заметить, что E адекватно характеризует лишь начальные усилия по написанию программ, поскольку при построении E не учитываются отладочные работы, которые требуют интеллектуальных затрат иного характера.

Суть интерпретации этой характеристики состоит в оценке не затрат на разработку программы, а затрат на восприятие готовой программы. При этом вместо теоретической длины программы N^ используется ее реальная длина:

E' = N * log2(n/L). (16)

Характеристика E' введена исходя из предположения, что интеллектуальные усилия на написание и восприятие программы очень близки по своей природе. Однако если при написании программы стилистические погрешности в тексте практически не должны отражаться на интеллектуальной трудоемкости процесса, то при попытке понять такую программу их присутствие может привести к серьезным осложнениям. Эта посылка достаточно хорошо согласуется с выводами относительно взаимосвязи N и N^, изложенными выше.

Преобразуя формулу (15) с учетом выражений (2) и (12), получаем

E = V * V / V*.

Такое представление E', а соответственно и E, так как E=E', наглядно иллюстрирует целесообразность разбиения программ на отдельные модули, поскольку интеллектуальные затраты оказываются пропорциональными квадрату объема программы, который всегда больше суммы квадратов объемов отдельных модулей.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: