Объект S
Подпрограммы с локальными данными
…
Рисунок 4 – Структура программы, реализующей объектно-ориентированный подход
Впервые объектно-ориентированный подход был воплощен в языке имитационного моделирования сложных систем Simula (60-е годы XX в.), затем в специализированном языке моделирования Smalltalk (70-е годы XX в.), а уже позже он нашел свою реализацию в новых версиях универсальных языков программирования, таких, как Pascal, C++, Modula, Java.
Многие проблемы позволило решить бурное развитие технологий программирования, основанных на объектном подходе. Так, например, появились среды визуального программирования, которые давали программисту возможность проектирования некоторой части программного обеспечения с помощью визуальных средств добавления и настройки специальных библиотечных компонентов. Результатом визуального проектирования является заготовка будущей программы, в которую уже внесены соответствующие коды.
Использование объектно-ориентированного подхода обладает большим количеством преимуществ, однако его конкретная реализация в языках программирования высокого уровня, таких, как Pascal и C++, имеет серьезные недостатки: так, например, в случае использования этих языков сохраняется зависимость модулей программного обеспечения от адресов экспортируемых свойств и методов, а также форматов и структур данных. В силу того, что отдельные модули должны взаимодействовать между собой, обращаясь к ресурсам - эта зависимость является объективной. Можно попробовать стандартизировать их взаимодействие, хотя связи модулей и не могут быть разорваны, на этой теории и основан компонентный подход к программированию [16].
Четвертый этап принято называть компонентным подходом и CASE-технологии (с середины 90-х годов ХХ века и нынешнего времени). Идея построения программ из отдельных частей, взаимодействующих между собой посредством стандартизованных двоичных интерфейсов, является фундаментом компонентного подхода. Объекты-компоненты могут собираться в исполняемые файлы или динамически вызываемые библиотеки, передаваться в двоичном виде (без исходных текстов) и применяться в любых языках программирования, поддерживающих соответствующую технологию – это основное отличие от обычных объектов. Особенность современного этапа развития технологии программирования, кроме изменения подхода, заключается во введении в эксплуатацию автоматизированных технологий разработки и сопровождения программного обеспечения, названных CASE-технологиями (Computer-Aided Software/System Engineering – разработка программных систем / программного обеспечения с использованием компьютерной поддержки).
Человеческая память не в способна учитывать все детали, которые должны быть задействованы в процессе разработки программного обеспечения, поэтому в наше время разработка сложных программ без применения средств автоматизации становится практически невозможной. В настоящее время существуют технологии, которые поддерживают как структурный, так и объектный (в том числе и компонентный) подходы к программированию и это CASE-технологии [7].
В настоящее время модульное программирование является одним из наиболее популярных способов разработки программного обеспечения. Он заключается в проектировании из нескольких частично независимых друг от друга частей – модулей. В процессе разработки программных продуктов принцип модульности является основополагающим.
Модуль представляет собой функционально законченный фрагмент программного кода, оформленный в качестве отдельного файла с исходным кодом или ее поименованной непрерывной части, предназначенный для применения в других программах. С помощью модулей можно легко разбивать большие сложные задачи на несколько более мелких согласно принципу модульности.
Основной принцип модульности заключается в том, что любое программное средство может разделяться на самостоятельные единицы - модули. Таким образом модульный подход упрощает задачи проектирования и распределения процесса разработки. Разбивая большую программу на отдельные модули, можно увидеть, что каждый модуль обладает собственным описанием, характеризующим его назначение и функциональные возможности, а также связи с другими модулями.
Модульное программирование представляет собой разработку и структуризацию программы в виде комплекса отдельных независимых блоков - модулей, структура и поведение которых подчиняются определенным установленным правилам.
Использование данной технологии позволяет упростить процесс тестирования, а аппаратно-зависимые подзадачи, которые отделяются от других задач и дают возможность повторного использования готовых модулей в других проектах, позволяют повысить мобильность разрабатываемых программ.
К достоинствам модульного программирования относятся:
Однако есть и ряд недостатков:
Однако достоинства модульного программирования настолько велики, что в настояшее время оно является одним из ключевых способов разработки сложных программных систем, не смотря на все отмеченные недостатки [14].
К основным характеристикам модулей принято относить:
Одним из основных принципов разработки модулей является принцип информационной закрытости, согласно которому содержание модулей должно быть скрыто друг от друга. Модуль определяется и проектируется таким образом, чтобы его содержимое (данные и функции) были недоступны тем модулям(клиентам), которые не нуждаются в этой информации. Данный принцип отражен на рисунке 5.
Принцип информационной закрытости говорит о том, что все модули должны быть максимально независимы друг от друга и обмениваться только информацией, необходимой для их функционирования. Кроме того, его доступ к структурам данных и операциям модуля извне должен быть ограничен.
Модуль
Рисунок 5 – Информационная закрытость модуля
Этот принцип сокращает время разработки программы в целом, т.к. он реализует возможность разработки модулей отдельными независимыми разработчиками. Также он несет значительную пользу и в малых проектах, где количество разработчиков невелико, или он вообще один.
Преимущество здесь объясняется легкой модификацией системы. Многие данные и функции локализуются в рамках отдельных модулей и скрыты от других частей системы, благодаря чему использование данного принципа дает возможность сократить вероятность распространения ошибок.
Таким образом, модуль представляет собой «чёрный ящик», содержимое (реализация) которого недоступно другим модулям, а управление им (интерфейс) наоборот открыто. Любые изменения реализации модуля при этом никак не влияют на его конечных пользователей.
Внутренняя характеристика связности может использоваться для того, чтобы оценить уровень информационной закрытости модуля. Связность модуля характеризует степень зависимости его частей. Чем выше показатель связности, тем лучше результат проектирования. Далее представлены различные типы связности в порядке ее уменьшения, при этом первые три характеризуют хорошее качество модуля, а остальные - недостаточно высокое качество разработки:
Сцепление – это особая характеристика, которая применяется для оценки меры взаимозависимости модулей по данным. Сцепление является внешней характеристикой модуля, которую необходимо уменьшать. Принято выделять несколько типов сцепления, которые представлены ниже в порядке его увеличения:
Принято выделять ряд фундаментальных принципов модульного программирования:
При составлении алгоритма очень важно учитывать следующие моменты:
Основой такого подхода является функционально-модульная схема алгоритма всего приложения, которая получается в результате детализации алгоритма (см. рисунок 6).
Функция 1
Функция 2
Модуль 1
Функция 3
Модуль V