Файл: Классификация языков программирования высокого уровня.pdf
Добавлен: 06.04.2023
Просмотров: 94
Скачиваний: 1
Однако есть и недостатки:
- перед первым запуском программы, все необходимые модули должны быть собраны в особую сборку. Данный процесс достаточно сложен, так как кроме объединения всех модулей в единую программу, необходимо также проконтролировать и установить все связи между ними;
- модули не являются полностью независимыми друг от друга - между ними существуют определенные связи. Это значит, что один модуль иногда может использовать переменные, константы и даже программный код другого модуля;
- компилятор, реализующий сборку программы, не видит сразу всех модулей и не может проконтролировать правильность связей между ними[37].
Достоинства модульного программирования так велики, что на сегодняшний днь оно является одним из основных способов разработки сложных программных систем, не смотря на все отмеченные недостатки[38].
Основные характеристики модулей:
- рутинность - это показатель независимости модуля от предыстории обращений к нему. Модуль называется рутинным, если результат (эффект) обращения к нему характеризуется только значениями его параметров. Если результат (эффект) обращения к нему зависит от внутреннего состояния этого модуля, хранящего следы предыдущих обращений к нему - модуль называется зависящим от предыстории. Обычно не рекомендуется использование непредсказуемых модулей, т.е. зависящих от предыстории, т.к. что они способны провоцировать появление в программах хитрых (неуловимых) ошибок. Однако данная рекомендация не является до конца рациональной, потому что в большинстве случаев именно модуль, зависящий от предыстории, является лучшей реализаций информационно прочного модуля.
- размер - определяется количеством операторов (строк), содержащихся в модуле. Модуль не должен быть слишком большим или слишком маленьким. Большое число маленьких модулей приводит к громоздкой модульной структуре программы и может не окупить накладных расходов, связанных с их оформлением. В то же время большие модули неудобны с точки зрения изучения и внесения изменений, они могут существенно повышать суммарное время повторных трансляций программы в процессе ее отладки. Обычно рекомендуются программные модули размером от нескольких десятков до нескольких сотен операторов[39].
Принцип информационной закрытости является одним из основных принципов разработки модулей. Согласно этому принципу содержание модулей должно быть скрыто друг от друга. Модуль определяется и проектируется таким образом, чтобы его содержимое (данные и функции) были недоступны тем модулям(клиентам), которые не нуждаются в такой информации. Такой принцип характеризует рисунок 7[40].
Модуль
Рисунок 7 – Информационная закрытость модуля
Все модули должны быть максимально независимы друг от друга и обмениваться только информацией, необходимой для их функционирования – это принцип информационной закрытости. Кроме того, его доступ к структурам данных и операциям модуля извне должен быть ограничен.
Данный принцип сокращает время разработки программы в целом, т.к. он реализует возможность разработки модулей отдельными независимыми разработчиками. Также он несет значительную пользу и в малых проектах, где число разработчиков невелико, или он вообще один. Здесь преимущество в легкой модификации системы. Многие данные и функции локализованы в рамках отдельных модулей и скрыты от других частей системы, таким образом использование этого принципа дает возможность уменьшить вероятность распространения ошибок[41].
Таким образом модуль представляет собой «чёрный ящик», содержимое (реализация) которого недоступно другим модулям, а управление им (интерфейс) наоборот. В данном случае, любые изменения реализации модуля никак не повлияют на его конечных пользователей.
Внутренняя характеристика связности, может быть использована, чтобы оценить уровень информационной закрытости модуля. Связностью модуля называется степень зависимости его частей. Чем выше показатель связности модуля, тем лучше результат проектирования. Ниже приведены различные типы связности в порядке ее уменьшения, при этом первые три характеризуют хорошее качество модуля, а остальные - недостаточно высокое качество разработки:
- функциональная связность – вместе отдельные части модуля реализуют одну проблемную задачу (операцию). Например, к ним можно отнести вычисление тангенса угла, проверку орфографии, расчет заработной платы сотрудника и т.п. Модуль исполняет только ту функцию, для которой он предназначен. Поэтому важно понимать, что модуль вычисления тангенса не должен печатать его значение;
- информационная связность - выходные данные одной части модуля применяются в качестве входных данных другой его части. Порядок выполнения действий при этом четко определен и подобен конвейеру;
- коммуникативная связность - в данном случае отдельные части модуля связаны по данным. Это говорит о том, что они работают с одним и тем же типом структуры данных, порядок действий при этом совершенно безразличен;
- процедурная связность - этот тип связности относится к ситуации, в которой отдельные части модуля связаны между собой порядком выполняемых ими действий, реализующих некоторый сценарий поведения. Зависимость по данным между отдельными частями модуля при этом отсутствует;
- временная связность - различные части модуля не связаны между собой ни по данным, ни по порядку выполнения, но необходимы в один и тот же период работы системы;
- логическая связность - в данной ситуации отдельные части модуля объединяются по принципу функционального подобия. Например, модуль включает в себя различные функции обработки ошибок. К серьёзным недостаткам таких модулей относится сложное сопряжение с другими модулями, а также большая вероятность внесения ошибок в случае внесения изменений;
- связность по совпадению – характеризует ситуацию, при которой в модуле отсутствуют явно выраженные внутренние связи вообще[42].
Сцепление – это особая характеристика, которая используется, чтобы оценить меру взаимозависимости модулей по данным. Сцепление является внешней характеристикой модуля, которую следует уменьшать. Принято выделять несколько типов сцепления, которые ниже приведены в порядке его увеличения:
- сцепление по данным - предполагает, что функции одного модуля вызывают функции второго модуля, причем все входные и выходные параметры вызываемого модуля представляют собой простые элементы данных;
- сцепление по образцу – в данной ситуации в качестве параметров применяются структуры данных;
- сцепление по управлению – характеризует ситуацию, в которой один модуль явно управляет функционированием другого модуля при помощи переключателей или флагов, посылая ему управляющие данные;
- сцепление по внешним ссылкам - в этом случае оба модуля имеют ссылки на один и тот же глобальный элемент данных;
- сцепление по общей области – проявляется в том случае, когда модули разделяют одну и ту же глобальную структуру данных;
- сцепление по содержанию – описывает ситуацию, в которой один модуль прямо ссылается на содержание другого модуля (в обход интерфейсной части вызываемого модуля)[43].
Фундаментом модульного программирования являются следующие принципы:
- определение состава и подчиненность функций;
- определение набора программных модулей, отвечающих за реализацию этих функций.
При составлении алгоритма очень важно учесть следующие моменты:
- каждый модуль вызывается на исполнение другим (вышестоящим по иерархии) модулем и, по завершении работы, возвращает управление этому модулю;
- принятие основных решений в алгоритме выносится на максимально доступный по иерархии уровень;
- для использования одной и той же функции в различных местах алгоритма создается один модуль, вызывающийся в дальнейшем по мере необходимости[44].
Основой подхода служит функционально-модульная схема алгоритма всего приложения, которая получается в результате детализации алгоритма (см. рисунок 8)[45].
Делаем вывод, что принципы модульного программирования по разным параметрам схожи с принципами нисходящего проектирования. Для начала важно определить состав и подчиненность функций. Затем, определяются программные модули, отвечающие за реализацию этих функций. Однотипные функции должны реализовываться одними и теми же модулями. Функция верхнего уровня обеспечивается главным модулем, который управляет исполнением функций всех подчиненных модулей[46].
Функция 1
Функция 2
Модуль 1
Функция 3
Модуль V
Функция 4
Модуль P
Функция 5
Модуль M
Модуль 2
Модуль 3
Модуль K
Модуль N
Модуль P
Модуль Q
Рисунок 8 – Функционально-модульная схема алгоритма
2.3. Объектно-ориентированное программирование
В последние годы технология объектно-ориентированного программирования получила широкую популярность. Практически все производители программного обеспечения перевели свои продукты к объектно-ориентированным версиям. В настоящее время существует целое множество книг, статей и специализированных журналов, посвященных данной технологии. Любые современные IT-компании набирают специалистов именно со знанием объектно-ориентированной технологии. Очевидно, данная концепция пользуется гораздо большим спросом, чем классическое структурное программирование или же экспертные системы[47].
Технология ООП является по-настоящему революционной идеей, которая совершенно не похожа на что-либо известное в программировании ранее. ООП представляет собой новую эволюционную ступень, которая естественным образом вытекает из всей предшествующей истории программирования[48].
Можно выделить три основные причины, благодаря которым объектно-ориентированная технология получила массовое признание и широкую популярность:
- надежда на то, что ООП позволит быстро и просто привести к увеличению показателей надежности и продуктивности разработки, в результате чего будет решен кризис в программном обеспечении;
- желание реализации перехода от классических языков и технологий к принципиально новой концепции, открывающей большие возможности;
- сходство ООП с идеями, используемыми в других областях науки и деятельности[49].
Фактически, объектно-ориентированное программирование стало последним звеном в длинной цепочке решений, предложенных для разрешения «кризиса программного обеспечения». Само понятие кризиса говорит о том, что человеческий разум и воображение не всегда обладает возможностями для решения тех задач, которые необходимо решить при помощи вычислительных средств.
Место объектно-ориентированной технологии в рамках всех парадигм программирования изображено на рисунке 9[50].
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ
ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ
ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ
АССЕМБЛИРОВАНИЕ
МАШИННОЕ КОДИРОВАНИЕ
Рисунок 9 – Эволюция парадигм программирования
Несмотря на то что ООП действительно упрощает разработку сложных программных систем, важно отметить, что данная концепция не является универсальным средством, способным справиться с абсолютно любой задачей. Программирование по-прежнему является одной из наиболее сложных отраслей человеческой деятельности. Для того чтобы стать профессионалом в данной области необходимо наличие сразу нескольких качеств: интеллект, талант, способность к творчеству, логика, умение строить и использовать абстракции и т.п.[51]
ООП представляет собой новое понимание того, что принято называть вычислениями, а также того, как именно человек может структурировать информацию внутри компьютера[52].
Любой подход к программированию обладает собственной концепцией и требует своего собственного способа восприятия поставленной задачи. Принято выделять два основных понятия ООП:
- объект – некоторое явление или предмет, обладающий четко определяемым поведением. Объект характеризуется состоянием, поведением и индивидуальностью. Поведение и структура похожих объектов определяют для них общий класс. Другое название объекта – экземпляр класса. Состояние объекта определяется при помощи различных свойств этого объекта. Поведение характеризует воздействие объекта на другие объекты и наоборот относительно изменения состояния этих объектов и передачи сообщений. Индивидуальностью называется свойство объекта, которое отличает его на множестве всех остальных объектов;
- класс – множество объектов, обладающих общей структурой и поведением[53].
Концептуальной базой объектно-ориентированного подхода является объектная модель, в основу которой положены четыре принципа:
- абстрагирование – представляет собой определение отличительных характеристик некоторого объекта. Данные характеристики определяют концептуальные границы объекта с точки зрения стороннего наблюдателя. За счет абстракции концентрируется внимание на внешнем представлении объекта, отделяя особенности поведения от их реализации. Другое название принципа абстрагирования – принцип минимальных обязательств, согласно которого интерфейс объекта должен реализовывать только существенные моменты его поведения. Наряду с данным принципом рассматривается еще один принцип – наименьшего удивления, согласно которому абстракция должна полностью описывать поведение объекта, не порождая сюрпризов и побочных эффектов, выходящих за пределы абстракции;
- инкапсуляция – представляет собой процесс выделения отдельных элементов объекта, которые отвечают за его поведение и устройство. Инкапсуляция предназначена для изоляции контрактных обязательств, полученных на уровне абстракции, от их реализации. Инкапсуляция и абстракция дополняют друг друга. Центром абстракции является поведение объекта, в то время как в центре инкапсуляции расположена реализация данного поведения. В большинстве случаев инкапсуляция реализуется при помощи сокрытия информации – всех несущественных элементов объекта. Допускается скрывать не только структуру объекта, но и реализацию его поведения;
- полиморфизм – обозначение различных действий одним и тем же именем и свойство объекта обрабатывать посылаемые ему запросы согласно установленных типов. Благодаря данному принципу появляется возможность отказаться от операторов выбора, при этом связь метода и имени будет определяться только в ходе исполнения программы;
- наследование – принцип, благодаря которому можно создавать новые типы данных на основе уже имеющихся таким образом, что все данные и методы являются членами наследуемых классов[54].