Философия программирования. Технологии и парадигмы программирования. 1. Философия программирования ОБЩЕСИСТЕМНЫЕ ПРИНЦИПЫ СОЗДАНИЯ ПРОГРАММ При создании и развитии общесистемные принципы: ПО рекомендуется применять следующие принцип включения, который предусматривает, что требования к созданию, функционированию и развитию ПО определяются со стороны более сложной, включающей его в себя системы; принцип системного единства, который состоит в том, что на всех стадиях создания, функционирования и развития ПО его целостность будет обеспечиваться связями между подсистемами, а также функционированием подсистемы управления; принцип развития, который предусматривает в ПО возможность наращивания и совершенствования компонентов и связей между ними; его принцип комплексности, который заключается в том, что ПО обеспечивает связанность обработки информации, как отдельных элементов, так и для всего объема данных в целом на всех стадиях обработки; ОБЩЕСИСТЕМНЫЕ ПРИНЦИПЫ СОЗДАНИЯ ПРОГРАММ принцип информационного единства, то есть во всех подсистемах, средствах обеспечения и компонентах ПО используются единые термины, символы, условные обозначения и способы представления; принцип совместимости состоит в том, что язык, символы, коды и средства программного обеспечения согласованы, обеспечивают совместное функционирование всех подсистем и сохраняют открытой структуру системы в целом; принцип инвариантности определяет инвариантность подсистем и компонентов ПО к обрабатываемой информации, то есть являются универсальными или типовыми. 2. Технологии программирования Технологии программирования - это апробированные стратегии создания программ, которые излагаются в виде методик с информационными фондами, описаниями проектных процедур и проектных операций. Существуют: технология структурного программирования, технология проектирования программ с рациональной структурой данных, технология объектно-ориентированного программирования, технология визуального программирования. Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Цели структурного программирования: Повысить надежность программ Повысить эффективность программ Уменьшить время и стоимость программной разработки Улучшить читабельность программ Основные принципы структурной методологии: Принцип абстракции – этот принцип позволяет разработчику рассматривать программу в нужный момент без лишней детализации. Принцип формальности. Он предполагает строгий методический подход к программированию, придает творческому процессу определенную строгость и дисциплину. Принцип модульности. В соответствии с этим принципом программа разделяется на отдельные законченные фрагменты, модули, которые просты по управлению и допускают независимую отладку и тестирование. Принцип иерархического упорядочения. Взаимосвязь между программы должна носить иерархический, подчиненный характер. частями Реализации структурного стиля программирования: Структура информационного пространства. Задача разбивается на подзадачи, и таким образом выстраивается дерево вложенности подзадач. Информационное пространство структурируется в точном соответствии с деревом вложенности Структуры управления. Стиль структурного программирования предполагает использование строго ограниченного набора управляющих конструкций: последовательность операторов, условные и выбирающие операторы, все вычислительные ветви которых сходятся в одной точке программы, а также процедуры, вычисления которых всегда заканчиваются возвратом управления в точку вызова. К структурным операторам добавляются либо циклы, либо рекурсии. Концептуальное противоречие между циклами и рекурсиями намного мягче, чем между операторами структурного программирования и структурными переходами, и оно отмечается лишь в виде изредка встречающихся прагматических указаний не смешивать их произвольно. Реализации структурного стиля программирования: Потоки передачи данных. Разбивая задачу на подзадачи, программист предусматривает их взаимодействие по данным: одни подзадачи передают другим данные для переработки. Структуры данных. Данные объединяются в логически связанные фрагменты, соответствующие структурам задачи либо вспомогательных конструкций, вводимых для ее решения. Структурное программирование предполагает точно обозначенные управляющие структуры, программные блоки, отсутствие инструкций безусловного перехода (GOTO), автономные подпрограммы, поддержка рекурсии и локальных переменных. Суть такого подхода заключается в возможности разбиения программы на составляющие элементы. Объектно-ориентированное программирование (ООП) — это подход, при котором программа рассматривается как набор объектов, взаимодействующих друг с другом. У каждого есть свойства и поведение. ООП ускоряет написание кода и делает его более читаемым. Объектно-ориентированное программирование используется, чтобы: структурировать информацию и не допускать путаницы; точно определять взаимодействие одних элементов с другими; повышать управляемость программы; быстрее масштабировать код под различные задачи; лучше понимать написанное; эффективнее поддерживать готовые программы; внедрять изменения без необходимости переписывать весь код. Визуализация - это процесс графического отображения (построения) сложных процессов на экране компьютера в виде графических примитивов (графических фигур). Визуализировать можно абсолютно любые процессы: управления, построения, рисования и т.д. Визуальное программирование - способ создания приложений без написания программных кодов. Часто под визуальным программированием понимают технологию программирования, предоставляющую программисту наглядные средства конструирования интерфейса. При этом программист показывает, что должно получиться в результате, а текст программы генерируется автоматически с помощью визуального прототипа. При таком способе программирование осуществляется помещением специальные формы объектов и настройкой их свойств и поведения. на Объектно-ориентированное программирование удачно использует концепцию визуального программирования. Использование визуального проектирования интерфейса программисту (пользователю) следующие преимущества: предоставляет возможность легкого изменения размеров и расположения компонентов на форме (с помощью простых манипуляций мышью); в процессе проектирования постоянно виден результат – изображение формы и расположенных на ней компонентов (не надо запускать приложение для проверки внешнего вида окна и последующего изменения программного кода для подбора более удачного размера и расположения компонентов); во время проектирования формы и размещения на ней компонентов редактор кода (обычно) автоматически генерирует код программы, включая в нее фрагменты, описывающие данный компонент (далее можно изменять свойства компонентов и писать обработчики событий). Визуальное программирование делает проектирование интерфейса программы более наглядным и быстрым. При этом сохраняется возможность управлять всеми объектами и программно. В каждой из этих технологий используется одна или несколько парадигм программирования. Для каждой из них необходимы: свой тип мышления, особая школа обучения, приемы и способы программирования, определяемые используемым языком. 3. Парадигмы программирования Парадигмы программирования Парадигма программирования - это устоявшаяся система взглядов, определяющая стиль программирования, некоторый цельный набор идей и рекомендаций, определяющих стиль написания программ. Парадигмы программирования: - процедурная (императивная) - объектно-ориентированная - функциональная - логическая Процедурное программирование Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 1940-х годах. Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих процедуру решения задачи. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальной в императивном программировании. Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней. Примеры процедурных языков: FORTRAN, Pascal, C, Ada. Объектно-ориентированное программирование Объектно-ориентированное программирование (ООП) - это парадигма программирования, при использовании которой главными элементами программ являются объекты. В языках программирования понятие объекта реализовано как совокупность свойств, методов их обработки и событий, на которые данный объект может реагировать и, которые приводят, как правило, к изменению свойств объекта. Инкапсуляция - объединение данных и свойственных им процедур обработки в одном объекте. Класс (фундаментальное понятие парадигмы ООП) - это шаблон, на основе которого может быть создан конкретный программный объект, он описывает свойства и методы, определяющие поведение объектов этого класса. Каждый конкретный объект, имеющий структуру этого класса, называется экземпляром класса. Наследование предусматривает создание новых классов на базе существующих и позволяет классу-потомку иметь (наследовать) все свойства класса-родителя. Полиморфизм - возможность объектов с одинаковой спецификацией иметь различную реализацию (использовать различные методы обработки для разных объектов). Модульность: объекты заключают в себе полное определение их характеристик, никакие определения методов и свойств не должны располагаться вне его, это делает возможным свободное копирование и внедрение одного объекта в другие. Примеры объектно-ориентированных языков: C++, Java, Object Pascal, Python. Функциональное программирование Функциональное программирование - парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в их математическом понимании. Функциональное программирование - это способ составления программ, в которых единственным действием является вызов функции. Роль основной конструкции в функциональных языках играют выражения, к которым относятся скалярные константы, структурированные объекты, функции, тела функций и вызовы функций. Программа представляет собой совокупность описаний функций и выражения, которые необходимо вычислить. Вычисление выражения описывается как комбинация вызовов функций того же или более низкого уровня (часто рекурсивных). Каждая следующая функция в этой комбинации описывается аналогичным образом, до тех пор, пока описание не сведётся к предопределённым функциям, вычисление которых считается заданным. Функциональный стиль описывает математические отношения между данными и целью. Функциональное программирование основано на вычислении результатов функций в зависимости от исходных данных и результатов выполнения других функций и не предполагает явного хранения состояния программы (и переменных в памяти). Операторы присваивания отсутствуют (изменения состояния переменных не производится), вследствие чего переменные обозначают не области памяти, а объекты программы, что полностью соответствует понятию переменной в математике. Примеры функциональных языков: Lisp, Haskell, ML. Логическое программирование Логическое программирование - парадигма программирования, базирующаяся на автоматическом доказательстве теорем с использованием механизмов логического вывода информации на основе заданных фактов и правил вывода. Центральным понятием в логическом программировании является отношение. Программа представляет собой совокупность определений отношений между объектами и цели (запроса). При этом нужно только специфицировать факты, на которых основывается алгоритм, а не определять последовательность шагов, которые требуется выполнить. Программа строится из последовательности фактов и правил, затем формулируется утверждение, которое язык пытается доказать с помощью правил. Язык сам ищет решение с помощью методов поиска и сопоставления, которые в нем заложены. Логические программы не отличаются высоким быстродействием, так как процесс их выполнения сводится к построению прямых и обратных цепочек рассуждений разнообразными методами поиска. Примеры логических языков: Prolog, Planner, Popler, Mercury. Домашнее задание Выучить конспект лекции. Подготовиться к устному опросу.