52417792 Визуальное программирование (конспекты лекций) Объектно-ориентированная методология разработки больших программных комплек- Лекция № 1 сов I. Парадигмы программирования Парадигма– в методологии науки – совокупность ценностей, методов, технических навыков и средств, принятых в научном сообществе в рамках устоявшейся научной традиции в определенный период времени. Парадигма программирования — это парадигма, определяющая стиль программирования, иначе говоря — некоторый цельный набор идей и рекомендаций, определяющих стиль написания программ. Парадигма программирования представляет (и определяет) то, как программист видит выполнение программы. Например, в объектно-ориентированном программировании программист рассматривает программу как набор взаимодействующих объектов, тогда как в функциональном программировании программа представляется в виде цепочки вычисления функций. Рассмотрим одну из классификаций языков программирования. Классификация языков программирования Программирование Процедурное Операциональное ---------------------------------------------------(Ассемблеры, Фортран, Бейсик, СИ) Непроцедурное Структурное ------------------------------------------(Паскаль, Модула) Объектное -----------------------------------------------(Smalltalk, C++, Delphi, Java) Декларативное Логическое ------------------------(Пролог) Функкциональное -------------------------(Лисп) Классическое операциональное и/или процедурное программирование требует от программиста детального описания того, как решать задачу, т.е. формулировки алгоритма и его специальной записи. При этом ожидаемые свойства результата обычно не указываются. Основные понятия языков этих групп – оператор и данные. При процедурном подходе операторы объединяются в группы – процедуры. Структурное программирование в целом не выходит за рамки этого направления, оно лишь дополнительно фиксирует некоторые полезные приемы технологии программирования. Дейкстра дал следующее определение: “Структурное программирование – это дисциплина, которую программист навязывает сам себе”. Принципиально иное направление в программировании связано с методологиями (парадигмами) непроцедурного программирования. К ним можно отнести объектно-ориентированное и декларативное программирование. 1 52417792 При использовании декларативного языка программист указывает исходные информационные структуры, взаимосвязи между ними и то, какими свойствами должен обладать результат. При этом алгоритм получения результата программист не строит (по крайней мере в идеале). В этих языках отсутствует понятие «оператор». В декларативных языках можно выделить логические и функциональные языки. Структурное и объектно-ориентированное программирование строятся на декомпозиции. Декомпози́ция — научный метод, использующий структуру задачи и позволяющий заменить решение одной большой задачи решением серии меньших задач. Эдсгер Дейкстра1 отмечал, "Способ управления сложными системами был известен еще в древности - divide et impera (разделяй и властвуй)"2. При проектировании сложной программной системы необходимо разделять ее на все меньшие и меньшие подсистемы, каждую из которых можно совершенствовать независимо. В этом случае не будет превышения пропускной способности человеческого мозга: для понимания любого уровня системы необходимо одновременно держать в уме информацию лишь о немногих ее частях, а не обо всех. Сложностью программирования системы вынуждает делить её на части, выполнять декомпозицию. В основе структурного программирования лежит алгоритмическая декомпозиция. Можно воспринимать декомпозицию как обычное разделение алгоритмов, где каждый модуль системы выполняет один из этапов общего процесса. ЗАДАЧА ПОДЗАДАЧА 1 ПОДЗАДАЧА 1.1 II. ПОДЗАДАЧА 1.2 ПОДЗАДАЧА 2 ПОДЗАДАЧА 1.3 ПОДЗАДАЧА 2.1 ПОДЗАДАЧА 2.2 Объектно-ориентированная методология разработки программ В объектно-ориентированной декомпозиции разделение задачи идет не по алгоритмам, а по объектам, использующимся в процессе решения задачи. Каждый выделяемый объект предметной области отвечает за выполнение некоторых действий, зависящих от полученных сообщений и параметров самого объекта. По определению Гради Буча3: “Объектно-ориентированное программирование (ООП) – это методология программирования, которая основана на представлении программы в виде совокупноЭ́дсгер Ви́бе Де́йкстра (нидерл. Edsger Wybe Dijkstra; 11.05.1930—6.08. 2002) — выдающийся нидерландский учёный, идеи которого оказали огромное влияние на развитие компьютерной индустрии. 2 [16] Dijktra, E. 1979. Programming Considered as a Human Activity. Classics in Software Engineering. New York, NY: Yourdon Press, p.5. 3 Гради Буч (Grady Booch), главный исследователь корпорации Rational Software, признан всем международным сообществом разработчиков программного обеспечения благодаря его основополагающим работам в области объектноориентированных методов и приложений. 1 2 52417792 сти объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости”. Объектная декомпозиция уменьшает размер программных систем за счет повторного использования общих механизмов. Объектно-ориентированные системы более гибки и проще эволюционируют со временем, потому что их схемы базируется на устойчивых промежуточных формах История объектно-ориентированного программирования берет свое начало в конце 60-х годов. Компьютерный центр в Норвегии создал первый объектно-ориентированный язык программирования Simula, предназначенный для моделирования ситуаций в реальном мире. Основная особенность языка Simula состояла в том, что программа была организована по объектам программирования. Объекты содержат инструкции (называемые методами) и данные (называемые переменными), которые определяют поведение объекта. В процессе моделирования объект выполняет свое стандартное поведение и, в случае необходимости, изменяет данные для отражения влияния назначенного ему действия. Существует достаточно много объектно-ориентированных языков программирования, наиболее популярными из которых в настоящее время являются C++, Delphi, Java, Visual Basic. Визуальное программирование дополнительно предоставляет широкие возможности использования прототипов объектов (классы), которые можно настроить по своему усмотрению. В среде Delphi реализована новая характеристика (помимо инкапсуляции, полиморфизма и наследования) объекта – возможность обработки так называемых сообщений (или событий), получаемых от ОС Windows или самой программы. Этот принцип лежит в основе работы всех визуальных компонентов Delphi, которые обрабатывают различные события, возникающие в процессе выполнения программы. Событие представляет собой некоторое действие, которое активизирует стандартную реакцию объекта. В качестве события могут рассматриваться нажатие кнопки мыши, выбор пункта меню, открытие таблицы и т.д. Порядок выполнения действий определяется, прежде всего, событиями, возникающими в системе, и реакцией на них объектов. Объекты, которые нужны при создании различных приложений, могут неоднократно использоваться без расходования времени на их программирование. Имеется четкое разграничение между понятиями объекта и класса. Класс – это тип данных (например, Real или String), а объект – конкретный существующий в памяти компьютера экземпляр класса, переменная соответствующего типа. Класс это структурный тип данных, который включает описание полей данных, а также процедур и функций, работающих с этими полями данных. Применительно к классам такие процедуры и функции получили название методов. Классы имеют поля (как тип данных record), свойства (напоминают поля, но имеют дополнительные описатели, определяющие механизмы записи и считывания данных, что позволяет повысить 3 52417792 строгость декларирования внутренней структуры класса) и методы (подпрограммы, которые обрабатывают поля и свойства класса. Когда описывается переменная типа class, для ее полей и свойств в памяти выделяется соответствующий объем (как и для записей), но машинный код, в который транслируются методы класса, находится в единственном экземпляре, так как меняться он не может, хранить несколько одинаковых копий подпрограмм не имеет смысла. Когда объект создается, однократно вызывается специальный метод называемый конструктором. В нем выполняются различные действия по начальной инициализации полей объекта. Когда объект уничтожается (удаляется из памяти), вызывается другой метод – деструктор, который выполняет дополнительные действия по освобождению памяти, если это необходимо. Вызов конструктора и деструктора происходит автоматически. Переменная, описанная как класс, фактически является указателем на экземпляр класса. Это сделано для повышения эффективности работы с ним. Однако при использовании таких переменных применять операции работы с указателями (^, @) не надо. К ним обращаются как к обычным переменным, а к членам класса (полям, свойствам и методам) как к полям записи. Этапы реализации объектно-ориентированного подхода: - анализ предметной области задачи (выполняется объектная декомпозиция системы и определяются основные особенности поведения объектов, результаты представляют в виде диаграмм объектов); - проектирование системы o логическое проектирование (разработка структуры классов: определение полей и алгоритмов методов); o физическое проектирование (объединение описаний классов в модули, определение способов взаимодействия с оборудованием, ОС, другим ПО); - эволюция системы (поэтапная реализация классов и подключение объектов к системе, начиная с создания проекта будущего приложения); - модификация (добавление новых функциональных возможностей или изменение суще- ствующих свойств системы). III. Инкапсуляция, наследование и полиморфизм Объектно-ориентированное программирование обладает следующими характеристиками (по- мимо обработки событий), которые особенно полезны при создании тиражируемых и простых в сопровождении приложений: инкапсуляция; наследование; подклассы; полиморфизм. Инкапсуляция. Объект объединяет в себе методы и свойства объекта, которые не могут существовать отдельно от него. При удалении объекта удаляются его свойства и связанные с ним методы. При копирова4 52417792 нии объект копируется как одно целое. Эта характеристика объектно-ориентированного программирования называется инкапсуляцией. Наследование и подклассы. Все объекты создаются на основе классов и наследуют свойства и методы классов. Классы могут создаваться на основе других классов. Такие классы называют подклассами. Они наследуют все свойства и методы родительского класса. Дополнительно для подкласса можно определить новые свойства и методы. Изменение свойств и методов родительского класса отслеживается в подклассах, созданных на основе этого класса, а также в объектах, созданных на основе подклассов. Полиморфизм. Полиморфизм в языках программирования — взаимозаменяемость объектов с одинаковым интерфейсом. Класс-потомок наследует прототипы методов класса-родителя, но реализация этих методов может быть другой, соответствующей специфике класса-потомка. При процедурном программировании имя вызываемой подпрограммы, процедуры или функции однозначно определяет выполняемый код. В объектно-ориентированном программировании можно использовать одни и те же имена методов для выполнения разных действий. Выполняемое действие зависит от типа объекта, к которому применяется данный метод. IV. Переменные объектных типов Переменные объектных типов – экземпляры объектов – так же, как и записи представляют со- бой комбинированные структуры данных. Описание переменных объектного типа выполняется аналогично описаниям переменных типа “запись”. Первым синтаксическим отличием описания объектов от записей является использование ключевого слова object вместо ключевого слова record. Второе отличие объекта от записи состоит в том, что объект может включать действия, оформленные в виде процедур и функций, которые в данном случае называются методами. Тип объект - это структура, состоящая из фиксированного числа компонент. Каждая компонента - это или поле, которое содержит данные определенного типа, или метод, который производит операции над объектом. Аналогично объявлению переменных, объявление поля, указывает тип данных поля и идентификатор имени этого поля; и аналогично объявлению процедуры или функции объявление метода указывает заголовок процедуры, функции. Сфера действия типа объекта состоит из него самого и всех его порожденных типов. В отличие от других типов, тип объект может быть объявлен в части объявления типов в самой внешней части программы или модуля. Тип объекта не может быть объявлен в части объявления переменных или внутри процедуры, функции или метода. Чтобы ОО-методология работала четко, требуется, чтобы объекты сами выполняли все действия с помощью своих методов. Прямое обращение к полям объектов желательно исключить. Для любого действия, выполняемого над информационными полями объекта, должен быть написан отдельный метод. 5 52417792 Аналогично записям к полям переменных объектных типов разрешается обращаться как с помощью уточненных идентификаторов, так и с помощью оператора with. В разделе типов при описании объектных типов указываются только заголовки методов. Полное же описание методов – их тело – указывается в разделе объявления процедур и функций. V. Введение в визуальное программирование Визуализация - это процесс графического отображения (построения) сложных процессов на экране компьютера в виде графических примитивов (графических фигур). Визуализировать можно абсолютно любые процессы: управления, построения, рисования и т.д. Визуальное программирование - способ создания приложений без написания программных кодов. Часто под визуальным программированием понимают технологию программирования, предоставляющую программисту наглядные средства конструирования интерфейса. При этом программист показывает, что должно получиться в результате, а текст программы генерируется автоматически с помощью визуального прототипа. При таком способе программирование осуществляется помещением на специальные формы объектов и настройкой их свойств и поведения. Объектно-ориентированное программирование удачно использует концепцию визуального программирования. Для визуализации интерфейсов программного обеспечения существует целый ряд специально разработанных элементов интерфейса - визуальных компонент, позволяющих отображать различную информацию и осуществлять управление программой в целом. Простейший пример - визуальная кнопка на экране компьютера. Данная кнопка имитирует поведение обычной кнопки на пульте управления любого прибора. Ее можно "нажимать" как настоящую. Визуализируемой моделью в Visual Basic и Delphi является окно (форма, диалог) Windows, а не код программы. В настоящее время распространено большое количество систем визуального программирования. Это системы программирования для языков C++ (фирм Borland, Microsoft, Symantec), Basic (фирмы Microsoft), Pascal/Delphi (фирмы Borland). Кроме языков программирования, визуальный подход используется и в других системах (Visual FoxPro, Paradox для Windows, программы пакета Microsoft Office). Использование визуального проектирования интерфейса предоставляет программисту (пользователю) следующие преимущества: - возможность легкого изменения размеров и расположения компонентов на форме (с помощью простых манипуляций мышью); - в процессе проектирования постоянно виден результат – изображение формы и распо- ложенных на ней компонентов (не надо запускать приложение для проверки внешнего вида окна и последующего изменения программного кода для подбора более удачного размера и расположения компонентов); 6 52417792 - во время проектирования формы и размещения на ней компонентов редактор кода (обычно) автоматически генерирует код программы, включая в нее фрагменты, описывающие данный компонент (далее можно изменять свойства компонентов и писать обработчики событий). Визуальное проектирование интерфейса приложения состоит из следующих этапов: - размещение нужных компонентов на форме; - задание определенных свойств этих компонентов; - написание, при необходимости, обработчиков событий. Таким образом, визуальное программирование делает проектирование интерфейса программы более наглядным и быстрым. При этом сохраняется возможность управлять всеми объектами и программно. 7