Создание модульных структур программного продукта

Формализация спецификаций. Спецификация (буквально понимается как описание или получение требований) - это строгое формализованное описание свойств, характеристик или функций системы (объекта, программы, знаний, отчета и др.), ее связи с другими системами и соглашение об их использовании в контексте с другими системами.

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

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

Формализация же задач из других областей знаний может оказаться более сложной и трудоемкой проблемой, чем разработка самого приложения ввиду отсутствия четкой математической модели.

Языки формальных спецификаций (например, языки SDL и MSC) были разработаны для того, чтобы упростить и там, где это возможно, автоматизировать процессы создания и анализа программного обеспечения. Большая часть языков формальных спецификаций в качестве своих истоков имеет либо математическую модель, либо некоторый формализм, который в свою очередь имеет строгую математическую интерпретацию. Тяга к математическим построениям и формальным моделям была обусловлена тем, что неоднозначность и нечеткость в неформальных или полуформальных описаниях могла быть преодолена только заменой таких описаний на формальные, которыми и являются формальные спецификации.

В настоящее время большое внимание уделяется одному из современных языков спецификации программ - языку RSL, предоставляющему достаточно мощные и удобные средства для формального описания программных систем на разных уровнях абстракции. RSL — проблемно-ориентированный интерпретируемый язык программирования, разработанный компанией R-Style Softlab для использования в своих программных продуктах.

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

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

Каждый модуль состоит из спецификации и тела. Спецификации определяют правила использования модуля, а тело - способ реализации процесса обработки.

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

Однотипные функции реализуются одними и теми же модулями. Функция верхнего уровня обеспечивается главным модулем; он управляет выполнением нижестоящих функций, которым соответствуют подчиненные модули.

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

• каждый модуль вызывается на выполнение вышестоящим модулем и, закончив работу, возвращает управление вызвавшему его модулю;

• принятие основных решений в алгоритме выносится на максимально "высокий" по
иерархии уровень;

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

Среди множества модулей различают:

• головной модуль - управляет запуском программного продукта (существует в единственном числе);

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

• рабочие модули - выполняют функции обработки;

• сервисные модули и библиотеки, утилиты - осуществляют обслуживающие функции.

В работе программного продукта активизируются необходимые программные модули. Управляющие модули задают последовательность вызова на выполнение очередного модуля. Информационная связь модулей обеспечивается за счет использования общей базы данных либо межмодульной передачи данных через переменные обмена.

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

При этом модульная структура программы, в конечном счете, должна включать и совокупность спецификаций модулей, образующих эту программу. Спецификация программного модуля содержит, во-первых, синтаксическую спецификацию его входов, позволяющую построить на используемом языке программирования синтаксически правильное обращение к нему (к любому его входу), и, во-вторых, функциональную спецификацию модуля (описание семантики функций, выполняемых этим модулем по каждому из его входов). Функциональная спецификация модуля строится так же, как и функциональная спецификация всего программного продукта.

Таким образом, программный продукт обладает внутренней организацией, или внутренней структурой, образованной взаимосвязанными программными модулями. Это справедливо для сложных и многофункциональных программных продуктов, которые часто называются программными системами (ПС).

Структуризация программ выполняется в первую очередь для удобства разработки, программирования, отладки и внесения изменений в программный продукт. Как правило, программные комплексы большой алгоритмической сложности разрабатываются коллективом разработчиков. Управлять разработкой программ в условиях применения промышленных технологий изготовления программ можно лишь на научной основе.

Таким образом, структуризация программных продуктов преследует основные цели:

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

• построить календарные графики проектных работ и осуществлять их координацию в процессе создания программных изделий;

• контролировать трудозатраты и стоимость проектных работ и др.

Разработка тестов и отладка программного продукта. Отладка программного продукта (ПП) - это деятельность, направленная на обнаружение и исправление ошибок в ПП с использованием процессов выполнения его программ. Тестирование ПП - это процесс выполнения его программ на некотором наборе данных, для которого заранее известен результат применения или известны правила поведения этих программ. Указанный набор данных называется тестовым или просто тестом. Таким образом, отладку можно представить в виде многократного повторения трех процессов: тестирования, в результате которого может быть констатировано наличие в ПП ошибки, поиска места ошибки в программах и документации ПП, и редактирования программ и документации с целью устранения обнаруженной ошибки.

Стратегия проектирования тестов включает проектирование значительной части тестов по спецификациям, исходя из принципов: на каждую используемую функцию или возможность - хотя бы один тест, на каждую область и на каждую границу изменения какой-либо входной величины - хотя бы один тест, на каждый особый случай или на каждую исключительную ситуацию, указанные в спецификациях, - хотя бы один тест. Но она требует также проектирования некоторых тестов и по текстам программ, исходя из принципа: каждая команда каждой программы ПС должна проработать хотя бы на одном тесте.

Оптимальную стратегию проектирования тестов можно конкретизировать на основании следующего принципа: для каждого программного документа (включая тексты программ), входящего в состав ПП, должны проектироваться свои тесты с целью выявления в нем ошибок.

Во всяком случае, этот принцип необходимо соблюдать в соответствии с определением ПП и содержанием понятия технологии программирования как технологии разработки надежных ПС Программисты различают два основных вида отладки (включая тестирование): автономную и комплексную отладку. Автономная отладка означает тестирование только какой-то части программы, входящей в ПП, с поиском и исправлением в ней фиксируемых при тестировании ошибок. Она фактически включает отладку каждого модуля и отладку сопряжения модулей.

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

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

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

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

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

Сначала запускается текстовый редактор для набора текста исходной программы на соответствующем алгоритмическом языке. Затем компилятор переводит исходный модуль в некоторую заготовку на машинном языке (объектный модуль). Так как непосредственно выполняться объектный модуль не может, для его работы вызываются другие системные модули, устанавливающие связи между ними по общим переменным, объединяющие модули в единую программу, настраивающие ее по месту расположения в оперативной памяти. Этим занимаются редактор связей и загрузчик.

После формирования загрузочного модуля наступет этап отладки, связанный с поиском ошибок алгоритмического характера. Для этой цели используется специальная программа отладчик К перечисленному набору системных программ добавлялся еще и библиотекарь утилита, обслуживающая системные и пользовательские библиотеки объектных модулей. Заслуга интегрированной среды заключается в объединении всех этих компонент в единую систему, которая автоматически переходит к следующему этапу обработки после устранения ошибок, обнаруженных очередной утилитой. Кроме того, перед глазами программиста всегда находился текст исходной программы, которую в любой момент времени можно поправить и дополнить. В случае удачи (из программы исключены все синтаксические и семантические ошибки) запуск программы из интегрированной среды сводился к выполнению единственной команды Пуск (Run).

Хотя, и существуют среды разработки, предназначенные для нескольких языков программирования — такие, как Eclipse, Microsoft Visual Studio, обычно среда программирования предназначается для одного определенного языка программирования как, например, Visual Basic, Delphi, C++.

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

На практике термин "переносимость" нередко относят к более слабому свойству: программу проще видоизменить при переносе в другую среду исполнения, чем написать заново. Чем меньше изменений надо внести, тем выше переносимость программы. Усилия, затраченные на обеспечение переносимости программы, сказываются на всех ее аспектах; она оказывается лучше спроектированной, аккуратнее написанной и тщательнее протестированной. Технологии программирования переносимых программ непосредственно привязаны к технологиям хорошего программирования.

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

Сами компиляторы тоже вызывают проблемы с переносимостью из-за разного толкования не описанных в стандарте случаев.

Обработка системных различий, от которых все равно никуда не денешься, должна быть вынесена в отдельные файлы программы, которые будут играть роль интерфейса между программой и конкретной системой. У этого подхода есть свои недостатки, главным из которых является потенциальное ухудшение производительности и даже возможностей, но в общем и целом все недостатки окупаются открывающимися преимуществами. Удачные программы живут достаточно долго, так что меняются системы, в которых их используют; нередко приходится переносить их на другие платформы или на другие машины или использовать в других странах. Смысл переносимости в том, чтобы уменьшить расходы на поддержание программы, минимизировав количество изменений, необходимых для адаптации к новому окружению.

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

Это — программы, обладающие определенной структурной и функциональной целостностью и в то же время специально приспособленные к тому, чтобы вступать в четко определяемое и контролируемое информационно-логическое взаимодействие с другими модулями (под взаимодействием понимается или обмен информацией или определенная соподчиненность выполнения).

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

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

Открытые системы. Применение подхода открытых систем в настоящее время является основной тенденцией в области информационных технологий и средств вычислительной техники, поддерживающих эти технологии.

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

Основные свойства открытых систем:

• расширяемость:

• масштабируемость:

• переносимость приложений, данных и персонала;

• интероперабельность приложений и систем;

• способность к интеграции;

• высокая доступность.

Расширяемость. Расширяемость означает возможность сравнительно легкого добавления отдельных элементов сети (пользователей, компьютеров, приложений, служб), наращивания длины сегментов сети и замены существующей аппаратуры более мощной.

Масштабируемость. Масштабируемость в информатике означает способность системы увеличивать свою производительность при добавлении ресурсов (обычно аппаратных). Масштабируемость — важный аспект электронных систем, программных комплексов, баз данных, маршрутизаторов, сетей и т. п., если для них требуется возможность работать под большой нагрузкой. Система называется масштабируемой, если она способна увеличивать производительность пропорционально дополнительным ресурсам. Масштабируемость можно оценить через отношение прироста производительности системы к приросту используемых ей ресурсов. Чем ближе это отношение к единице, тем лучше. Также под масштабируемостью понимается возможность наращивания дополнительных ресурсов без структурных изменений центрального узла системы.

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

Портируемость — как свойство программного обеспечения, описывающее, насколько легко это ПО может быть переносимо. По мере развития операционных систем, языков и техники программирования, становится все проще переносить программы между различными платформами. Одной из изначальных целей создания языка Си и стандартной библиотеки этого языка была возможность простого переноса программ между несовместимыми аппаратными платформами. Дополнительные преимущества в плане портируемости могут иметь программы, удовлетворяющие специальным стандартам и правилам написания (см., например Smart Package Manager ). Портированное ПО разрабатывается для одних платформ, после чего переносится для работы на других платформах.

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

Способность к интеграции. Интеграция в общем случае обозначает объединение, взаимопроникновение. Объединение каких-либо элементов (частей) в целое. Процесс взаимного сближения и образования взаимосвязей.

Высокая доступность. Высокая доступность — это метод проектирования системы, позволяющий достигать высокий уровень доступности системы в течение какого-либо промежутка времени. Доступность означает возможность группе пользователей использовать систему в полном объеме в течение длительного времени без ее сбоев.

Все методы, применяемые для обеспечения высокого уровня доступности открытых систем, взаимосвязаны, но условно их часто делят на две группы: архитектурные и организационные. Архитектурные методы можно охарактеризовать одним словом - дублирование. Дублирование сокращает время восстановления работы открытой системы после сбоя. Организационные методы предназначены для построения такого процесса эксплуатации, который свел бы до минимума время обнаружения и устранения неисправностей в системе. К ним относятся мониторинг, план восстановления после сбоев и тренинг персонала.


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




Подборка статей по вашей теме: