Исходные данные
|
Результат
|
Оценка
|
Запуск
программы
|
Открытие
программы в браузере. Пункты: Инициализация.
|
+
|
Ввод количества
вариантов использования, количества типов объектов, количества свойств
объектов, количества взаимодействий между типами объектов, количества типов
узлов (числовое значение)
|
Переход на
следующий шаг с помощью кнопки «ДАЛЕЕ»
|
+
|
Нажатие на
кнопку «ДАЛЕЕ» при некорректном вводе количества вариантов использования,
количества типов объектов, количества свойств объектов, количества
взаимодействий между типами объектов, количества типов узлов
|
Сообщение
«Некорректный ввод данных»
|
+
|
Ввод нового
срока разработки на шаге «6. Результаты расчета трудоемкости» (числовое
значение)
|
Переход на
следующий шаг с помощью кнопки «ДАЛЕЕ», или, при необходимости, на предыдущий
шаг с помощью кнопки «НАЗАД»
|
+
|
Нажатие на
кнопку «ДАЛЕЕ» при некорректном вводе нового срока разработки
|
Сообщение
«Некорректный ввод данных»
|
+
|
Нажатие на
кнопку «НАЗАД» при некорректном вводе нового срока разработки
|
Сообщение
«Некорректный ввод данных»
|
+
|
Ввод заработной
платы разработчика, инфляции за 3 предыдущих года, процента социальных выплат
и процента НДС на шаге «8. Ввод данных для получения стоимости разработки»
(числовое значение)
|
Переход на
следующий шаг с помощью кнопки «ДАЛЕЕ», или, при необходимости, на предыдущий
шаг с помощью кнопки «НАЗАД»
|
+
|
Нажатие на
кнопку «ДАЛЕЕ» при некорректном вводе заработной платы разработчика, инфляции
за 3 предыдущих года, процента социальных выплат и процента НДС
|
Сообщение
«Некорректный ввод данных»
|
+
|
Нажатие на
кнопку «НАЗАД» при некорректном вводе заработной платы разработчика, инфляции
за 3 предыдущих года, процента социальных выплат и процента НДС
|
Сообщение
«Некорректный ввод данных»
|
+
|
Шаг «9. Итоги»
|
На форме
Результаты подсчета выведены все требующиеся результаты: трудоемкость, сроки
разработки, число разработчиков, стоимость разработки, стоимость
сопровождения.
|
+
|
4.1 Подготовка данных контрольного примера
Для контрольного примера возьмем такой набор исходных данных:
количество вариантов использования - C = 12;
количество типов объектов - E = 26;
количество свойств типов объектов - Т = 134;
количество взаимодействий между типами объектов - I = 102;
количество типов узлов - N = 4.
Характеристики:
Режим эксплуатации ИС: обработка данных в режиме разделения
времени;
Масштаб ИС: средние ИС (от 11 до 100 пользователей с
длительным ЖЦ с
возможностью роста до крупных систем);
Стабильность ИС: дискретное внесение изменений;
Защита от несанкционированного доступа: средняя;
Защита программ и данных (на уровне операционной системы, на
уровне сетевого программного обеспечения, на уровне СУБД): средняя;
Контрольный след операций: не имеется;
Отказоустойчивость: средняя;
Восстанавливаемость: средняя;
Длительность обработки (время отклика): умеренная;
Исходный язык разработки: объектно-ориентированный (С++ или
эквивалентный);
Класс пользователя: специалист(эксперт);
Требования к центральному обрабатывающему устройству
(процессору): средняя;
Требования к оперативной (основной) памяти: большая;
Требования к внешней памяти: большая;
Требования к локальной вычислительной сети: высокие
требования;
Критичность ИС: организационная безопасность;
Готовность: общедоступная (известная методика);
Представление данных: индексируемый (иерархический).
Заработная плата разработчика: 60 000 руб.;
Инфляция за 2012 год: 6,58;
Инфляция за 2013 год: 6,45;
Инфляция за 2014 год: 11,36;
Процент социальных выплат = 22%;
Процент НДС = 13%.
Срок разработки уменьшать не будем.
В ходе расчетов определяем базовые трудоемкости основных
процессов:
Бизнес моделирование: S1 = 15,55;
Управление требованиями: S2 = 21,2;
Проектирование: S3 = 62,27;
Реализация: S4 = 78,65;
Тестирование: S5 = 6,47;
Развертывание: S6 = 1,21;
На основе выбранных характеристик считаем поправочные
коэффициенты:
КП1=КП2=КП3=КП4=КП5=КП6=1;
Трудоемкость разработки: S=185, 35
(человеко-месяцев)
На основе таблицы П2.3 приложения 3 находим минимальный и
максимальный сроки разработки, рассчитываем средний срок разработки: 8,5
месяцев.
Средняя стоимость 1 человека-месяца разработчика: Сср
= 228996,2 руб.;
Стоимость работ на создание ППО ИС: СППО =
185.35*228996 =42444451.23 руб.;
Стоимость сопровождения ППО ИС: CCППО = 6366667,685 руб.
4.2
Анализ результатов расчёта и выводы
Произведем расчет с помощью приложения, введя те же исходные
данные.
Пройдя все шаги, получим результат, который показан на
рисунке 4.1.
Рисунок 4.1. Результат контрольного примера
Сравнив результаты ручного решения по методике и программного
с помощью нашего приложения, можно сделать вывод, что данные очень близки,
незначительные различия получились за счет округления при ручном решении.
Поэтому программа успешно прошла тест, расчеты с её помощью верны.
5. Разработка руководства пользователя
Система обладает интуитивно понятным web-интерфейсом, поэтому
пользователю нужно лишь освоиться на начальном этапе работы.
Инструкция по использованию:
1.
Запустите
файл zakaz.html в любом браузере.
2.
На
первом шаге Вам необходимо ввести функциональные единицы измерения C, E, T, I, N.
3.
Дальнейшие
действия направлены на уточнение характеристик ИС. Переходя по шагам,
необходимо в выпадающих списках выбрать те варианты, которые Вы считаете
адекватными.
4.
На
пятом шаге будет показан предполагаемый срок разработки. Если Вы желаете его
уменьшить, то можно ввести новый срок. Но стоит учесть, что в таком случае
увеличится трудоёмкость разработки и, соответственно, затраты на разработку. На
следующем шаге Вы увидите скорректированный срок разработки.
5.
Следующим
шагом нужно ввести значения заработной платы разработчика в Вашем регионе,
уровень инфляции за последние три года. Процент социальных выплат и НДС.
6.
В
итоге будет показан срок разработки, стоимость разработки и сопровождения
программного продукта.
7.
Если
Вы хотите изменить какие-либо характеристики или значения, то есть возможность
вернуться на тот шаг, где они выбираются, и выбрать новое значение.
8.
Для
закрытия программы можно закрыть вкладку или весь браузер полностью.
В ходе проектирования было решено разработать расширенное
руководство пользователя, которое будет содержать информацию о методике,
методах определения значений функциональных единиц измерений в случае
отсутствия UML-диаграмм модели разрабатываемой
информационной системы, демонстрационный пример расчета, помощь в ситуации,
когда в браузере не работает JavaScript.
Для разработки руководства пользователя я решила использовать
программу HTML Help Workshop.
Технология HTML Help Workshop является стандартной справочной
системой для платформы Windows. Авторы могут использовать HTML Help Workshop
для создания справочных файлов в своих программах или для создания содержимого
веб-сайта. В качестве информационной системы технология HTML Help Workshop
пригодна для широкого диапазона приложений, включая большие руководства,
интерактивные книги и электронные газеты, которые также удобны, как и
справочные системы программного обеспечения.
Возможности HTML Help Workshop имеют некоторые преимущества
перед стандартным гипертекстом - это способность снабжения справочной системы
комбинированной таблицей содержания и перечнем указателей, а также
использование ключевых слов для дополнительной гиперссылочной
производительности. Компилятор HTML Help, являющийся частью HTML Help Workshop,
делает возможным сжатие гипертекста, графики и других файлов в сравнительно
небольшой компилированный справочный файл (.chm), который может затем
распространяться с программным обеспечением или загружаться из сети.Help
Workshop состоит из неавтономной программы просмотра справки (Help Viewer),
связанных с ней справочных компонентов и авторских систем по разработке справки
от корпорации Microsoft. Программа просмотра справки использует лежащие в ее
основе компоненты Microsoft Internet Explorer для отображения справочного
содержимого. Программа просмотра поддерживает гипертекст, ActiveX, Java, языки
скриптов (JScript и Microsoft Visual Basic Scripting Edition), а также сетевые
форматы изображений (файлы.jpeg.gif и.png).
·
Структура
CHM-документа
Простейший CHM-документ состоит из обычных гипертекстовых
страниц, объединенных впоследствии в сжатый (откомпилированный) сборочный файл.
После создания подобного документа для того, чтобы преобразовать его в
полнофункциональный справочный файл, можно добавить к нему ряд навигационных
панелей, облегчающих поиск информации в проекте.
Например, закладка TOC «Содержание» (Table of Contents,
таблица содержания), куда можно вывести ссылки на гипертекстовые страницы,
помещенные в документ, образовав иерархическую структуру с разворачивающимися и
сворачивающимися сегментами.
Индексная закладка «Указатель», позволяет по ключевому слову
найти требуемую страницу или совокупность страниц.
Закладка «Поиск» производит поиск введенного слова в тексте и
просматривает страницы, содержащие это.
·
Достоинства
HTML Help Workshop
При создании страниц проекта можно использовать весь механизм
языка разметки гипертекста, добавлять скрипты JavaScript и VBScript или
каскадные таблицы стилей CSS.
Возможность быстро открыть любую страницу справочного
документа, выбрав из меню «Параметры» команду «Перейти по адресу…».
Возможность просмотреть любую страницу в исходном
гипертекстовом коде.
·
Недостатки
HTML Help Workshop
Возможность смотреть CHM-файлы присутствует только в
операционных системах семейства Windows, где установлен Internet Explorer не
ниже 4-й версии. [10]
На рисунках 5.1 - 5.2 приведены примеры интерфейса справки.
Рисунок. 5.1. Интерфейс руководства пользователя
Рисунок
5.2. Интерфейс руководства пользователя
Заключение
В ходе выпускной квалификационной работы был разработан
инструментарий для расчета трудоёмкости и стоимости разработки программного
продукта по методике CETIN.
В процессе выполнения данной работы был проведен следующий
комплекс работ:
проведен аналитический обзор различных методик, позволяющих
произвести расчет трудоёмкости и стоимости разработки программного продукта и
выбрана методика, которая позволяет произвести такой расчет на ранних этапах;
проведен аналитический обзор различных технологий,
позволяющих реализовать данную программу, показавший, что в настоящее время в
данной области уже существует достаточно широкий спектр соответствующих методов
и технологий разработки, что в свою очередь позволяет разработать необходимый
продукт;
разработан алгоритм программы, определены интерфейсы и все
программно реализовано;
проведено функциональное тестирование системы;
разработано руководство пользователя системы;
Результатом выполнения выпускной квалификационной работы
стала программа, отвечающая всем заданным требованиям. На данном этапе
программа не позволяет в полном объёме собирать статистику по осуществленным
проектам, но планируется ее расширение и создание базы данных со
статистическими данными по осуществленным и предстоящим
Таким образом, разработанная программа является готовым и
работоспособным продуктом.
Список использованных источников
1.
Группа
компаний SRG. [Электронный ресурс]: статья - Режим доступа:
#"897473.files/image027.gif">
Приложение 4
Код приложения заказчика
<%@page import= «ru.cetin. CetinForm»%>
<%@page contentType= «text/html» pageEncoding=
«UTF-8»%>
<%@ taglib uri=
«http://struts.apache.org/tags-html» prefix= «html»%>
<%@ taglib uri=
«http://struts.apache.org/tags-tiles» prefix= «tiles»%>
<html>
<head>
<title>CETIN</title>
<meta charset= «UTF-8»>
<meta name= «viewport» content=
«width=device-width»>
<script type= «text/javascript» src=
«js/libs/jquery/jquery.js»></script>
<script type= «text/javascript» src=
«js/cetin.js»></script>
<link href= «css/style.css» type= «text/css»
rel= «stylesheet»>
</head>
<body id= «body»>
<html:form method= «POST» action=»/cetin»>
<h1>Методика оценки трудоемкости программного продукта
CETIN</h1>
<script type= «text/javascript»>cetin = new
Cetin();stepManager = new StepManager («body», «stepManager»);
<% CetinForm form = (CetinForm)
pageContext.getAttribute («Cetin», PageContext.REQUEST_SCOPE);%>.params.c =
<% out.write (Integer.toString (form.getCase()));%>;.params.e = <%
out.write (Integer.toString (form.getEntity()));%>;.params.t = <%
out.write (Integer.toString (form.getTool()));%>;.params.i = <% out.write
(Integer.toString (form.getInteraction()));%>;.params.n = <% out.write
(Integer.toString (form.getNode()));%>;
.paramsEdited.c = [
<% out.write (Double.toString (form.getC1
()));%>,
<% out.write (Double.toString (form.getC2
()));%>,
<% out.write (Double.toString (form.getC3
()));%>,
<% out.write (Double.toString (form.getC4
()));%>,
<% out.write (Double.toString (form.getC5
()));%>,
<% out.write (Double.toString (form.getC6
()));%>
];
.paramsEdited.e = [
<% out.write (Double.toString (form.getE1
()));%>,
<% out.write (Double.toString (form.getE2
()));%>,
<% out.write (Double.toString (form.getE3
()));%>,
<% out.write (Double.toString (form.getE4
()));%>,
<% out.write (Double.toString (form.getE5
()));%>,
<% out.write (Double.toString (form.getE6
()));%>
];
.paramsEdited.t = [
<% out.write (Double.toString (form.getT1
()));%>,
<% out.write (Double.toString (form.getT2
()));%>,
<% out.write (Double.toString (form.getT3
()));%>,
<% out.write (Double.toString (form.getT4
()));%>,
<% out.write (Double.toString (form.getT5
()));%>,
<% out.write (Double.toString (form.getT6
()));%>
];
cetin.paramsEdited.i = [
<% out.write (Double.toString (form.getI1
()));%>,
<% out.write (Double.toString (form.getI2
()));%>,
<% out.write (Double.toString (form.getI3
()));%>,
<% out.write (Double.toString (form.getI4
()));%>,
<% out.write (Double.toString (form.getI5
()));%>,
<% out.write (Double.toString (form.getI6
()));%>
];
.paramsEdited.n = [
<% out.write (Double.toString (form.getN1
()));%>,
<% out.write (Double.toString (form.getN2
()));%>,
<% out.write (Double.toString (form.getN3
()));%>,
<% out.write (Double.toString (form.getN4
()));%>,
<% out.write (Double.toString (form.getN5
()));%>,
<% out.write (Double.toString (form.getN6
()));%>
];
.s[0] = [
<% out.write (Double.toString (form.getSc1
()));%>,
<% out.write (Double.toString (form.getSe1 ()));%>,
<% out.write (Double.toString (form.getSt1
()));%>,
<% out.write (Double.toString (form.getSi1
()));%>,
<% out.write (Double.toString (form.getSn1
()));%>
];
.s[1] = [
<% out.write (Double.toString (form.getSc2
()));%>,
<% out.write (Double.toString (form.getSe2
()));%>,
<% out.write (Double.toString (form.getSt2
()));%>,
<% out.write (Double.toString (form.getSi2
()));%>,
<% out.write (Double.toString (form.getSn2
()));%>
];
.s[2] = [
<% out.write (Double.toString (form.getSc3
()));%>,
<% out.write (Double.toString (form.getSe3
()));%>,
<% out.write (Double.toString (form.getSt3
()));%>,
<% out.write (Double.toString (form.getSi3
()));%>,
<% out.write (Double.toString (form.getSn3
()));%>
];
.s[3] = [
<% out.write (Double.toString (form.getSc4
()));%>,
<% out.write (Double.toString (form.getSe4
()));%>,
<% out.write (Double.toString (form.getSt4
()));%>,
<% out.write (Double.toString (form.getSi4
()));%>,
<% out.write (Double.toString (form.getSn4
()));%>
];
.s[4] = [
<% out.write (Double.toString (form.getSc5
()));%>,
<% out.write (Double.toString (form.getSe5
()));%>,
<% out.write (Double.toString (form.getSt5
()));%>,
<% out.write (Double.toString (form.getSi5
()));%>,
<% out.write (Double.toString (form.getSn5
()));%>
];
.s[5] = [
<% out.write (Double.toString (form.getSc6
()));%>,
<% out.write (Double.toString (form.getSe6
()));%>,
<% out.write (Double.toString (form.getSt6
()));%>,
<% out.write (Double.toString (form.getSi6
()));%>,
<% out.write (Double.toString (form.getSn6
()));%>
];
.k = [
<% out.write (Double.toString
(form.getK1Text()));%>,
<% out.write (Double.toString
(form.getK2Text()));%>,
<% out.write (Double.toString
(form.getK3Text()));%>,
<% out.write (Double.toString (form.getK5Text()));%>,
<% out.write (Double.toString
(form.getK6Text()));%>,
<% out.write (Double.toString
(form.getK7Text()));%>,
<% out.write (Double.toString
(form.getK8Text()));%>,
<% out.write (Double.toString
(form.getK9Text()));%>,
<% out.write (Double.toString
(form.getK10Text()));%>,
<% out.write (Double.toString
(form.getK11Text()));%>,
<% out.write (Double.toString
(form.getK12Text()));%>,
<% out.write (Double.toString
(form.getK13Text()));%>,
<% out.write (Double.toString
(form.getK14Text()));%>,
<% out.write (Double.toString
(form.getK15Text()));%>,
<% out.write (Double.toString
(form.getK16Text()));%>,
<% out.write (Double.toString
(form.getK17Text()));%>,
<% out.write (Double.toString
(form.getK18Text()));%>
];
.cost.cost = <% out.write (Double.toString
(form.getZp0 ()));%>;.cost.psn = <% out.write (Double.toString
(form.getPsn()));%>;.cost.pnds = <% out.write (Double.toString
(form.getPnds()));%>;.cost.inflation[0] = <% out.write (Double.toString
(form.getInf0 ()));%>;.cost.inflation[1] = <% out.write (Double.toString
(form.getInf1 ()));%>;.cost.inflation[2] = <% out.write (Double.toString
(form.getInf2 ()));%>;
cachedParams = {c:0, e:0, t:0, i:0, n:0};
</script>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «1»/>
<tiles:put name= «isFirstStep» value=
«true»/>
<tiles:put name= «title» value= «Инициализация»/>
<tiles:put name= «onOpenFunction»>()
{params = cetin.params;
$(«#case»).val (params.c);
$(«#entity»).val (params.e);
$(«#tool»).val (params.t);
$(«#interaction»).val (params.i);
$(«#node»).val (params.n);
.c = params.c;.e = params.e;.t = params.t;.i =
params.i;.n = params.n;
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.params.c = parseInt($(«#case»).val());.params.e = parseInt($(«#entity»).val());.params.t
= parseInt($(«#tool»).val());.params.i =
parseInt($(«#interaction»).val());.params.n = parseInt($(«#node»).val());
calc = 0;
changed = (cachedParams.c!== cetin.params.c) ||
(cachedParams.e!== cetin.params.e) ||
(cachedParams.t!== cetin.params.t) ||
(cachedParams.i!== cetin.params.i) ||
(cachedParams.n!== cetin.params.n);(var j = 0; j
< 6; j++) {p = cetin.params;(changed)
{.paramsEdited.c[j] = p.c;.paramsEdited.e[j] =
p.e;.paramsEdited.t[j] = p.t;.paramsEdited.i[j] = p.i;.paramsEdited.n[j] =
p.n;sji = cetin.s[j];sj = 1.0 / 165 * (p.c * sji[0] + p.e * sji[1] + p.t *
sji[2] + p.i * sji[3] + p.n * sji[4]);.sj[j] = sj;
}
}
();
}
</tiles:put>
<tiles:put name= «validators»>
[Validator («case», /^\d+$/, «Необходимо ввести
число»),Validator («entity», /^\d+$/, «Необходимо ввести число»),Validator
(«tool», /^\d+$/, «Необходимо ввести число»),Validator («interaction», /^\d+$/,
«Необходимо ввести число»),Validator («node», /^\d+$/, «Необходимо ввести
число»)
]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Для начала оценки необходимо составить диаграмму вариантов
использования, диаграмму классов, диаграмму коммуникаций и диаграмму
развертывания.
</p>
<p>
По полученным данным диаграмм необходимо заполнить следующие
поля:
</p>
<p>
Количество вариантов использования (case):
<html:text property= «case» styleId= «case»
size= «8»/>
</p>
<p>
Количество типов объектов (entity):
<html:text property= «entity» styleId=
«entity» size= «8»/>
</p>
<p>
Количество свойств типов объектов (tool):
<html:text property= «tool» styleId= «tool»
size= «8»/>
</p>
<p>
Количество взаимодействий между типами объектов
(interaction):
<html:text property= «interaction» styleId=
«interaction» size= «8»/>
</p>
<p>
Количество типов узлов (node):
<html:text property= «node» styleId= «node»
size= «8»/>
</p>
</tiles:put>
</tiles:insert>
<script type= «text/javascript»>recalcSj()
{{(var j = 0; j < 6; j++) {cc = cetin.params.c;ce = cetin.params.e;ct =
cetin.params.t;ci = cetin.params.i;cn = cetin.params.n;
scc = parseFloat($(«#sc» + (j + 1)).val());sce =
parseFloat($(«#se» + (j + 1)).val());sct = parseFloat($(«#st» + (j +
1)).val());sci = parseFloat($(«#si» + (j + 1)).val());scn = parseFloat($(«#sn»
+ (j + 1)).val());
cetin.paramsEdited.c[j] = cc;.paramsEdited.e[j] =
ce;.paramsEdited.t[j] = ct;.paramsEdited.i[j] = ci;.paramsEdited.n[j] =
cn;.s[j] [0] = scc;.s[j] [1] = sce;.s[j] [2] = sct;.s[j] [3] = sci;.s[j] [4] =
scn;.sj[j] = 1.0 / 165 * (cc * scc + ce * sce + ct * sct + ci * sci + cn *
scn);
}
} catch(err) {}
}
</script>
<html:hidden property= «c1» styleId=
«c1»/><html:hidden property= «sc1» styleId= «sc1»/>
<html:hidden property= «e1» styleId=
«e1»/><html:hidden property= «se1» styleId= «se1»/>
<html:hidden property= «t1» styleId=
«t1»/><html:hidden property= «st1» styleId= «st1»/>
<html:hidden property= «i1» styleId=
«i1»/><html:hidden property= «si1» styleId= «si1»/>
<html:hidden property= «n1» styleId=
«n1»/><html:hidden property= «sn1» styleId= «sn1»/>
<html:hidden property= «c2» styleId=
«c2»/><html:hidden property= «sc2» styleId= «sc2»/>
<html:hidden property= «e2» styleId=
«e2»/><html:hidden property= «se2» styleId= «se2»/>
<html:hidden property= «t2» styleId=
«t2»/><html:hidden property= «st2» styleId= «st2»/>
<html:hidden property= «i2» styleId=
«i2»/><html:hidden property= «si2» styleId= «si2»/>
<html:hidden property= «n2» styleId=
«n2»/><html:hidden property= «sn2» styleId= «sn2»/>
<html:hidden property= «c3» styleId=
«c3»/><html:hidden property= «sc3» styleId= «sc3»/>
<html:hidden property= «e3» styleId=
«e3»/><html:hidden property= «se3» styleId= «se3»/>
<html:hidden property= «t3» styleId=
«t3»/><html:hidden property= «st3» styleId= «st3»/>
<html:hidden property= «i3» styleId=
«i3»/><html:hidden property= «si3» styleId= «si3»/>
<html:hidden property= «n3» styleId=
«n3»/><html:hidden property= «sn3» styleId= «sn3»/>
<html:hidden property= «c4» styleId=
«c4»/><html:hidden property= «sc4» styleId= «sc4»/>
<html:hidden property= «e4» styleId=
«e4»/><html:hidden property= «se4» styleId= «se4»/>
<html:hidden property= «t4» styleId=
«t4»/><html:hidden property= «st4» styleId= «st4»/>
<html:hidden property= «i4» styleId=
«i4»/><html:hidden property= «si4» styleId= «si4»/>
<html:hidden property= «n4» styleId=
«n4»/><html:hidden property= «sn4» styleId= «sn4»/>
<html:hidden property= «c5» styleId=
«c5»/><html:hidden property= «sc5» styleId= «sc5»/>
<html:hidden property= «e5» styleId=
«e5»/><html:hidden property= «se5» styleId= «se5»/>
<html:hidden property= «t5» styleId=
«t5»/><html:hidden property= «st5» styleId= «st5»/>
<html:hidden property= «i5» styleId=
«i5»/><html:hidden property= «si5» styleId= «si5»/>
<html:hidden property= «n5» styleId=
«n5»/><html:hidden property= «sn5» styleId= «sn5»/>
<html:hidden property= «c6» styleId=
«c6»/><html:hidden property= «sc6» styleId= «sc6»/>
<html:hidden property= «e6» styleId=
«e6»/><html:hidden property= «se6» styleId= «se6»/>
<html:hidden property= «t6» styleId=
«t6»/><html:hidden property= «st6» styleId= «st6»/>
<html:hidden property= «i6» styleId=
«i6»/><html:hidden property= «si6» styleId= «si6»/>
<html:hidden property= «n6» styleId=
«n6»/><html:hidden property= «sn6» styleId= «sn6»/>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «2»/>
<tiles:put name= «title» value= «Внутренние факторы 1»/>
<tiles:put name= «onOpenFunction»>()
{(«k1», cetin.k[0]);(«k2», cetin.k[1]);(«k3», cetin.k[2]);(«k4»,
cetin.k[3]);(«k5», cetin.k[4]);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.k[0] = getSelectedValue («k1»);.k[1] = getSelectedValue («k2»);.k[2] =
getSelectedValue («k3»);.k[3] = getSelectedValue («k4»);.k[4] =
getSelectedValue («k5»);
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Режим эксплуатации ИС»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от конкретных технологий или типов обработки, принятых в системе
программного обеспечения»/>
<tiles:put name= «selectNumber» value=
«1»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
обработка данных в режиме разделения времени
</option>
<option value= «1.04»>
параллельная обработка данных
</option>
<option value= «1.05»>
обработка данных в режиме реального времени
</option>
<option value= «1.07»>
совмещенная обработка данных
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Масштаб ИС»/>
<tiles:put name= «selectHint» value= «Масштаб может быть
определен количеством одновременно работающих пользователей»/>
<tiles:put name= «selectNumber» value=
«2»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «0.95»>
малые ИС (до 10 пользователей с непродолжительным ЖЦ)
</option>
<option value= «1»>
средние ИС (от 11 до 100 пользователей с длительным ЖЦ с
возможностью роста до крупных систем)
</option>
<option value= «1.05»>
крупные ИС (от 101 до 1000 пользователей с длительным ЖЦ и
миграцией унаследованных систем
</option>
<option value= «1.08»>
сверхбольшие (свыше 1000 пользователей)
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Стабильность ИС»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от ее внутренних эволюционных аспектов или стабильности в процессе
сопровождения»/>
<tiles:put name= «selectNumber» value=
«3»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.1»>
постоянное внесение изменений
</option>
<option value= «1»>
дискретное внесение изменений
</option>
<option value= «0.95»>
маловероятное внесение изменений
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Защита от несанкционированного
доступа»/>
<tiles:put name= «selectHint» value= «Предотвращение или
существенное затруднение несанкционированного доступа»/>
<tiles:put name= «selectNumber» value=
«4»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.05»>
сильная
</option>
<option value= «1»>
средняя
</option>
<option value= «0.98»>
слабая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Защита программ и данных»/>
<tiles:put name= «selectHint» value= «на уровне
операционной системы, на уровне сетевого программного обеспечения, на уровне
СУБД»/>
<tiles:put name= «selectNumber» value=
«5»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.03»>
сильная
</option>
<option value= «1»>
средняя
</option>
<option value= «0.97»>
слабая
</option>
</tiles:put>
</tiles:insert>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «3»/>
<tiles:put name= «title» value= «Внутренние факторы 2»/>
<tiles:put name= «onOpenFunction»>()
{(«k6», cetin.k[5]);(«k7», cetin.k[6]);(«k8», cetin.k[7]);(«k9», cetin.k[8]);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.k[5] = getSelectedValue («k6»);.k[6] = getSelectedValue («k7»);.k[7] =
getSelectedValue («k8»);.k[8] = getSelectedValue («k9»);
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Контрольный след операций»/>
<tiles:put name= «selectHint» value= «Возможность фиксации
несанкционированных изменений в системе»/>
<tiles:put name= «selectNumber» value=
«6»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
не имеется
</option>
<option value= «1.08»>
выборочное отслеживание
</option>
<option value= «1.13»>
полное отслеживание
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Отказоустойчивость»/>
<tiles:put name= «selectHint» value= «Свойство системы
непрерывно сохранять работоспособное состояние в течении некоторого
времени»/>
<tiles:put name= «selectNumber» value=
«7»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.15»>
Высокая
</option>
<option value= «1»>
Средняя
</option>
<option value= «0.92»>
Низкая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Восстанавливаемость»/>
<tiles:put name= «selectHint» value= «Среднее время
восстановления работоспособности после отказа»/>
<tiles:put name= «selectNumber» value=
«8»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.12»>
Высокая
</option>
<option value= «1»>
Средняя
</option>
<option value= «0.98»>
Низкая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Длительность
обработки (время отклика)»/>
<tiles:put name= «selectHint» value= «Быстрота реакции
системы на входные воздействия»/>
<tiles:put name= «selectNumber» value=
«9»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.21»>
быстрая</option>
<option value= «1»>
умеренная</option>
<option value= «0.92»>
медленная</option>
</tiles:put>
</tiles:insert>
<html:hidden property= «k10Text»/>
<html:hidden property= «k10»/>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «4»/>
<tiles:put name= «title» value= «Факторы среды»/>
<tiles:put name= «onOpenFunction»>()
{(«k11», cetin.k[10]);(«k12», cetin.k[11]);(«k13», cetin.k[12]);(«k14»,
cetin.k[13]);(«k15», cetin.k[14]);(«k16», cetin.k[15]);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.k[10] = getSelectedValue («k11»);.k[11] = getSelectedValue («k12»);.k[12] =
getSelectedValue («k13»);.k[13] = getSelectedValue («k14»);.k[14] =
getSelectedValue («k15»);.k[15] = getSelectedValue («k16»);
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Класс пользователя»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от уровня мастерства или характеристик определенного класса
пользователей. Пользователем может быть система, являющаяся внешней по
отношении к рассматриваемой системе»/>
<tiles:put name= «selectNumber» value=
«11»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.12»>
начинающий
</option>
<option value= «1.07»>
средний
</option>
<option value= «1»>
специалист (эксперт)
</option>
<option value= «1.14»>
случайный
</option>
<option value= «1.06»>
другая ИС (ПО)
</option>
<option value= «1.09»>
технические средства
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Требования к
центральному обрабатывающему устройству (процессору)»/>
<tiles:put name= «selectHint» value= «Определяются
требованиями к тактовой частоте процессора (скорости процессора)»/>
<tiles:put name= «selectNumber» value=
«12»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «0.99»>
высокая
</option>
<option value= «1»>
средняя
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Требования к
оперативной (основной) памяти»/>
<tiles:put name= «selectHint» value= «ИС должна быть
идентифицирована по требованиям, предъявляемым к оперативной памяти (объем,
быстродействие)»/>
<tiles:put name= «selectNumber» value=
«13»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
</option>
<option value= «1.04»>
малая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Требования к внешней памяти»/>
<tiles:put name= «selectHint» value= «ИС должна быть
идентифицирована по требованиям, предъявляемым к оперативной памяти (объем,
быстродействие)»/>
<tiles:put name= «selectNumber» value=
«14»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
большая
</option>
<option value= «1.01»>
малая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Требования к
локальной вычислительной сети»/>
<tiles:put name= «selectHint» value= «ИС должна быть
идентифицирована по требованиям, предъявляемым к ЛВС (пропускная способность,
зашита информации в сети)»/>
<tiles:put name= «selectNumber» value=
«15»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
высокие требования
</option>
<option value= «1.02»>
средние требования
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Критичность ИС»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от уровня целостности продукции, с учетом конкретной методологии
оценки»/>
<tiles:put name= «selectNumber» value=
«16»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.18»>
человеческая жизнь
</option>
<option value= «1.16»>
национальная безопасность
</option>
<option value= «1.13»>
социальный хаос и паника
</option>
<option value= «1»>
организационная безопасность
</option>
</tiles:put>
</tiles:insert>
<html:hidden property= «k17Text»/>
<html:hidden property= «k17»/>
</tiles:put>
</tiles:insert>
<html:hidden property= «k18Text»/>
<html:hidden property= «k18»/>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «5»/>
<tiles:put name= «title» value= «Результаты расчета трудоемкости»/>
<tiles:put name= «onOpenFunction»>() {
$(«#trud»).html((cetin.peopleMonth()).toFixed(2));res
= cetin.time();
$(«#term»).html(((res.min + res.max) /
2).toFixed(2));
$(«#minTerm»).html (res.min.toFixed(2));
$(«#newTerm»).val (cetin.newTerm);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.newTerm = parseFloat($(«#newTerm»).val());
}
</tiles:put>
<tiles:put name= «validators»>
[Validator («newTerm», /^\d+(.\d+)?$/, «Необходимо ввести
число»)
]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Трудоемкость: <span id= «trud»></span>
(человеко-месяцы)
</p>
<p>
Средний срок разработки: <span id= «term»></span>
(месяцы)
</p>
<p>
</p>
<p>
Вы можете уменьшить срок разработки до <span id=
«minTerm»></span> (месяцы)
</p>
<p>
Новый срок разработки (месяцы) <html:text property=
«newTerm» styleId= «newTerm»/>
</p>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «6»/>
<tiles:put name= «title» value= «Результаты расчета
скорректированной трудоемкости»/>
<tiles:put name= «onOpenFunction»>()
{.recalcPeopleMonth();
$(«#newtrud»).html((cetin.newPeopleMonth).toFixed(2));
$(«#newterm»).html((cetin.newTerm).toFixed(2));
}
</tiles:put>
<tiles:put name= «onCloseFunction»>() {
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Трудоемкость: <span id= «newtrud»></span> (человеко-месяцы)
</p>
<p>
Срок разработки: <span id=
«newterm»></span> (месяцы)
</p>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «7»/>
<tiles:put name= «title» value= «Ввод данных для получения
стоимости разработки»/>
<tiles:put name= «onOpenFunction»>() {
$(«#zp0»).val (cetin.cost.cost);
$(«#psn»).val (cetin.cost.psn);
$(«#pnds»).val (cetin.cost.pnds);(var i = 0; i
< 3; i++) {
$(«#inf» + i).val (cetin.cost.inflation[i]);
$(«#god» + i).html (new Date().getFullYear() - 3
+ i);
}
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.cost.cost = parseFloat($(«#zp0»).val());.cost.psn =
parseFloat($(«#psn»).val());.cost.pnds = parseFloat($(«#pnds»).val());(var i =
0; i < 3; i++) {.cost.inflation[i] = parseFloat($(«#inf» + i).val());
}
}
</tiles:put>
<tiles:put name= «validators»>
[Validator («zp0», /^\d+(.\d+)?$/, «Необходимо ввести
число»),Validator («psn», /^\d+(.\d+)?$/, «Необходимо ввести число»),Validator
(«pnds», /^\d+(.\d+)?$/, «Необходимо ввести число»),Validator («inf0»,
/^\d+(.\d+)?$/, «Необходимо ввести число»),Validator («inf1», /^\d+(.\d+)?$/,
«Необходимо ввести число»),Validator («inf2», /^\d+(.\d+)?$/, «Необходимо
ввести число»)
]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Для оценки стоимости разработки необхоимо указать заработную
плату одного программиста (по статистике за прошедший год), а также инфляцию за
три прошедших года.
</p>
<p>
Заработная плата разработчику: <html:text property= «zp0»
styleId= «zp0»/>
</p>
<p>
Инфляция за <span id= «god0»></span> год:
<html:text property= «inf0» styleId= «inf0»/>
</p>
<p>
Инфляция за <span id= «god1»></span> год:
<html:text property= «inf1» styleId= «inf1»/>
</p>
<p>
Инфляция за <span id= «god2»></span> год:
<html:text property= «inf2» styleId= «inf2»/>
</p>
<p>
Процент социальных выплат:
<html:text property= «psn» styleId= «psn»/>
</p>
<p>
Процент НДС:
<html:text property= «pnds» styleId= «pnds»/>
</p>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «8»/>
<tiles:put name= «title» value= «Итоги»/>
<tiles:put name= «onOpenFunction»>()
{.recalcPeopleMonth();
$(«#newtrud1»).html((cetin.newPeopleMonth).toFixed(2));
$(«#newterm1»).html((cetin.newTerm).toFixed(2));
$(«#peoples»).html (Math.round
(cetin.newPeopleMonth / cetin.newTerm));c = cetin.calcCost();
$(«#totalCost»).html((c.sppo).toFixed(2));
$(«#totalCostSopr»).html((c.ssppo).toFixed(2));
}
</tiles:put>
<tiles:put name= «onCloseFunction»>() {
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «isLastStep» value=
«true»/>
<tiles:put name= «data» type= «page»>
<p>
Трудоемкость: <span id= «newtrud1»></span> (человеко-месяцы)
</p>
<p>
Срок разработки: <span id=
«newterm1»></span> (месяцы)
</p>
<p>
Число разработчиков: <span id=
«peoples»></span> (человек)
</p>
<p>
Стоимость разработки: <span id= «totalCost»></span> (рубли)
</p>
<p>
Стоимость сопровождения: <span id=
«totalCostSopr»></span> (рубли)
</p>
<p>Сохранить параметры: Название <html:text property= «name» styleId=
«name»/></p>
<html:hidden property= «id»/>
<html:hidden property= «type» value=
«zakaz»/>
<html:hidden property= «operation» value=
«save»/>
<html:submit property= «savee» value= «Сохранить» styleId=
«saveButton»/>
</tiles:put>
</tiles:insert>
</html:form>
</body>
</html>
Код приложения подрядчика
<%@page import= «ru.cetin. CetinForm»%>
<%@page contentType= «text/html» pageEncoding=
«UTF-8»%>
<%@ taglib uri=
«http://struts.apache.org/tags-html» prefix= «html»%>
<%@ taglib uri=
«http://struts.apache.org/tags-tiles» prefix= «tiles»%>
<html>
<head>
<title>CETIN</title>
<meta charset= «UTF-8»>
<meta name= «viewport» content=
«width=device-width»>
<script type= «text/javascript» src=
«js/libs/jquery/jquery.js»></script>
<script type= «text/javascript» src=
«js/cetin.js»></script>
<link href= «css/style.css» type= «text/css»
rel= «stylesheet»>
</head>
<body id= «body»>
<html:form method= «POST» action=»/cetin»>
<h1>Методика оценки трудоемкости программного продукта
CETIN</h1>
<script type= «text/javascript»>cetin = new
Cetin();stepManager = new StepManager («body», «stepManager»);
<% CetinForm form = (CetinForm)
pageContext.getAttribute («Cetin», PageContext.REQUEST_SCOPE);%>.params.c =
<% out.write (Integer.toString (form.getCase()));%>;.params.e = <%
out.write (Integer.toString (form.getEntity()));%>;.params.t = <%
out.write (Integer.toString (form.getTool()));%>;.params.i = <% out.write
(Integer.toString (form.getInteraction()));%>;.params.n = <% out.write
(Integer.toString (form.getNode()));%>;
.paramsEdited.c = [
<% out.write (Double.toString (form.getC1
()));%>,
<% out.write (Double.toString (form.getC2
()));%>,
<% out.write (Double.toString (form.getC3
()));%>,
<% out.write (Double.toString (form.getC4
()));%>,
<% out.write (Double.toString (form.getC5
()));%>,
<% out.write (Double.toString (form.getC6
()));%>
];
.paramsEdited.e = [
<% out.write (Double.toString (form.getE1
()));%>,
<% out.write (Double.toString (form.getE2
()));%>,
<% out.write (Double.toString (form.getE3
()));%>,
<% out.write (Double.toString (form.getE4
()));%>,
<% out.write (Double.toString (form.getE5
()));%>,
<% out.write (Double.toString (form.getE6
()));%>
];
.paramsEdited.t = [
<% out.write (Double.toString (form.getT1
()));%>,
<% out.write (Double.toString (form.getT2
()));%>,
<% out.write (Double.toString (form.getT3
()));%>,
<% out.write (Double.toString (form.getT4
()));%>,
<% out.write (Double.toString (form.getT5
()));%>,
<% out.write (Double.toString (form.getT6
()));%>
];
.paramsEdited.i = [
<% out.write (Double.toString (form.getI1
()));%>,
<% out.write (Double.toString (form.getI2
()));%>,
<% out.write (Double.toString (form.getI3
()));%>,
<% out.write (Double.toString (form.getI4
()));%>,
<% out.write (Double.toString (form.getI5
()));%>,
<% out.write (Double.toString (form.getI6
()));%>
];
.paramsEdited.n = [
<% out.write (Double.toString (form.getN1
()));%>,
<% out.write (Double.toString (form.getN2
()));%>,
<% out.write (Double.toString (form.getN3
()));%>,
<% out.write (Double.toString (form.getN4
()));%>,
<% out.write (Double.toString (form.getN5
()));%>,
<% out.write (Double.toString (form.getN6
()));%>
];
cetin.s[0] = [
<% out.write (Double.toString (form.getSc1
()));%>,
<% out.write (Double.toString (form.getSe1
()));%>,
<% out.write (Double.toString (form.getSt1
()));%>,
<% out.write (Double.toString (form.getSi1
()));%>,
<% out.write (Double.toString (form.getSn1
()));%>
];
.s[1] = [
<% out.write (Double.toString (form.getSc2
()));%>,
<% out.write (Double.toString (form.getSe2
()));%>,
<% out.write (Double.toString (form.getSt2
()));%>,
<% out.write (Double.toString (form.getSi2
()));%>,
<% out.write (Double.toString (form.getSn2
()));%>
];
.s[2] = [
<% out.write (Double.toString (form.getSc3
()));%>,
<% out.write (Double.toString (form.getSe3
()));%>,
<% out.write (Double.toString (form.getSt3
()));%>,
<% out.write (Double.toString (form.getSi3
()));%>,
<% out.write (Double.toString (form.getSn3
()));%>
];
.s[3] = [
<% out.write (Double.toString (form.getSc4
()));%>,
<% out.write (Double.toString (form.getSe4
()));%>,
<% out.write (Double.toString (form.getSt4
()));%>,
<% out.write (Double.toString (form.getSi4
()));%>,
<% out.write (Double.toString (form.getSn4
()));%>
];
.s[4] = [
<% out.write (Double.toString (form.getSc5
()));%>,
<% out.write (Double.toString (form.getSe5
()));%>,
<% out.write (Double.toString (form.getSt5
()));%>,
<% out.write (Double.toString (form.getSi5
()));%>,
<% out.write (Double.toString (form.getSn5
()));%>
];
.s[5] = [
<% out.write (Double.toString (form.getSc6
()));%>,
<% out.write (Double.toString (form.getSe6
()));%>,
<% out.write (Double.toString (form.getSt6
()));%>,
<% out.write (Double.toString (form.getSi6
()));%>,
<% out.write (Double.toString (form.getSn6
()));%>
];
.k = [
<% out.write (Double.toString
(form.getK1Text()));%>,
<% out.write (Double.toString
(form.getK2Text()));%>,
<% out.write (Double.toString
(form.getK3Text()));%>,
<% out.write (Double.toString
(form.getK4Text()));%>,
<% out.write (Double.toString
(form.getK5Text()));%>,
<% out.write (Double.toString
(form.getK6Text()));%>,
<% out.write (Double.toString
(form.getK7Text()));%>,
<% out.write (Double.toString
(form.getK8Text()));%>,
<% out.write (Double.toString
(form.getK9Text()));%>,
<% out.write (Double.toString
(form.getK10Text()));%>,
<% out.write (Double.toString
(form.getK11Text()));%>,
<% out.write (Double.toString (form.getK12Text()));%>,
<% out.write (Double.toString
(form.getK13Text()));%>,
<% out.write (Double.toString
(form.getK14Text()));%>,
<% out.write (Double.toString
(form.getK15Text()));%>,
<% out.write (Double.toString
(form.getK16Text()));%>,
<% out.write (Double.toString
(form.getK17Text()));%>,
<% out.write (Double.toString
(form.getK18Text()));%>
];
.cost.cost = <% out.write (Double.toString
(form.getZp0 ()));%>;.cost.psn = <% out.write (Double.toString
(form.getPsn()));%>;.cost.pnds = <% out.write (Double.toString
(form.getPnds()));%>;.cost.inflation[0] = <% out.write (Double.toString
(form.getInf0 ()));%>;.cost.inflation[1] = <% out.write (Double.toString
(form.getInf1 ()));%>;.cost.inflation[2] = <% out.write (Double.toString
(form.getInf2 ()));%>;
cachedParams = {c:0, e:0, t:0, i:0, n:0};
</script>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «1»/>
<tiles:put name= «isFirstStep» value=
«true»/>
<tiles:put name= «title» value= «Инициализация»/>
<tiles:put name= «onOpenFunction»>()
{params = cetin.params;
$(«#case»).val (params.c);
$(«#entity»).val (params.e);
$(«#tool»).val (params.t);
$(«#interaction»).val (params.i);
$(«#node»).val (params.n);
.c = params.c;.e = params.e;.t = params.t;.i =
params.i;.n = params.n;
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.params.c = parseInt($(«#case»).val());.params.e =
parseInt($(«#entity»).val());.params.t = parseInt($(«#tool»).val());.params.i =
parseInt($(«#interaction»).val());.params.n = parseInt($(«#node»).val());
calc = 0;
changed = (cachedParams.c!== cetin.params.c) ||
(cachedParams.e!== cetin.params.e) ||
(cachedParams.t!== cetin.params.t) ||
(cachedParams.i!== cetin.params.i) ||
(cachedParams.n!== cetin.params.n);(var j = 0; j
< 6; j++) {p = cetin.params;(changed)
{.paramsEdited.c[j] = p.c;.paramsEdited.e[j] =
p.e;.paramsEdited.t[j] = p.t;.paramsEdited.i[j] = p.i;.paramsEdited.n[j] =
p.n;sji = cetin.s[j];sj = 1.0 / 165 * (p.c * sji[0] + p.e * sji[1] + p.t *
sji[2] + p.i * sji[3] + p.n * sji[4]);.sj[j] = sj;
}
}
</tiles:put>
<tiles:put name= «validators»>
[Validator («case», /^\d+$/, «Необходимо ввести число»),
new Validator («entity», /^\d+$/, «Необходимо ввести
число»),Validator («tool», /^\d+$/, «Необходимо ввести число»),Validator
(«interaction», /^\d+$/, «Необходимо ввести число»),Validator («node», /^\d+$/,
«Необходимо ввести число»)
]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Для начала оценки необходимо составить диаграмму вариантов
использования, диаграмму классов, диаграмму коммуникаций и диаграмму
развертывания.
</p>
<p>
По полученным данным диаграмм необходимо заполнить следующие
поля:
</p>
<p>
Количество вариантов использования (case):
<html:text property= «case» styleId= «case»
size= «8»/>
</p>
<p>
Количество типов объектов (entity):
<html:text property= «entity» styleId=
«entity» size= «8»/>
</p>
<p>
Количество свойств типов объектов (tool):
<html:text property= «tool» styleId= «tool»
size= «8»/>
</p>
<p>
Количество взаимодействий между типами объектов
(interaction):
<html:text property= «interaction» styleId=
«interaction» size= «8»/>
</p>
<p>
Количество типов узлов (node):
<html:text property= «node» styleId= «node»
size= «8»/>
</p>
</tiles:put>
</tiles:insert>
<script type= «text/javascript»>recalcSj()
{{(var j = 0; j < 6; j++) {cc = parseFloat($(«#c» + (j + 1)).val());ce =
parseFloat($(«#e» + (j + 1)).val());ct = parseFloat($(«#t» + (j + 1)).val());ci
= parseFloat($(«#i» + (j + 1)).val());cn = parseFloat($(«#n» + (j + 1)).val());
scc = parseFloat($(«#sc» + (j + 1)).val());sce =
parseFloat($(«#se» + (j + 1)).val());sct = parseFloat($(«#st» + (j +
1)).val());sci = parseFloat($(«#si» + (j + 1)).val());scn = parseFloat($(«#sn»
+ (j + 1)).val());
.paramsEdited.c[j] = cc;.paramsEdited.e[j] =
ce;.paramsEdited.t[j] = ct;.paramsEdited.i[j] = ci;.paramsEdited.n[j] =
cn;.s[j] [0] = scc;.s[j] [1] = sce;.s[j] [2] = sct;.s[j] [3] = sci;.s[j] [4] =
scn;.sj[j] = 1.0 / 165 * (cc * scc + ce * sce + ct * sct + ci * sci + cn *
scn);
$(«#s» + (j + 1)).text (cetin.sj[j].toFixed(5));
}
} catch(err) {}
}
</script>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «2»/>
<tiles:put name= «title» value= «Базовая трудоемкость»/>
<tiles:put name= «onOpenFunction»>()
{params = cetin.paramsEdited;(var i = 1; i <= 6; i++)
{
$(«#c» + i).val (params.c [i - 1]);
$(«#e» + i).val (params.e [i - 1]);
$(«#t» + i).val (params.t [i - 1]);
$(«#i» + i).val (params.i [i - 1]);
$(«#n» + i).val (params.n [i - 1]);
$(«#sc» + i).val (cetin.s [i - 1] [0]);
$(«#se» + i).val (cetin.s [i - 1] [1]);
$(«#st» + i).val (cetin.s [i - 1] [2]);
$(«#si» + i).val (cetin.s [i - 1] [3]);
$(«#sn» + i).val (cetin.s [i - 1] [4]);
$(«#s» + i).text (cetin.sj [i - 1].toFixed(5));
}
();
}
</tiles:put>
<tiles:put name= «onCloseFunction»>
</tiles:put>
<tiles:put name= «validators»>
[
]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Базовая трудоемкость Sj процесса разработки с номером j, где
j - номер процесса разработки (значения от 1 до 6)
расчитывается по следующей формуле:
</p>
<table>
<tr>
<td>1/165*(</td>
<td>C</td><td>*</td><td>S<sub>j</sub>(C)</td><td>+</td>
<td>E</td><td>*</td><td>S<sub>j</sub>(E)</td><td>+</td>
<td>T</td><td>*</td><td>S<sub>j</sub>(T)</td><td>+</td>
<td>I</td><td>*</td><td>S<sub>j</sub>(I)</td><td>+</td>
<td>N</td><td>*</td><td>S<sub>j</sub>(N)</td>
<td>)=</td><td>S<sub>j</sub></td>
</tr>
<tr>
<td colspan= «21» style= «padding-top:
12px;»>Норматив трудоемкости: Бизнес-моделирование</td>
</tr>
<tr>
<td>1/165*(</td>
<td><html:text property= «c1» styleId=
«c1» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sc1» styleId= «sc1» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «e1» styleId=
«e1» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«se1» styleId= «se1» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «t1» styleId=
«t1» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«st1» styleId= «st1» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «i1» styleId=
«i1» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«si1» styleId= «si1» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «n1» styleId=
«n1» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sn1» styleId= «sn1» onkeyup= «recalcSj();»/></td>
<td>)=</td><td><span id=
«s1»></span></td>
</tr>
<tr>
<td colspan= «21» style= «padding-top:
12px;»>Норматив трудоемкости: Управление требованиями</td>
</tr>
<tr>
<td>1/165*(</td>
<td><html:text property= «c2» styleId=
«c2» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sc2» styleId= «sc2» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «e2» styleId=
«e2» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«se2» styleId= «se2» onkeyup= «recalcSj();»/></td><td>+</td>
<td><html:text property= «t2» styleId=
«t2» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«st2» styleId= «st2» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «i2» styleId=
«i2» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«si2» styleId= «si2» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «n2» styleId=
«n2» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sn2» styleId= «sn2» onkeyup= «recalcSj();»/></td>
<td>)=</td><td><span id=
«s2»></span></td>
</tr>
<tr>
<td colspan= «21» style= «padding-top:
12px;»>Норматив трудоемкости: Проектирование</td>
</tr>
<tr>
<td>1/165*(</td>
<td><html:text property= «c3» styleId=
«c3» onkeyup= «recalcSj(); "/></td><td>*</td><td><html:text
property= «sc3» styleId= «sc3» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «e3» styleId=
«e3» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«se3» styleId= «se3» onkeyup= «recalcSj();»/></td><td>+</td>
<td><html:text property= «t3» styleId=
«t3» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«st3» styleId= «st3» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «i3» styleId=
«i3» onkeyup= «recalcSj(); "/></td><td>*</td><td><html:text
property= «si3» styleId= «si3» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «n3» styleId=
«n3» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sn3» styleId= «sn3» onkeyup= «recalcSj();»/></td>
<td>)=</td><td><span id=
«s3»></span></td>
</tr>
<tr>
<td colspan= «21» style= «padding-top:
12px;»>Норматив трудоемкости: Реализация</td>
</tr>
<tr>
<td>1/165*(</td>
<td><html:text property= «c4» styleId=
«c4» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sc4» styleId= «sc4» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «e4» styleId=
«e4» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«se4» styleId= «se4» onkeyup= «recalcSj();»/></td><td>+</td>
<td><html:text property= «t4» styleId=
«t4» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«st4» styleId= «st4» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «i4» styleId=
«i4» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«si4» styleId= «si4» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «n4» styleId=
«n4» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sn4» styleId= «sn4» onkeyup= «recalcSj();»/></td>
<td>)=</td><td><span id=
«s4»></span></td>
</tr>
<tr>
<td colspan= «21» style= «padding-top:
12px;»>Норматив трудоемкости: Тестирование</td>
</tr>
<tr>
<td>1/165*(</td>
<td><html:text property= «c5» styleId=
«c5» onkeyup= «recalcSj(); "/></td><td>*</td><td><html:text
property= «sc5» styleId= «sc5» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «e5» styleId=
«e5» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«se5» styleId= «se5» onkeyup= «recalcSj();»/></td><td>+</td>
<td><html:text property= «t5» styleId=
«t5» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«st5» styleId= «st5» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «i5» styleId=
«i5» onkeyup= «recalcSj(); "/></td><td>*</td><td><html:text
property= «si5» styleId= «si5» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «n5» styleId=
«n5» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sn5» styleId= «sn5» onkeyup= «recalcSj();»/></td>
<td>)=</td><td><span id=
«s5»></span></td>
</tr>
<tr>
<td colspan= «21» style= «padding-top:
12px;»>Норматив трудоемкости: Развертывание</td>
</tr>
<tr>
<td>1/165*(</td>
<td><html:text property= «c6» styleId=
«c6» onkeyup= «recalcSj(); "/></td><td>*</td><td><html:text
property= «sc6» styleId= «sc6» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «e6» styleId=
«e6» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«se6» styleId= «se6» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «t6» styleId=
«t6» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«st6» styleId= «st6» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «i6» styleId=
«i6» onkeyup= «recalcSj(); "/></td><td>*</td><td><html:text
property= «si6» styleId= «si6» onkeyup=
«recalcSj();»/></td><td>+</td>
<td><html:text property= «n6» styleId=
«n6» onkeyup= «recalcSj();
"/></td><td>*</td><td><html:text property=
«sn6» styleId= «sn6» onkeyup= «recalcSj();»/></td>
<td>)=</td><td><span id=
«s6»></span></td>
</tr>
</table>
<div>
— количество человеко-часов в одном
человеко-месяце.</div>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «3»/>
<tiles:put name= «title» value= «Внутренние факторы 1»/>
<tiles:put name= «onOpenFunction»>()
{(«k1», cetin.k[0]);(«k2», cetin.k[1]);(«k3», cetin.k[2]);(«k4»,
cetin.k[3]);(«k5», cetin.k[4]);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.k[0] = getSelectedValue («k1»);.k[1] = getSelectedValue («k2»);.k[2] =
getSelectedValue («k3»);.k[3] = getSelectedValue («k4»);.k[4] = getSelectedValue
(«k5»);
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Режим эксплуатации ИС»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от конкретных технологий или типов обработки, принятых в системе
программного обеспечения»/>
<tiles:put name= «selectNumber» value=
«1»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
обработка данных в режиме разделения времени
</option>
<option value= «1.04»>
параллельная обработка данных
</option>
<option value= «1.05»>
обработка данных в режиме реального времени
</option>
<option value= «1.07»>
совмещенная обработка данных
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Масштаб ИС»/>
<tiles:put name= «selectHint» value= «Масштаб может быть
определен количеством одновременно работающих пользователей»/>
<tiles:put name= «selectNumber» value=
«2»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «0.95»>
малые ИС (до 10 пользователей с непродолжительным ЖЦ)
</option>
<option value= «1»>
средние ИС (от 11 до 100 пользователей с длительным ЖЦ с
возможностью роста до крупных систем)
</option>
<option value= «1.05»>
крупные ИС (от 101 до 1000 пользователей с длительным ЖЦ и
миграцией унаследованных систем
</option>
<option value= «1.08»>
сверхбольшие (свыше 1000 пользователей)
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Стабильность ИС»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от ее внутренних эволюционных аспектов или стабильности в процессе
сопровождения»/>
<tiles:put name= «selectNumber» value=
«3»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.1»>
постоянное внесение изменений
</option>
<option value= «1»>
дискретное внесение изменений
</option>
<option value= «0.95»>
маловероятное внесение изменений
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Защита от
несанкционированного доступа»/>
<tiles:put name= «selectHint» value= «Предотвращение или
существенное затруднение несанкционированного доступа»/>
<tiles:put name= «selectNumber» value=
«4»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.05»>
сильная
</option>
<option value= «1»>
средняя
</option>
<option value= «0.98»>
слабая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Защита программ и данных»/>
<tiles:put name= «selectHint» value= «на уровне
операционной системы, на уровне сетевого программного обеспечения, на уровне
СУБД»/>
<tiles:put name= «selectNumber» value=
«5»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.03»>
сильная
</option>
<option value= «1»>
средняя
</option>
<option value= «0.97»>
слабая
</option>
</tiles:put>
</tiles:insert>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «4»/>
<tiles:put name= «title» value= «Внутренние факторы 2»/>
<tiles:put name= «onOpenFunction»>()
{(«k6», cetin.k[5]);(«k7», cetin.k[6]);(«k8», cetin.k[7]);(«k9»,
cetin.k[8]);(«k10», cetin.k[9]);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.k[5] = getSelectedValue («k6»);.k[6] = getSelectedValue («k7»);.k[7] =
getSelectedValue («k8»);.k[8] = getSelectedValue («k9»);.k[9] =
getSelectedValue («k10»);
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Контрольный след операций»/>
<tiles:put name= «selectHint» value= «Возможность фиксации
несанкционированных изменений в системе»/>
<tiles:put name= «selectNumber» value=
«6»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
не имеется
</option>
<option value= «1.08»>
выборочное отслеживание
</option>
<option value= «1.13»>
полное отслеживание
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Отказоустойчивость»/>
<tiles:put name= «selectHint» value= «Свойство системы
непрерывно сохранять работоспособное состояние в течении некоторого
времени»/>
<tiles:put name= «selectNumber» value=
«7»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.15»>
Высокая
</option>
<option value= «1»>
Средняя
</option>
<option value= «0.92»>
Низкая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Восстанавливаемость»/>
<tiles:put name= «selectHint» value= «Среднее время восстановления
работоспособности после отказа»/>
<tiles:put name= «selectNumber» value=
«8»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.12»>
Высокая
</option>
<option value= «1»>
Средняя
</option>
<option value= «0.98»>
Низкая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Длительность
обработки (время отклика)»/>
<tiles:put name= «selectHint» value= «Быстрота реакции
системы на входные воздействия»/>
<tiles:put name= «selectNumber» value=
«9»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.21»>
быстрая</option>
<option value= «1»>
умеренная</option>
<option value= «0.92»>
медленная</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Исходный язык разработки ИС»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от типа исходного языка, используемого при разработке ИС»/>
<tiles:put name= «selectNumber» value=
«10»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.08»>
традиционный (Кобол, Фортран и т.д.)
</option>
<option value= «1.09»>
процедурный (Си или эквивалентный)
</option>
<option value= «1.07»>
функциональный (Лисп или эквивалентный)
</option>
объектно-ориентированный (Си++ или эквивалентный)
</option>
</tiles:put>
</tiles:insert>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «5»/>
<tiles:put name= «title» value= «Факторы среды»/>
<tiles:put name= «onOpenFunction»>()
{(«k11», cetin.k[10]);(«k12», cetin.k[11]);(«k13», cetin.k[12]);(«k14»,
cetin.k[13]);(«k15», cetin.k[14]);(«k16», cetin.k[15]);(«k17», cetin.k[16]);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.k[10] = getSelectedValue («k11»);.k[11] = getSelectedValue («k12»);.k[12] =
getSelectedValue («k13»);.k[13] = getSelectedValue («k14»);.k[14] =
getSelectedValue («k15»);.k[15] = getSelectedValue («k16»);.k[16] =
getSelectedValue («k17»);
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Класс пользователя»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от уровня мастерства или характеристик определенного класса
пользователей. Пользователем может быть система, являющаяся внешней по
отношении к рассматриваемой системе»/>
<tiles:put name= «selectNumber» value=
«11»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.12»>
начинающий
</option>
<option value= «1.07»>
средний
</option>
<option value= «1»>
специалист (эксперт)
</option>
<option value= «1.14»>
случайный
</option>
<option value= «1.06»>
другая ИС (ПО)
</option>
<option value= «1.09»>
технические средства
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Требования к
центральному обрабатывающему устройству (процессору)»/>
<tiles:put name= «selectHint» value= «Определяются
требованиями к тактовой частоте процессора (скорости процессора)»/>
<tiles:put name= «selectNumber» value=
«12»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «0.99»>
высокая
</option>
<option value= «1»>
средняя
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Требования к
оперативной (основной) памяти»/>
<tiles:put name= «selectHint» value= «ИС должна быть
идентифицирована по требованиям, предъявляемым к оперативной памяти (объем,
быстродействие)»/>
<tiles:put name= «selectNumber» value=
«13»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
большая
</option>
<option value= «1.04»>
малая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Требования к внешней памяти»/>
<tiles:put name= «selectHint» value= «ИС должна быть
идентифицирована по требованиям, предъявляемым к оперативной памяти (объем,
быстродействие)»/>
<tiles:put name= «selectNumber» value=
«14»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
большая
</option>
<option value= «1.01»>
малая
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Требования к
локальной вычислительной сети»/>
<tiles:put name= «selectHint» value= «ИС должна быть
идентифицирована по требованиям, предъявляемым к ЛВС (пропускная способность,
зашита информации в сети)»/>
<tiles:put name= «selectNumber» value=
«15»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
высокие требования
</option>
<option value= «1.02»>
средние требования
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Критичность ИС»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от уровня целостности продукции, с учетом конкретной методологии
оценки»/>
<tiles:put name= «selectNumber» value=
«16»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1.18»>
человеческая жизнь
</option>
<option value= «1.16»>
национальная безопасность
</option>
<option value= «1.13»>
социальный хаос и паника
</option>
<option value= «1»>
организационная безопасность
</option>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Готовность»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от типа имеющегося в наличии ППО»/>
<tiles:put name= «selectNumber» value=
«17»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «0.99»>
наличие в готовом виде (есть альтернативные
продукты)</option>
<option value= «1»>
общедоступная (известная методика)</option>
<option value= «1.11»>
заказная (методика заказчика специфическая)</option>
<option value= «1.09»>
запатентованная (методика разработчика)</option>
</tiles:put>
</tiles:insert>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «6»/>
<tiles:put name= «title» value= «Факторы данных»/>
<tiles:put name= «onOpenFunction»>()
{(«k18», cetin.k[17]);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.k[17] = getSelectedValue («k18»);
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<tiles:insert definition= «select» flush=
«false»>
<tiles:put name= «selectName» value= «Представление данных»/>
<tiles:put name= «selectHint» value= «Определяется в
зависимости от элементов, типов и структур данных»/>
<tiles:put name= «selectNumber» value=
«18»/>
<tiles:put name= «selectOptions» type=
«page»>
<option value= «1»>
реляционный
</option>
<option value= «1»>
индексируемый (иерархический)
</option>
<option value= «1.08»>
сетевой
</option>
<option value= «1.09»>
объектный
</option>
<option value= «0.95»>
форматированный файл
</option>
</tiles:put>
</tiles:insert>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «7»/>
<tiles:put name= «title» value= «Результаты расчета трудоемкости»/>
<tiles:put name= «onOpenFunction»>() {
$(«#trud»).html((cetin.peopleMonth()).toFixed(2));res
= cetin.time();
$(«#term»).html(((res.min + res.max) /
2).toFixed(2));
$(«#minTerm»).html (res.min.toFixed(2));
$(«#newTerm»).val (cetin.newTerm);
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.newTerm = parseFloat($(«#newTerm»).val());
}
</tiles:put>
<tiles:put name= «validators»>
[Validator («newTerm», /^\d+(.\d+)?$/, «Необходимо ввести
число»)
]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Трудоемкость: <span id= «trud»></span>
(человеко-месяцы)
</p>
<p>
Средний срок разработки: <span id= «term»></span>
(месяцы)
</p>
<p>
</p>
<p>
Вы можете уменьшить срок разработки до <span id=
«minTerm»></span> (месяцы)
</p>
<p>
Новый срок разработки (месяцы) <html:text property=
«newTerm» styleId= «newTerm»/>
</p>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «8»/>
<tiles:put name= «title» value= «Результаты расчета
скорректированной трудоемкости»/>
<tiles:put name= «onOpenFunction»>()
{.recalcPeopleMonth();
$(«#newtrud»).html((cetin.newPeopleMonth).toFixed(2));
$(«#newterm»).html((cetin.newTerm).toFixed(2));
}
</tiles:put>
<tiles:put name= «onCloseFunction»>() {
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Трудоемкость: <span id= «newtrud»></span> (человеко-месяцы)
</p>
<p>
Срок разработки: <span id=
«newterm»></span> (месяцы)
</p>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «9»/>
<tiles:put name= «title» value= «Ввод данных для получения
стоимости разработки»/>
<tiles:put name= «onOpenFunction»>() {
$(«#zp0»).val (cetin.cost.cost);
$(«#psn»).val (cetin.cost.psn);
$(«#pnds»).val (cetin.cost.pnds);(var i = 0; i
< 3; i++) {
$(«#inf» + i).val (cetin.cost.inflation[i]);
$(«#god» + i).html (new Date().getFullYear() - 3
+ i);
}
}
</tiles:put>
<tiles:put name= «onCloseFunction»>()
{.cost.cost = parseFloat($(«#zp0»).val());.cost.psn =
parseFloat($(«#psn»).val());.cost.pnds = parseFloat($(«#pnds»).val());(var i =
0; i < 3; i++) {.cost.inflation[i] = parseFloat($(«#inf» + i).val());
}
}
</tiles:put>
<tiles:put name= «validators»>
[Validator («zp0», /^\d+(.\d+)?$/, «Необходимо ввести
число»),Validator («psn», /^\d+(.\d+)?$/, «Необходимо ввести число»),Validator
(«pnds», /^\d+(.\d+)?$/, «Необходимо ввести число»),Validator («inf0»,
/^\d+(.\d+)?$/, «Необходимо ввести число»),Validator («inf1», /^\d+(.\d+)?$/,
«Необходимо ввести число»),Validator («inf2», /^\d+(.\d+)?$/, «Необходимо
ввести число»)
]
</tiles:put>
<tiles:put name= «data» type= «page»>
<p>
Для оценки стоимости разработки необхоимо указать заработную
плату одного программиста (по статистике за прошедший год), а также инфляцию за
три прошедших года.
</p>
<p>
Заработная плата разработчику: <html:text property= «zp0»
styleId= «zp0»/>
</p>
<p>
Инфляция за <span id= «god0»></span> год:
<html:text property= «inf0» styleId= «inf0»/>
</p>
<p>
Инфляция за <span id= «god1»></span> год:
<html:text property= «inf1» styleId= «inf1»/>
</p>
<p>
Инфляция за <span id= «god2»></span> год:
<html:text property= «inf2» styleId= «inf2»/>
</p>
<p>
Процент социальных выплат:
<html:text property= «psn» styleId= «psn»/>
</p>
<p>
Процент НДС:
<html:text property= «pnds» styleId= «pnds»/>
</p>
</tiles:put>
</tiles:insert>
<tiles:insert definition= «step» flush=
«false»>
<tiles:put name= «stepNumber» value= «10»/>
<tiles:put name= «title» value= «Итоги»/>
<tiles:put name= «onOpenFunction»>()
{.recalcPeopleMonth();
$(«#newtrud1»).html((cetin.newPeopleMonth).toFixed(2));
$(«#newterm1»).html((cetin.newTerm).toFixed(2));
$(«#peoples»).html (Math.round
(cetin.newPeopleMonth / cetin.newTerm));c = cetin.calcCost();
$(«#totalCost»).html((c.sppo).toFixed(2));
$(«#totalCostSopr»).html((c.ssppo).toFixed(2));
}
</tiles:put>
<tiles:put name= «onCloseFunction»>() {
}
</tiles:put>
<tiles:put name= «validators»>
[]
</tiles:put>
<tiles:put name= «isLastStep» value=
«true»/>
<tiles:put name= «data» type= «page»>
<p>
Трудоемкость: <span id= «newtrud1»></span> (человеко-месяцы)
</p>
<p>
Срок разработки: <span id=
«newterm1»></span> (месяцы)
</p>
<p>
Число разработчиков: <span id=
«peoples»></span> (человек)
</p>
<p>
Стоимость разработки: <span id= «totalCost»></span> (рубли)
</p>
<p>
Стоимость сопровождения: <span id= «totalCostSopr»></span>
(рубли)
</p>
<p>Сохранить параметры: Название <html:text property= «name» styleId=
«name»/></p>
<html:hidden property= «id»/>
<html:hidden property= «type» value=
«admin»/>
<html:hidden property= «operation» value=
«save»/>
<html:submit property= «savee» value= «Сохранить» styleId=
«saveButton»/>
</tiles:put>
</tiles:insert>
</html:form>
</body>
</html>
Приложение 5
функции JavaScript
/**
* Методика оценки трудоемкости проекта CETIN.
*/Cetin = function() {self = this;
/**
* Список начальных параметров:
* - Количество вариантов использования (c)
* - Количество типов объектов (e)
* - Количество свойств типов объектов (t)
* - Количество взаимодействий между типами объектов (i)
* - Количество типов узлов (n)
*/.params = {c: 0, e: 0, t: 0, i: 0, n: 0};
/**
* Список начальных параметров отредактированный.
*/.paramsEdited =
{: [0, 0, 0, 0, 0, 0],: [0, 0, 0, 0, 0, 0],: [0, 0, 0, 0, 0,
0],: [0, 0, 0, 0, 0, 0],: [0, 0, 0, 0, 0, 0]
};
/**
* Нормативы трудоемкости по процессам в разрезе
функциональных единиц
*/.s = [
/* c e t i n */
[32.12, 28.33, 0.000, 14.15, 0.000], // Бизнес-моделирование
[58.03, 28.04, 0.000, 20.32, 0.000], // Управление
требованиями
[45.42, 61.75, 31.35, 37.52, 24.02], // Проектирование
[31.57, 81.51, 50.72, 36.11, 0.000], // Реализация
[88.96, 0.000, 0.000, 0.000, 0.000], // Тестирование
[8.690, 0.000, 0.000, 0.000, 23.74] // Развертывание
];
/**
* Трудоемкость по процессам в разрезе функциональных единиц
*/.sj = [
, // Бизнес-моделирование
, // Управление требованиями
, // Проектирование
, // Тестирование
// Развертывание
];
/**
* Формула для определения поправочного коэффициента.
* В данной таблице представлены индексы коэффициентов,
которые необходимо перемножить.
*/.kp = [
[11, 16, 17], // Бизнес-моделирование
[1, 2, 4, 5, 6, 7, 8, 9, 16, 17, 18], // Управление
требованиями
[1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18], //
Проектирование
[1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18], //
Реализация
[1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
// Тестирование
[1, 2, 11, 16, 18] // Развертывание
];
/**
* Срок разработки в трудоемкость.
*/.terms = [
[5, 30], // 1 месяц
[10, 80], // 2 месяца
[17, 140], // 3 месяца
[26, 210], // 4 месяца
[37, 280], // 5 месяцев
[50, 340], // 6 месяцев
[65, 400], // 7 месяцев
[80, 450], // 8 месяцев
[100, 500], // 9 месяцев
[120, 550], // 10 месяцев
[140, 610], // 11 месяцев
[160, 670], // 12 месяцев
[180, 720], // 13 месяцев
[200, 770], // 14 месяцев
[230, 820], // 15 месяцев
[260, 870], // 16 месяцев
[290, 930], // 17 месяцев
[330, 990], // 18 месяцев
[370, 1040], // 19 месяцев
[420, 1090], // 20 месяцев
[470, 1150], // 21 месяц
[530, 1200], // 22 месяца
[600, 1250], // 23 месяца
[670, 1300], // 24 месяца
[750, 1350], // 25 месяцев
[830, 1400], // 26 месяцев
[900, 1450], // 27 месяцев
[970, 1500], // 28 месяцев
[1150, 1550], // 29 месяцев
[1230, 1600], // 30 месяцев
[1310, 1660], // 31 месяц
[1390, 1720], // 32 месяца
[1470, 1780], // 33 месяца
[1520, 1840], // 34 месяца
[1570, 1900], // 35 месяцев
[1620, 1960], // 36 месяцев
[1680, 2020] // 37 месяцев
];
/**
* Нормативные коэффициенты расхода разработчиков
*/.nkr = [71.5, 48, 25, 0.75, 15];
/* ПНР ПРП ПР L N */
/**
* Значения поправочных коэффициентов трудоемкости.
* По-умолчанию 1, т.е. всегда средние значения.
*/.k = [
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
];
/**
* Подсчет трудоемкости.
* @returns {Number} трудоемкость (человеко-месяц).
*/.peopleMonth = function() {calc = 0;
(var j = 0; j < 6; j++) {kpj = 1;(var kk in
self.kp[j]) {*= self.k [self.kp[j] [kk] - 1];
}
+= self.sj[j] * kpj;
}
calc;
};
/**
* Подсчет среднего срока разрабокти.
*
* @returns {Cetin.time.res} минимальное и максимально время
разработки (месяцы).
*/.time = function() {pt = self.peopleMonth();res
= {max: 0, min: self.terms.length - 1};
// Если трудоемкость превышает минимум левой границы.(pt >
1680) {.min = 36; // Конец массива..max = 31; // Начало массива, где начинается
превышение.
// Если трудоемкость не превышает известной правой границы.
if (pt < 2020) {(res.min >= 0 &&
self.terms [res.min] [1] > pt) {.min -;
}.min++;.max = Math.round (36 + (pt - 1680) /
40);
// Если превышает известную правую границу.
} else {.min = Math.round (36 + (pt - 2020) /
40);.max = Math.round (36 + (pt - 1680) / 40);
}
// Параметры срока можно расчитать на основании таблицы.
} else {(res.min >= 0 && self.terms
[res.min] [1] > pt) {.min -;
}.min++;
while (res.max < self.terms.length &&
self.terms [res.max] [0] < pt) {.max++;
}.max -;
}
.min++;.max++;(self.newTerm === 0).newTerm =
(res.min + res.max) / 2;
return res;
};
/**
* Новый срок разработки, введенный пользователем.
*/.newTerm = 0;
/**
* Расчитанная новая трудоемкость, на основании нового срока
разработки.
*/.newPeopleMonth = 0;
/**
* Пересчет трудоемкости.
*/.recalcPeopleMonth = function() {terms =
self.time();avgTerm = (terms.min + terms.max) / 2;incr = (avgTerm -
self.newTerm) / avgTerm * 100;.newPeopleMonth = self.peopleMonth() + incr *
self.nkr[3]; // Коэффициент элластичности.
};
/**
* Введенные параметры цены.
* cost - зарплата.
* inflation - нфляция за три года (указывается процент).
* psn - процент социальных выплат.
* pnds - процент НДС.
*/.cost = {cost: 0, inflation: [0, 0, 0], psn: 0,
pnds: 0};
/**
* Расчет стоимости разработки.
*
* @returns {Cetin.calcCost.res} включает в себя стоимость
разработки и стоимость сопровождения.
*/.calcCost = function() {c = self.cost;isr =
(c.inflation[0] + c.inflation[1] + c.inflation[2]) / 3;gsr = Math.floor
(self.newTerm / 12) + 1;costs = [];csr = [];[0] = c.cost * (1 + isr / 100);
(var i = 1; i < gsr; i++) {[i] = costs [i - 1]
* (1 + isr / 100);
}
for (var i = 0; i < gsr; i++) {[i] = costs[i]
* (1 + (0.9 * c.psn + self.nkr[0] + self.nkr[1]) / 100) * (1 + self.nkr[2] /
100) * (1 + c.pnds / 100);
}
res = {sppo: 0, ssppo: 0};(var i = 0; i < gsr;
i++) {.sppo += self.newPeopleMonth / gsr * csr[i];
}
.ssppo = res.sppo * self.nkr[4] / 100 * self.k[1]
* self.k[2] * self.k[15];
return res;
};
};
/**
* Менеджер шагов.
*
* @param {type} containerId идентификатор контейнера для
вставки отображаемых шагов.
* @param {type} stepManagerName название менеджера шагов для
обращения при кликах на шаги.
*/StepManager = function (containerId,
stepManagerName) {self = this;.containerId = containerId;.stepManagerName =
stepManagerName;.steps = [];
/**
* Текущий шаг.
*/.currentStep = «empty»;
/**
* Переход к шагу с номеров stepNum.
* @param {type} stepNum номер шага для перехода.
*/.goStep = function(stepNum) {
/*
* При переходе к другому шагу необходимо сделать следующее:
* - проверить правильность заполнения полей.
* - снять активность с текущего шага.
* - выполнить дейстивя по сохранения данных введенных с формы
в объект.
* - установаить активным шаг stepNum.
* - выполнить действия по обновлению отображаемых полей.
*
* - прокрутить экран к текущему шагу.
*/(self.currentStep!== «empty») {
$(«#error» +
self.currentStep).html(«»);(self.steps [self.currentStep].validators)
{validators = self.steps
[self.currentStep].validators;(validators) {(var i = 0; i <
validators.length; i++) {c = validators[i].validate();(c.error)
{
$(«#» + c.id).addClass («error»);
$(«#error» + self.currentStep).html (c.error);;
} else {
$(«#» + c.id).removeClass («error»);
}
}
}
}
$(«#step» + self.currentStep).removeClass
(«active»);.steps [self.currentStep].onCloseFunction();
(var qq = self.currentStep + 1; qq < stepNum;
qq++) {.steps[qq].onOpenFunction();.steps[qq].onCloseFunction();
}
}.currentStep = stepNum;
$(«#step» + self.currentStep).addClass
(«active»);.steps [self.currentStep].onOpenFunction();
$('html, body').animate({: $(«#step» +
self.currentStep).offset().top - (stepNum === 0? 100: 0)
}, 480);
};
/**
* Переход к предыдущему шагу.
*/.goPrev = function() {.goStep (self.steps
[self.currentStep].prevStep);
};
/**
* Переход к следующему шагу.
*/.goNext = function() {
self.goStep (self.steps
[self.currentStep].nextStep);
};
};
/**
* Шаг.
* @param onOpenFunction функция, вызываемая при открытии
шага.
* @param onCloseFunction функция, вызываемая при закрытии
шага.
* @param prevStep номер предыдущего шага.
* @param nextStep номер следующего шага.
* @param validators список валидаторов.
*/Step = function (onOpenFunction,
onCloseFunction, prevStep, nextStep, validators) {
var self = this;
/**
* Функция при открытии шага (обновление параметров формы).
*/.onOpenFunction = onOpenFunction;
/**
* Функция при закрытии шага (сохранение параметров формы).
*/.onCloseFunction = onCloseFunction;
/**
* Номер предыдущего шага.
*/.prevStep = prevStep;
/**
* Номер следущего шага.
*/.nextStep = nextStep;
/**
* Проверки правильности введенных данных.
*/.validators = validators;
};
/**
* Функция установки значения в селект.
*
* @param {type} selectName название селекта.
* @param {type} value новое значение.
*/setSelected (selectName, value) {
$(«select [name=» + selectName +»]
option:selected»).attr («selected», «»);
$(«select [name=» + selectName +»] option
[value=\"» + value + «\»]»).attr («selected», «selected»);
}
/**
* Функция получения значения текущего селекта.
*
* @param {type} selectName навзвание селекта.
* @returns значение селекта.
*/getSelectedValue(selectName) {$(«input [name=»
+ selectName + «Text]»).val();
}
/**
* Смена значения поля Коэффициент у выбранного селекта.
*
* @param {type} selectName
* @returns {undefined}
*/changeSelected(selectName) {
$(«input [name=» + selectName +
«Text]»).val($(«select [name=» + selectName +»] option:selected»).val());
}
/**
* Валидатор.
*
* @param {type} id поле для валидации.
* @param {type} regexp регулярное выражение валидации.
* @param {type} errorMessage сообщение при ошибке.
*/Validator = function (id, regexp, errorMessage)
{self = this;.id = id;.regexp =
regexp;.errorMessage = errorMessage;
/**
* Функция для валидации.
* @returns {Validator.validate. Anonym$50|String}
*/.validate = function() {(!$(«#» +
self.id).val().match (self.regexp)) {{«id»: self.id, «error»:
self.errorMessage};
}
{«id»: self.id};
};
};
Приложение 6
Текст файла CSS
{: 0; margin: 0;: 209mm;
}{: bold 8mm 'Arial';
: #00688B;
}
{radius: 7px;
color: #00688B;: 5px;
}
.active {
color: #ecf5ff;
}
.active.title {
color: #1dacd6;: #F0FFFF;radius: 7px 7px 0 0;
}
.active.footer {
color: #e0efff;
: #393939;radius: 0 0 7px 7px;: block;
}
.active.content {: block;
}
.title {: 2mm;: bold 7mm 'Arial';
: #E0EEEE;: pointer;
}
.content {: 3mm;: 5mm 'Arial';
: #36648B;: none;
}
.content.error {color: #ff7f7f;
: #7f0000;
}
.content p.step.content.p {indent: 1cm;height:
1.5;: 0.5mm 0;
}
.content.p {padding: 8px 0;}
.content.p {width: 1px 0;
color: #cccccc;style: solid;
}
.content.p.error {
color: #ff7f7f;
}
.content.hint {: #797979;: 3mm 'Arial';height:
1.0;
}
.content p input.step.content.p input {float:
right;}.content p.select.step.content.p.select {text-align: center;}
.content.p.select.hint {margin-top: 5px;
margin-left: 1cm;}.content.p.select input {float: none; width:
1.5cm;}.step.footer {: 2mm;: bold 7mm 'Arial';
: #797979;: 0 auto;: none;align: center;
}
.footer.button {
color: #00CD00;radius: 5px;: 2mm;: pointer;:
5cm;: 0 2px;align: center;
: #ffffff;: inline-block;
}
.footer.button:hover {
color: #7FFF00;
: #3f7f3f;
}
.footer.button:pressed {color: #5da130;
: #393939;
}
{text-align: center; border-width: 0;}input
{width: 40px; text-align: center;}
.legend {size: 12px;
}
#saveButton {left: 657px;: 100px;
height: 26px;
}
Приложение 7
Код страницы инициализации.
<%@page import= «java.util. Map»%>
<%@page import= «ru.cetin. InitForm»%>
<%@page contentType= «text/html» pageEncoding=
«UTF-8»%>
<%@ taglib uri=
«http://struts.apache.org/tags-html» prefix= «html»%>
<%@ taglib uri=
«http://struts.apache.org/tags-tiles» prefix= «tiles»%>
<html>
<head>
<title>Инициализация</title>
<meta charset= «UTF-8»>
<meta name= «viewport» content=
«width=device-width»>
</head>
<body style= «background-image:url (1.jpg)»
>
<font color= "#008B8B»>
<h1 align= «center» >Методика оценки трудоемкости программного продукта
CETIN</h1>
<h2>Выбор сохраненных парамтеров</h2>
<%form = (InitForm) pageContext.getAttribute
(«InitForm», PageContext.REQUEST_SCOPE);
(Map. Entry<Integer, String> entry:
form.getIndexToName().entrySet())
{
%> <a>
<% out.append (entry.getValue());%>
</a><br> <%
%>
<a>
<br></br>
<br></br>
<% out.append (entry.getValue());%> (заказчик)
</a><br> <%
}
%>
<a href= «cetin.do»>Добавить новые параметры</a><br>
<a href= «cetin.do? type=zakaz»>Добавить новые параметры (заказчик)</a>
</body>
</html>
Код страниц Сайта-Визитки
1 страница.
<html>
<head>
<title>CETIN</title>
<link href= «default.css» rel= «stylesheet»
type= «text/css» />
</head>
<body>
<div id= «header»>
<div id= «logo»>
<h1>CETIN</a></h1>
<h2><a>прогнозирование трудоемкостии
</a></h2>
<h2><a>стоимости создания</a></h2>
<h2><a>программного продукта</a></h2>
</div>
<div id= «menu»>
<ul>
<li><a href= «1.html»>Назначение
методики</a></li>
<li><a href= «2.html»">Принципы расчета
трудоемкости и стоимости</a></li>
<li><a href= «3.html»">Основные процессы
разработки</a></li>
<li><a href= «4.html»">Функциональный размер
ИС</a></li>
<li><a href= «5.html»">Процесс расчета
разработки ППО</a></li>
<li><a href= «6.html»">Демонстрация программы</a></li>
</ul>
</div>
</div>
<! - end header ->
<! - start page ->
<div id= «page»>
<! - start content ->
<div id= «content»>
<! - start latest-post ->
<div id= «latest-post»>
<h1>
<hr>
<ul>
<li>Расчет трудоемкости разработки ИС</li>
<li>Расчет стоимости разработки ИС</li>
<li>Расчет срока разработки ИС</li>
<li>Расчет трудоемкости развития ИС</li>
<li>Расчет стоимости развития ИС</li>
<li>Расчет стоимости годового сопровождения
ИС</li>
</ul>
<hr>
</div>
</body>
</html>
страница.
<html>
<head>
<title>CETIN</title>
<link href= «default.css» rel= «stylesheet»
type= «text/css» />
</head>
<body>
<! - start header ->
<div id= «header»>
<div id= «logo»>
<h1>CETIN</a></h1>
<h2><a>прогнозирование трудоемкостии
</a></h2>
<h2><a>стоимости создания</a></h2>
<h2><a>программного продукта</a></h2>
</div>
<div id= «menu»>
<ul>
<li><a href= «1.html»>Назначение
методики</a></li>
<li><a href= «2.html»">Принципы расчета
трудоемкости и стоимости</a></li>
<li><a href= «3.html»">Основные процессы
разработки</a></li>
<li><a href= «4.html»">Функциональный размер
ИС</a></li>
<li><a href= «5.html»">Процесс расчета
разработки ППО</a></li>
<li><a href= «6.html»">Демонстрация
программы</a></li>
</ul>
</div>
</div>
<! - end header ->
<! - start page ->
<div id= «page»>
<! - start content ->
<div id= «content»>
<! - start latest-post ->
<div id= «latest-post»>
<h1>
<hr>
<ul>
<li>Принцип поддержки жизненого цикла</li>
<li>Принцип измерения функционального
размера</li>
<li>Принцип универсальности</li>
<li>Принцип улучшающейся оценки</li>
<li>Принцип учета технологии производства программного
обеспечения</li>
</ul>
<hr>
</div>
</body>
</html>
страница.
<html>
<head>
<title>CETIN</title>
<link href= «default.css» rel= «stylesheet»
type= «text/css» />
</head>
<body>
<! - start header ->
<div id= «header»>
<div id= «logo»>
<h1>CETIN</a></h1>
<h2><a>прогнозирование трудоемкостии
</a></h2>
<h2><a>стоимости создания</a></h2>
<h2><a>программного продукта</a></h2>
</div>
<div id= «menu»>
<ul>
<li><a href= «1.html»>Назначение
методики</a></li>
<li><a href= «2.html»">Принципы расчета
трудоемкост и стоимости</a></li>
<li><a href= «3.html»">Основные процессы
разработки</a></li>
<li><a href= «4.html»">Функциональный размер
ИС</a></li>
<li><a href= «5.html»">Процесс расчета
разработки ППО</a></li>
<li><a href= «6.html»">Демонстрация
программы</a></li>
</ul>
</div>
</div>
<! - end header ->
<! - start page ->
<div id= «page»>
<! - start content ->
<div id= «content»>
<! - start latest-post ->
<div id= «latest-post»>
<h1>
<hr>
<ul>
<li>Бизнес моделирование</li>
<li>Управление требованиями</li>
<li>Проектирование</li>
<li>Реализация</li>
<li>Тестирование</li>
<li>Развертывание</li>
</ul>
<hr>
</div>
</body>
</html>
страница.
<html>
<head>
<title>CETIN</title>
<link href= «default.css» rel= «stylesheet»
type= «text/css» />
</head>
<body>
<! - start header ->
<div id= «header»>
<div id= «logo»>
<h1>CETIN</a></h1>
<h2><a>прогнозирование трудоемкостии
</a></h2>
<h2><a>стоимости создания</a></h2>
<h2><a>программного продукта</a></h2>
</div>
<div id= «menu»>
<ul>
<li><a href= «1.html»>Назначение
методики</a></li>
<li><a href= «2.html»">Принципы расчета
трудоемкости и стоимости</a></li>
<li><a href= «3.html»">Основные процессы
разработки</a></li>
<li><a href= «4.html»">Функциональный размер
ИС</a></li>
<li><a href= «5.html»">Процесс расчета
разработки ППО</a></li>
<li><a href= «6.html»">Демонстрация
программы</a></li>
</ul>
</div>
</div>
<! - end header ->
<! - start page ->
<div id= «page»>
<! - start content ->
<div id= «content»>
<! - start latest-post ->
<div id= «latest-post»>
<h1>
<hr>
<ul>
<li>Колличество вариантов использования (Case) -
C</li>
<li>Колличество типов объектов (бизнес объектов)
(Entity) - E</li>
<li>Колличество свойств типов объектов(Yool) -
T</li>
<li>Колличество взаимодействий между типами объектов
(Interaction) - I</li>
<li>Колличество типов узлов(Node) - N</li>
</ul>
<hr>
</div>
</body>
</html>
страница.
<html>
<head>
<title>CETIN</title>
<link href= «default.css» rel= «stylesheet»
type= «text/css» />
</head>
<body>
<! - start header ->
<div id= «header»>
<div id= «logo»>
<h1>CETIN</a></h1>
<h2><a>прогнозирование трудоемкостии
</a></h2>
<h2><a>стоимости создания</a></h2>
<h2><a>программного продукта</a></h2>
</div>
<div id= «menu»>
<ul>
<li><a href= «1.html»>Назначение
методики</a></li>
<li><a href= «2.html»">Принципы расчета
трудоемкости и стоимости</a></li>
<li><a href= «3.html»">Основные процессы
разработки</a></li>
<li><a href= «4.html»">Функциональный размер
ИС</a></li>
<li><a href= «5.html»">Процесс расчета разработки
ППО</a></li>
<li><a href= «6.html»">Демонстрация
программы</a></li>
</ul>
</div>
</div>
<! - end header ->
<! - start page ->
<div id= «page»>
<! - start content ->
<div id= «content»>
<! - start latest-post ->
<div id= «latest-post»>
<h1>
<hr>
<ul>
<li>Оценка функционального размера разрабатываемой
ИС</li>
<li>Оценка базовой трудоемкости разработки
ППО</li>
<li>Определение значений поправочных коэффициентов
трудоемкости</li>
<li>Расчет трудоемкости разработки ППО с учетом
поправочных коэффициентов</li>
<li>Оценка срока разработки ППО</li>
<li>Корректировка трудоемкости разработки ППо при
уменьшении срока разработки</li>
<li>Оценка стоимости разработки ППО</li>
</ul>
<hr>
</div>
</body>
</html>
страница.
<html>
<head>
<title>CETIN</title>
<link href= «default.css» rel= «stylesheet»
type= «text/css» />
</head>
<body>
<! - start header ->
<div id= «header»>
<div id= «logo»>
<h1>CETIN</a></h1>
<h2><a>прогнозирование трудоемкостии
</a></h2>
<h2><a>стоимости создания</a></h2>
<h2><a>программного продукта</a></h2>
</div>
<div id= «menu»>
<ul>
<li><a href= «1.html»>Назначение
методики</a></li>
<li><a href= «2.html»">Принципы расчета
трудоемкости и стоимости</a></li>
<li><a href= «3.html»">Основные процессы
разработки</a></li>
<li><a href= «4.html»">Функциональный размер
ИС</a></li>
<li><a href= «5.html»">Процесс расчета
разработки ППО</a></li>
<li><a href= «6.html»">Демонстрация
программы</a></li>
</ul>
</div>
</div>
<! - end header ->
<! - start page ->
<div id= «page»>
<! - start content ->
<div id= «content»>
<! - start latest-post ->
<div id= «latest-post»>
<h1>
<hr>
<div>
<a tabindex= «1»><img src=
«11.jpg»></a>
<a tabindex= «2»><img src=
«12.jpg»></a>
<a tabindex= «3»><img src=
«13.jpg»></a>
<a tabindex= «4»><img src=
«14.jpg»></a>
<a tabindex= «5»><img src=
«15.jpg»></a>
<a tabindex= «6»><img src=
«16.jpg»></a>
<a tabindex= «7»><img src=
«17.jpg»></a>
<a tabindex= «8»><img src=
«18.jpg»></a>
<a tabindex= «9»><img src=
«19.jpg»></a>
<a tabindex= «10»><img src=
«110.jpg»></a>
<a tabindex= «11»><img src=
«111.jpg»></a>
</div>
<hr>
</div>
</body>
</html>
Файл CSS
{: 0;: 0;: #FFFFFF url (images/img01.jpg)
repeat-x;family: «Trebuchet MS», Arial, Helvetica, sans-serif;size: 13px;:
#666666;
}
{: 0;: 0;
}
{: 0;: 0;: none;
}
, textarea, select {: normal 1em «Trebuchet MS»,
Arial, Helvetica, sans-serif;
}
, h2 {weight: normal;: #7CD300;
}
{spacing: -1px;size: 2.6em;
}
{size: 1.8em;
}
{size: 2em;weight: bold;
}
, ul, ol {
}
p {
}
{style: italic;
}
{
}
{
}
{: #7CD300;
}
:hover {decoration: none;
}
{
}
{: none;
}
{: none;
}
.left {: left;: 0 15px 0 0;
}
.right {: left;: 0 0 0 15px;
}
/* Header */
#header {: 920px;: 160px;: 0 auto;
}
/* Logo */
#logo {: left;
}
#logo h1, #logo h2 {: 0;transform: lowercase;
}
#logo h1 {top: 52px;size: 4em;: #554D49;
}
#logo h1 a {: #554D49;
}
#logo h2 {top: -10px;left: 1px;spacing: -1px;size:
1.8em;: #7F7772;
}
#logo h2 a {: #7F7772;
}
#logo a {decoration: none;
}
/* Menu */
#menu {: right;
}
#menu ul {: 0;: 40px 0 0 0;style: none;
}
#menu li {: inline;
}
#menu a {: block;: left;: 184px;: 100px;top:
30px;: #73D000 url (images/img02111.jpg) no-repeat;align: center;decoration:
none;transform: lowercase;size: 1.5em;: #FFFFFF;
}
/* Page */
#page {: 980px;: 0 auto;top: 20px;
}
#latest-post {: left;:1000px;
.title {: 0;
}
.meta {: 0;bottom: 10px;height: normal;family:
Arial, Helvetica, sans-serif;: #BABABA;
}
.meta a {: #BABABA;
}
.entry {bottom: 10px;bottom: 5px;
}a img {
/* округления старт */
webkit-border-radius: 25px;
moz-border-radius: 25px;radius: 25px;
/* округления конец */
/* transition старт */
webkit-transition: All 1s ease;
moz-transition: All 1s ease;
o-transition: All 1s ease;: all 1.0s ease;
/* transition конец */
/* Тень старт */
webkit-box-shadow: 0px 2px 4px 1px #DFDFDF;
moz-box-shadow: 0px 2px 4px 1px #DFDFDF;shadow:
0px 2px 4px 1px #DFDFDF;
/* Тень конец */
/* Прозрачнсоть старт */
moz-opacity: 0.70;
opacity: 0.70;
ms-filter: «progid:DXImageTransform. Microsoft.
Alpha» (Opacity=70);
/* Прозрачнсоть конец */
margin-right:5px; /* Отступ справа */
padding:10px; /* Внутренние отступы */
display:inline-block; /* отображение */
height:150px; /* Высота */
}
a img:hover {
moz-opacity: 1;: 1;
ms-filter: «progid:DXImageTransform. Microsoft.
Alpha» (Opacity=100);
}
gallery a:focus img {: relative; /*
Позиционирование */:500px; /* Высота */: pointer; /* Вид курсора */
/* transition старт */
webkit-transition: All 1s ease;
moz-transition: All 1s ease;
o-transition: All 1s ease;: all 1.0s ease;
/* transition конец */
/* Тень старт */
webkit-box-shadow: 0px 4px 4px 1px #DFDFDF;
moz-box-shadow: 0px 4px 4px 1px #DFDFDF;shadow:
0px 4px 4px 1px #DFDFDF;
/* Тень конец */
}