ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.10.2024
Просмотров: 6
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Кроме классических методов нисходящей и восходящей разработки, в которых модульная структура программы должна быть разработана до начала кодирования, применяют также подходы, при которых модульная структура формируется в процессе создания модулей: конструктивный и архитектурный.
Конструктивный подход к разработке программы представляет собой модификацию метода «сверху вниз», при которой модульная структура программы формируется непосредственно в процессе программирования модулей. В процессе программирования головного модуля (исходя из спецификации всей задачи в целом) выделяются подзадачи. Для каждой выделенной подзадачи создается описание реализующего ее фрагмента программы, который в дальнейшем может быть представлен некоторым поддеревом модулей. Ответственность за выполнение выделенной функции несет головной модуль этой ветки. Аналогичные действия производятся при создании любого другого модуля, выбранного из текущего состояния дерева подпрограммы.
Архитектурный подход к разработке программы – это модификация метода «снизу вверх», при котором модульная структура формируется в процессе программирования каждого модуля. При этом на первый план выходит другая цель: повышение уровня используемого языка, а не разработка конкретной программы. То есть для данной предметной области выделяются типовые функции, каждая из которых может использоваться при решении различных задач в этой области, и затем программируются модули, выполняющие эти функции. Процесс выделения таких функций связан с накоплением и обобщением опыта решения задач в заданной предметной области, поэтому обычно сначала выделяются и реализуются отдельными модулями боле простые функции, а затем постепенно появляются модули, использующее ранее созданные функции. Такой набор модулей создается в расчете на то, что при разработке той или иной программы заданной предметной области некоторые их этих модулей могут оказаться приемлемыми. Это позволяет существенно сократить трудоемкость разработки конкретной программы путем подключения к ней заранее заготовленных и проверенных на практике модулей нижнего уровня. Такие модули могут многократно использоваться в разных программах, поэтому архитектурный подход позволяет бороться с дублированием в программировании.
4. Конструирование.
Конструирование ПО включает в себя кодирование, интеграцию и тестирование.
Кодирование заключается в переводе на язык программирования конструкций, записанных на языке проектирования. В нотации Паскаля каждое слово, составляющие идентификатор, начинается с прописной буквы (MaxLength). Венгерская нотация отличается от предыдущей наличием префикса, соответствующего типу величины (iMaxLength). Согласно нотации Camel, с прописной буквы начинается каждое слово, составляющее идентификатор, кроме первого (maxLength). Отметим, что в C# для именования программных объектов чаще всего используют нотации Паскаля и Camel. Также распространена нотация, где между словами, составляющими идентификатор ставятся знаки подчеркивания (max_length),
Интеграция программной системы – это процесс объединения отдельных (протестированных) модулей с целью получения системы, требуемой проектом.
Тестирование, отладка и оптимизация. (В русской литературе часто этот этап просто называют тестированием). На этом этапе производится всесторонняя проверка программ, цель которой убедиться в том, что ПО является качественным. Существует стандарты качества ПО, один из которых (ISO/IEC 9126-1) мы уже рассматривали. На данном этапе пока определим качественную программу следующим образом. Качественная программа – это программа, выполняющая заранее объявленные действия известным способом и не выполняющая никаких необъявленных действий.
Существует определенные методы тестирования, мы рассмотрим их позже. По поводу того как должно выполняться тестирование, среди разных программистов нет единого мнения, но они единодушны в том, как тестирование не должно выполняться. Тестирование программы (или ее отдельных модулей) не должен выполнять программист (или группа программистов), создавший эту программу (модуль).
Рассмотрим этот этап более подробно. Существуют три аспекта проверки программы на:
- правильность;
- эффективность реализации;
- вычислительную сложность.
Проверка правильности (верификация программы) удостоверяет, что программа делает в точности то, для чего она была предназначена.
Статистика свидетельствует, что стоимость такого тестирования программного продукта составляет не менее 50 процентов стоимости начальной разработки и 70 процентов всей стоимости поддержки программного продукта. Но сколько бы сил и денег не было потрачено на тестирование необходимо понимать, что
тесты могут доказать наличие ошибок в программе, но они не могут доказать их отсутствия. Один из общих законов программирования гласит, что ни одна программа не дает желаемых результатов при первой попытке ее трансляции и выполнения.
На рисунке изображена диаграмма процентного соотношения причин появления тех или иных ошибок при обработке данных.
Из диаграммы видно, что большинство ошибок совершаются именно на этапе кодирования.
Существуют два типа программных ошибок: синтаксические и семантические. Синтаксические ошибки возникают из-за нарушений правил (лексики) языка программирования и выявляются во время компиляции. Такие ошибки могут быть исключены сравнительно легко. Большинство из них можно выявить путем простого просмотра текста программы. Чаще всего программисты оставляют этот этап компилятору, однако сквозной просмотр текста иногда бывает полезен. Скорость исправления ошибок, выявленных компилятором, зависит от степени знакомства программиста с данным языком. Семантические или логические ошибки приводят к некорректным вычислениям или ошибкам во время выполнения программы (run-time error). Математическая безупречность алгоритма не гарантирует правильности его перевода в программу. Аналогично разумный вид получаемых результатов не дает достаточной гарантии правильности программы. В общем случае нельзя дать общего решения для проведения проверки на правильность программы. Конечно, самым лучшим способом тестирования программы является поставка ее пользователю сразу же после завершения программирования. Единственное слабое место такого метода – этот пользователь больше никогда не купит у вас не одной программы. Выявление и устранение ошибок часто имеет циклический характер. Устранение одной ошибки может породить другую ошибку. Особенно это касается работы с глобальными переменными.
Как правило, устранение таких ошибок заключается в разработке и проведении наборов тестов, то есть выполнении программы с тщательно подобранными проверочными данными для которых известен правильный ответ. При подготовке к тестированию следует придерживаться следующих правил:
1. Чем раньше спроектирован тест, тем вероятнее выявление ошибок. Поэтому лучше готовить тесты еще на этапе проектирования системы.
2. Недопустима хаотичность процесса тестирования. Он должен быть документирован и полностью управляем.
3. Необходимы повторяемость и завершенность тестов.
4. Следует избегать добавления новых тестов в процессе тестирования.
Первым шагом семантической проверки является ручной прогон, то есть программист моделирует прохождение данных через его программу с помощью карандаша и листа бумаги. Это скучная и утомительная работа, однако, большинство ошибок может быть выявлено именно на этой стадии.
Разумеется, таким образом нельзя проверить всевозможные комбинации данных. Однако можно проверить всевозможные типы или наиболее вероятные комбинации данных. Если они дают правильные результаты, предполагается, что непроверенные комбинации также дали бы правильные результаты. Отдельно тестируется каждый модуль программы. Если программа хорошо спроектирована, то после этого остается проверить только интерфейс между модулями.
Следует особо подчеркнуть, что первоначальное тестирование процедур модуля выполняется программистом путем написание коротких «программок», которые вызывают процедуры с различными наборами параметров. Начинающему программисту такой подход может показаться очень расточительным с точки зрения расходования рабочего времени, но это единственный способ более или менее эффективной борьбы с ошибками в программе.
Очень часто тесты (файлы с тестовыми данными) создаются вручную. Следовательно, их число редко превышает два-три десятка. Иногда применяют генераторы тестовых данных – специальные программы, формирующие данные в соответствии со спецификациями задаваемыми программистами. Данные могут группироваться в записи, имеющие установленные форматы. Тестовые данные могут также систематически или случайно выбираться из другого заданного набора данных для уменьшения их общего количества, над которыми выполняется тест.
Кроме того, необходимо на завершающем этапе тестирования следует прогнать программу на реальном объеме данных и посмотреть, насколько интерфейс программы выдержит такую нагрузку. (Очень часто программа, прекрасно работающая для двух десятков записей в базе данных через год, когда база будет насчитывать сотни тысяч записей, будет выполняться несколько минут).
После завершения комплексного тестирования приступают к оценочному тестированию, целью которого является поиск несоответствий техническому заданию. Оценочное тестирование включает тестирование: удобства использования, на предельных объемах, на предельных нагрузках, удобства эксплуатации, защиты, производительности, требований к памяти, конфигурации оборудования, совместимости, удобства установки, удобства обслуживания, надежности, восстановления, документации, процедуры.
Отладка — процесс исправления ошибок, обнаруженных при тестировании, состоит из многократного чередования этапов тестирования, локализации и исправления ошибок.
Если прогон программы на тестовых данных дает неверный результат, то необходимо найти и исправить ошибку. При отладке программы используют три основных способа:
- распечатка текущего состояния
- точка останова
- трассировка
Распечатка текущего состояния используется с целью фиксации фактических значений переменных для проверки хода вычислений. Для этого во время отладки программы в местах, которые программист считает критическими, помещают функции вывода на экран текущего состояния переменных. После окончания теста вызовы этих функций удаляются, и программа снова перекомпилируется.
Метод «точки останова» обычно применяют при разного рода зацикливаниях. В текст программы включают функции останова программы, например можно вывести на экран сообщение «Достигнута точка n» и вызвать функцию getch(). Этот метод имеет смысл объединять с методом деления пополам. Точка останова ставится в средине программы, если программа выполнилась до этой точки, что точка останова ставиться в средине второй половины программы, если нет, то в средине первой и т.д. Таким образом, область поиска ошибки постепенно сужается.
Трассировка – это пошаговое выполнение программы с возможностью просматривать состояние всех переменных. Она может оказаться очень эффективной, но значительно замедляет выполнение программы и, не будучи тщательно спланированной, приводит к колоссальным объемам выдаваемой информации.
Проверка вычислительной сложности