- •Методические указания
- •Для студентов специальности 6.050102
- •Всех форм обучения
- •1.Разработка технического задания. Лабораторная работа № 1
- •1.1 Теоретические сведения
- •1.2 Задание на лабораторную работу
- •1.3 Список контрольных вопросов
- •2.Оформление программной документации. Лабораторная работа № 2
- •2.1 Теоретические сведения
- •2.2 Задание на лабораторную работу
- •2.3 Список контрольных вопросов
- •3. Расчет метрик холстеда. Лабораторная работа № 3
- •3.1 Описание метрик Холстеда
- •3.2 Пример определения характеристик программы
- •3.3 Порядок выполнения работы
- •3.4 Список контрольных вопросов
- •4. Оптимизация программ. Лабораторная работа № 4
- •4.1 Теоретические сведения
- •4.2 Порядок выполнения работы
- •4.3 Список контрольных вопросов
- •5. Структурное тестирование. Лабораторная работа № 5
- •5.1 Задачи и методы тестирования
- •5.2 Структурное тестирование
- •5. 3 Выполнение работы
- •5.5 Список контрольных вопросов
- •6. Метод эквивалентных разбиений. Лабораторная работа № 6
- •6.1 Теоретические сведения
- •6.2 Выделение классов эквивалентности
- •6.3 Построение тестов
- •6.4 Порядок выполнения работы
- •6.5 Список контрольных вопросов
- •7. Метод функциональных диаграмм. Лабораторная работа n 7
- •7.1 Особенности метода функциональных диаграмм
- •7.2 Базовые символы для записи функциональных диаграмм
- •7.3 Пример построения функциональной диаграммы
- •7.4 Преобразование функциональной диаграммы в таблицу решений и построение тестов
- •7.5 Порядок выполнения работы
- •7.6 Список контрольных вопросов
- •8. Расстановка контрольных точек. Лабораторная работа №8
- •8.1 Теоретические сведения
- •8.2 Порядок выполнения работы
- •8.3 Список контрольных вопросов
- •9. Мутационный анализ. Лабораторная работа № 9
- •9.1 Теоретические сведения
- •9.2 Описание мутаций
- •9.3 Порядок выполнение работы
- •9.4 Список контрольных вопросов
- •10. Оценка надежности программ. Лабораторная работа № 10
- •10.1 Теоретические сведения
- •10.2 Порядок выполнения работы
- •10.3 Список контрольных вопросов
- •11. Определение показателей качества программного средства. Лабораторная работа № 11
- •11.1 Теоретические сведения
- •11.2 Номенклатура показателей качества
- •11.3 Методы оценки уровня качества пс
- •11.3 Порядок выполнения работы
- •11.5 Содержание отчета
- •11.6 Список контрольных вопросов
- •12. Расчет метрик чидамбера-кемерера. Лабораторная работа № 12
- •12.1 Теоретические сведения
- •12.2 Использование метрик Чидамбера-Кемерера
- •12.3 Порядок выполнения работы
- •12.4 Содержание отчета о выполнении работы
- •12.5 Список контрольных вопросов
2.2 Задание на лабораторную работу
В соответствии с разработанным в первой работе Техническим Заданием реализовать программный продукт. Язык программирования Java. Отчет по лабораторной работе должен содержать следующие программные документы:
Руководство программиста (ГОСТ 19504-79);
Описание программы (ГОСТ 19.402-78);
Текст программы (ГОСТ 19.401-78);
Программа и методика испытаний (ГОСТ 19.301-79).
2.3 Список контрольных вопросов
1. Виды программных документов?
2. Содержание документа «Руководство программиста (ГОСТ 19504-79)».
3. Содержание документа «Описание программы (ГОСТ 19.402-78)»;
4. Содержание документа «Текст программы (ГОСТ 19.401-78)»;
5. Содержание документа «Программа и методика испытаний (ГОСТ 19.301-79)».
3. Расчет метрик холстеда. Лабораторная работа № 3
Цель работы: Изучение основ метрической теории программ Холстеда, расчет количественных характеристик для программных модулей.
3.1 Описание метрик Холстеда
Метрики Холстеда предлагают разумный подход к решению следующих задач:
предсказание условий, необходимых для программирования по предложенным проектам;
определение норм первоначальных ошибок;
количественная оценка языков программирования и эффекта модульности;
обоснование метода измерения различий между программами, написанными специалистами разного уровня.
В основе вычисления метрик Холстеда лежит концепция, согласно которой алгоритм состоит только из операторов и операндов (проверяется рассмотрением простых вычислительных машин с форматом команд, содержащим две части: код операции и адрес операнда). Операнды - переменные или константы, используемые в данной реализации алгоритма. Операторы - комбинации символов, влияющие на значение или порядок операндов.
В основе вычисляемых свойств алгоритма лежат следующие характеристики:
n1 - число различных операторов данной реализации;
n2 - число различных операндов данной реализации;
N1 - общее число всех операторов;
N2 - общее число всех операндов;
- n2*- число различных входных и выходных операндов (в случае, если операндом является агрегатная структура данных, например, массив, то n2* следует увеличить на ее размерность. Так для одномерного массива на 1, для матрицы на 2 и т.п.).
На основании приведенных выше характеристик вычисляются:
словарь n = n1 + n2;
длина реализации N = N1 + N2.
Метрики Холстеда включают следующие характеристики.
Длина программы: N'= n1 * log2(n1) + n2 * log2(n2)
Если программа состоит из нескольких модулей (m - число модулей), то для каждого модуля определяется n1 среднее (n1ср) и n2 среднее (n2ср). В этом случае длина программы
N' = m*(n1ср * log2(n1cp) + n2cp * log2(n2cp))
Это справедливо, т.к. соотношение между словарем и длинной программы определяет как ее отдельные части, так и программу в целом.
Приведенные соотношения справедливы для правильно написанных, безизбыточных программ, т.е. должно выполняться соотношение
N ≈ N'
2) Объем программы: V = N * log2(n)
Для двоичной кодировки словаря программы потребуется log2(n) двоичных разрядов. Тогда V интерпретируется как объем программы в битах. Объем зависит от языка программирования, на котором реализован алгоритм.
3) Потенциальный (минимальный) объем: V* = (2+ n2*) * log2(2+ n2*)
Минимально возможный объем предполагает существование языка, в котором действия, выполняемые исследуемой программой, уже определены или реализованы, возможно, в виде процедуры или функции. Тогда, такая «идеальная» программа должна содержать 2 оператора (один для вызова процедуры, второй - для присвоения результата) и список из n2* фактических параметров.
4) Cоотношение между операциями и операндами (зависимость числа операндов n2 от числа операций n1):
n2 = A * n1 + B , где
A = n2* /(n2* +2) * log2(n2*/2),
B = n2* - 2 * A
5) Уровень программы: L = V*/V
где V* - потенциальный объем, V - объем программы.
L=1 для потенциального языка, в котором присутствует любая процедура, которая могла бы понадобиться (число таких процедур должно быть близко к бесконечности).
Определяет лаконичность реализации. Чем больше в реализации используется конструкций близких по смыслу к конструкциям потенциального языка, тем ее уровень выше. Уровень программы выше при использовании узкоспециализированных языков, чем при использовании универсальных.
Альтернативное определение уровня L: L' = (n1*) * n2/(n1*N2), где n1*=2
6) Интеллектуальное содержание: I = L' * V или: I = 2 * n2/(n1 * N2)*N * log2(n)
Интеллектуальное содержание - мера того, "сколько было сказано в программе". Не зависит от языка программирования, а зависит от сложности задачи.
Интеллектуальное содержание должно быть близко к значению потенциального объема в пределах 10%. Существенные отличия говорят о несовершенстве реализации алгоритма.
7) Работа по программированию. Это умственная работа, затрачиваемая на превращение заранее разработанного алгоритма в фактическую реализацию на языке программирования. Кодирование алгоритма можно свести к двоичному поиску в словаре n, выполненное N раз, т.е.
V = N * log2(n)
Кроме того, работа будет обратно пропорцинальна сложности, т.е уровню программы. Тогда общее число элементарных мысленных различий, требуемых для порождения программы: E=V/L или E = V 2/ V*,
Так как квадрат суммы не меньше суммы квадратов, то правильное разбиение на модули уменьшает работу по программированию:
E = E1 + E2 + E3 + ...
8) Приближенное время программирования(кодирования алгоритма): T = E/S, где S = 18 моментов (различий)/сек - постоянная Страуда.
Согласно теории психолога Дж. Страуда именно столько человеческий мозг может сделать элементарных различений в секунду. S выражает верхнюю границу работоспособности мозга при максимальной концентрации на решении некоторой задачи.
Альтернативное определение времени Т: Т'= n1*N2*N*log2(n)/(2*S*n2). Если заменить в этой формуле N на N' , то получим время, не зависящее от реализации
Т'= n1*N2* (n1 * log2(n1) + n2 * log2(n))*log2(n)/(2*S*n2)
9) Уровень языка.
Согласно метрике 5 можно выявить полезное соотношение между уровнем программы L и ее объемом V. Для любого алгоритма, который переводится с одного языка реализации иа другой, с увеличением объема уровень уменьшается в той же пропорции. В результате произведение L на V равняется потенциальному объему V* данного алгоритма.
С другой стороны, если язык реализации остается одним и тем же, а разрешено менять сам алгоритм, имеется другое, но похожее соотношение. В этом случае с увеличением потенциального объема V* уровень программы L, уменьшается в том же отношении. Следовательно, произведение L иа V* остается неизменным для любого языка. Это произведение, называемое уровнем языка, обозначается через λ и записывается в виде
λ=LV* или λ= L * L* V
Естественные языки имеют высокое значение уровня, машинный код – низкое.
10) Уравнение ошибок.
Рассмотрим т.н. «переданные ошибки», т. е. ошибки, остающиеся в реализации программы после завершения некоторой идентифицируемой фазы, такой, как публикация, например, при передаче модуля системы для объединения с другими модулями. Если обозначить общее число переданных ошибок в данной реализации символом В, то
число переданных ошибок в программе: B = V/E0, или В=Е2/3/Е0 ,
где E0 = 3000 и расчитано для высокоуровневого естественного языка (например, английского).