Файл: Обзор языков программирования высокого уровня (ЭВОЛЮЦИЯ ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.03.2023

Просмотров: 2245

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Объект S

Подпрограммы с локальными данными

Рисунок 4 – Структура программы, реализующей объектно-ориентированный подход

Впервые объектно-ориентированный подход был воплощен в языке имитационного моделирования сложных систем Simula (60-е годы XX в.), затем в специализированном языке моделирования Smalltalk (70-е годы XX в.), а уже позже он нашел свою реализацию в новых версиях универсальных языков программирования, таких, как Pascal, C++, Modula, Java.

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

Использование объектно-ориентированного подхода обладает большим количеством преимуществ, однако его конкретная реализация в языках программирования высокого уровня, таких, как Pascal и C++, имеет серьезные недостатки: так, например, в случае использования этих языков сохраняется зависимость модулей программного обеспечения от адресов экспортируемых свойств и методов, а также форматов и структур данных. В силу того, что отдельные модули должны взаимодействовать между собой, обращаясь к ресурсам - эта зависимость является объективной. Можно попробовать стандартизировать их взаимодействие, хотя связи модулей и не могут быть разорваны, на этой теории и основан компонентный подход к программированию [16].

1.4. Компонентное программирование

Четвертый этап принято называть компонентным подходом и CASE-технологии (с середины 90-х годов ХХ века и нынешнего времени). Идея построения программ из отдельных частей, взаимодействующих между собой посредством стандартизованных двоичных интерфейсов, является фундаментом компонентного подхода. Объекты-компоненты могут собираться в исполняемые файлы или динамически вызываемые библиотеки, передаваться в двоичном виде (без исходных текстов) и применяться в любых языках программирования, поддерживающих соответствующую технологию – это основное отличие от обычных объектов. Особенность современного этапа развития технологии программирования, кроме изменения подхода, заключается во введении в эксплуатацию автоматизированных технологий разработки и сопровождения программного обеспечения, названных CASE-технологиями (Computer-Aided Software/System Engineering – разработка программных систем / программного обеспечения с использованием компьютерной поддержки).


Человеческая память не в способна учитывать все детали, которые должны быть задействованы в процессе разработки программного обеспечения, поэтому в наше время разработка сложных программ без применения средств автоматизации становится практически невозможной. В настоящее время существуют технологии, которые поддерживают как структурный, так и объектный (в том числе и компонентный) подходы к программированию и это CASE-технологии [7].

2. ПРИНЦИПЫ МОДУЛЬНОГО ПРОГРАММИРОВАНИЯ

2.1. Основные понятия

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

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

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

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

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


К достоинствам модульного программирования относятся:

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

Однако есть и ряд недостатков:

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

Однако достоинства модульного программирования настолько велики, что в настояшее время оно является одним из ключевых способов разработки сложных программных систем, не смотря на все отмеченные недостатки [14].

2.2. Характеристики модулей

К основным характеристикам модулей принято относить:

  • рутинность - это показатель независимости модуля от предыстории обращений к нему. Модуль является рутинным, если результат (эффект) обращения к нему характеризуется только значениями его параметров. Если результат (эффект) обращения к нему зависит от внутреннего состояния данного модуля, хранящего следы предыдущих обращений к нему - модуль является зависящим от предыстории. В большинстве случаев использование непредсказуемых модулей не рекомендуется, т.к. они способны провоцировать появление в программах неуловимых ошибок. Однако данная рекомендация не является до конца рациональной, потому что в большинстве случаев именно модуль, зависящий от предыстории, является лучшей реализаций информационно прочного модуля;
  • размер - характеризуется числом операторов (строк), содержащихся в модуле. Модуль не должен быть слишком большим или слишком маленьким. Большое количество маленьких модулей приводит к громоздкой модульной структуре программы и может не окупить накладные расходы, связанные с их оформлением. В то же время большие модули неудобны с точки зрения изучения и внесения изменений, в результате чего они существенно повышают суммарное время повторных трансляций программы при ее отладке. Обычно рекомендуется создавать программные модули размером от нескольких десятков до нескольких сотен операторов[15].

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

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

Модуль

Рисунок 5 – Информационная закрытость модуля

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

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

Таким образом, модуль представляет собой «чёрный ящик», содержимое (реализация) которого недоступно другим модулям, а управление им (интерфейс) наоборот открыто. Любые изменения реализации модуля при этом никак не влияют на его конечных пользователей.

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

  • функциональная связность – отдельные части модуля вместе реализуют одну проблемную задачу (операцию). Например, сюда можно отнести вычисление тангенса угла, расчет заработной платы сотрудника и т.п. Модуль исполняет только ту функцию, для которой он предназначен. Поэтому важно понимать, что модуль вычисления тангенса не должен выводить его значение на экран;
  • информационная связность - выходные данные одной части модуля используются в качестве входных данных другой его части. При этом порядок выполнения действий определен и подобен конвейеру;
  • коммуникативная связность - в данном случае отдельные части модуля связаны по данным. Это говорит о том, что они работают с одним и тем же типом структуры данных, а порядок действий при этом не имеет значения;
  • процедурная связность - данный тип связности относится к ситуации, в которой отдельные части модуля связаны между собой за счет порядка выполняемых ими операций, реализующих некоторый сценарий поведения. При этом зависимость по данным между отдельными частями модуля отсутствует;
  • временная связность - разные части модуля не связаны между собой ни по данным, ни по порядку выполнения, но необходимы в один и тот же период работы системы;
  • логическая связность - в данной ситуации отдельные части модуля объединяются по принципу функционального подобия. Например, модуль состоит из различных функций обработки ошибок. К существенным недостаткам таких модулей принято относить сложное сопряжение с другими модулями, а также большую вероятность внесения ошибок в процессе модификации;
  • связность по совпадению – характеризует ситуацию, при которой в модуле вовсе отсутствуют явно выраженные внутренние связи.

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

  • сцепление по данным - предполагает, что функции одного модуля используют функции второго модуля, при этом все входные и выходные параметры вызываемого модуля представляют собой простые элементы данных;
  • сцепление по образцу – в данной ситуации в качестве параметров используются структуры данных;
  • сцепление по управлению – характеризует ситуацию, в которой один модуль явно управляет работой другого модуля посредством переключателей или флагов, посылая ему управляющие данные;
  • сцепление по внешним ссылкам - в этом случае оба модуля используют ссылки на один и тот же глобальный элемент данных;
  • сцепление по общей области – проявляется в том случае, когда модули разделяют одну и ту же глобальную структуру данных;
  • сцепление по содержанию – описывает ситуацию, в которой один модуль прямо ссылается на содержание другого модуля (в обход интерфейсной части вызываемого модуля) [2].

2.3. Принципы модульного программирования

Принято выделять ряд фундаментальных принципов модульного программирования:

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

При составлении алгоритма очень важно учитывать следующие моменты:

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

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

Функция 1

Функция 2

Модуль 1

Функция 3

Модуль V