Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Содержание
1 Лекция № 1. Программные средства автоматизации персонального компьютера. Технология программирования. Основные понятия и
подходы........................................................................................................ 4
2 Лекция № 2.Разработка сложных программных систем....................... 8
3 Лекция № 3. Жизненный цикл программного обеспечения................... 12
4 Лекция № 4. Быстрая разработка приложений. Технологичность программного обеспечения.................................................................................................... 16
5 Лекция № 5. Приемы обеспечения технологичности программных продуктов 20
6 Лекция № 6. Структурное и «неструктурное» программирование....... 24
7 Лекция № 7. Определение требований к программному обеспечению и исходных данных для его проектирования................................................................... 28
8 Лекция № 8. Принципиальные решения начальных этапов
проектирования............................................................................................. 32
9 Лекция № 9. Алгоритмические языки и предъявляемые к ним
требования..................................................................................................... 36
10 Лекция № 10. Структурный подход. Анализ требований, определение спецификаций................................................................................................. 38
11 Лекция № 11. Структурный подход. Проектирование программного обеспечения 42
12 Лекция № 12. Объектный подход. Проектирование программного обеспечения 46
13 Лекция № 13. Пользовательские интерфейсы......................................... 49
14 Лекция № 14. Особенности разработки пользовательских интерфейсов 53
15 Лекция № 15. Компоненты пользовательских интерфейсов.
Технология Drag&Drop................................................................................ 57
16 Лекция № 16. Тестирование и отладка программных продуктов......... 61
17 Лекция № 17. Составление программной документации....................... 65
Приложение А............................................................................................... 67
Приложение Б................................................................................................ 69
Приложение В................................................................................................ 70
Приложение Г................................................................................................ 71
Список литературы....................................................................................... 73
Лекция №1. Программные средства автоматизации персонального компьютера. Технология программирования. Основные понятия и подходы
Содержание лекции: понятие о программном обеспечении компьютера; технология программирования; основные этапы развития.
Цель лекции: получить представление о современном состоянии программного обеспечения; изучить основные понятия и подходы технологии программирования; получить представление о структурном, модульном, объектном и визуальном программировании.
Программным обеспечением называютсовокупность программ, позволяющих осуществить на компьютере автоматизированную обработку информации. Согласно современным тенденциям программное обеспечение классифицируется как системное (общее) и прикладное (специальное). Создание программной системы – задача весьма трудоемкая, особенно когда обычный объем программ превышает сотни тысяч операторов. Специалист в области разработки программного обеспечения должен иметь представление о методах анализа, проектирования, реализации и тестирования программных систем, а также ориентироваться в существующих подходах и технологиях.
Технологией программирования называют совокупность методов и средств, используемых в процессе разработки программного обеспечения. Она представляет собой набор технологических инструкций, включающих: указание последовательности выполнения технологических операций; перечисление условий, при которых выполняются операции; описания самих операций с определением исходных данных, результатов, инструкций, нормативов, стандартов, критериев и методов оценки. Кроме того, технология определяет способ описания проектируемой системы (модели), используемой на конкретном этапе разработки. Различают технологии, используемые на конкретных этапах разработки (в основе лежит ограниченно применимый метод) и технологии, охватывающие несколько этапов разработки (в основе лежит базовый метод или методология). Среди основных этапов развития технологий программирования выделяют «стихийное» программирование, структурный, объектный и компонентный подходы к программированию [1].
На этапе «стихийного» программирования (период от момента появления первых ЭВМ до середины 60-х годов XX века) практически отсутствовали сформулированные технологии, а программирование было искусством. Первые программы имели простейшую структуру: программа на машинном языке и обрабатываемые данные. Сложность программ в машинных кодах ограничивалась способностью программиста одновременно мысленно отслеживать последовательность выполняемых операций и местонахождение данных при программировании. В результате появления ассемблеров вместо двоичных кодов стали использовать символические имена данны х и мнемоники кодов операций, а программы стали более «читаемыми». Создание языков программирования высокого уровня (FORTRAN, ALGOL) существенно упростило программирование вычислений, снизив уровень детализации операций, что позволило увеличить сложность программ.
В результате появления средств, позволяющих оперировать подпрограммами, были созданы огромные библиотеки расчетных и служебных подпрограмм. Типичная программа состояла из основной программы, области глобальных данных и набора подпрограмм, однако при увеличении количества подпрограмм возрастала вероятность искажения части глобальных данных какой-либо подпрограммой, поэтому было предложено размещать в них локальные данные (рисунок 1.1), а появление новых средств поддержки подпрограмм позволило разрабатывать программное обеспечение нескольким программистам параллельно.
Рисунок 1.1 - Архитектура программы: а) с глобальной областью данных; б) использующей подпрограммы с локальными данными
В начале 60-х годов XX века разразился «кризис программирования»: разработчики сложного программного обеспечения срывали все сроки завершения проектов: проект устаревал раньше, чем был готов к внедрению, его стоимость увеличивалась, в результате многие проекты так никогда и не были завершены. Все это было вызвано несовершенством технологии программирования. Прежде всего, использовалась разработка «снизу-вверх». В отсутствии четких моделей описания подпрограмм и методов проектирования, создание подпрограмм превращалось в непростую задачу. Интерфейсы подпрограмм получались сложными, и при сборке программного продукта выявлялось большое количество ошибок согласования, исправление которых требовало серьезного изменения уже разработанных подпрограмм, при этом в программу часто вносились новые ошибки. В итоге процесс тестирования и отладки программ занимал более 80% времени разработки, если вообще когда-нибудь заканчивался. Анализ причин возникновения ошибок позволил сформулировать новый подход к программированию - структурный.
Структурный подход к программированию, который развивался на втором этапе развития технологий в 60-70 годы XX века, представляет собой совокупность рекомендуемых технологических приемов, охватывающих выполнение всех этапов разработки программного обеспечения. В его основе лежит декомпозиция сложных систем с целью последующей реализации в виде отдельных небольших (до 40-50 операторов) подпрограмм, позже названная процедурной декомпозицией. Структурный подход требовал представления задачи в виде иерархии подзадач простейшей структуры, а проектирование осуществлялось «сверху-вниз» и подразумевало реализацию общей идеи. Были введены ограничения на конструкции алгоритмов, рекомендованы формальные модели их описания, а также специальный метод проектирования алгоритмов - метод пошаговой детализации. Принципы структурного программирования были заложены в основу процедурных языков программирования, которые включали основные «структурные» операторы передачи управления, поддерживали вложение подпрограмм, локализацию и ограничение области «видимости» данных (PL/1, ALGOL-68, Pascal, С). Дальнейший рост сложности и размеров разрабатываемого программного обеспечения потребовал развития структурирования данных, в языках появляется возможность определения пользовательских типов данных [2].
Стремление разграничить доступ к глобальным данным программы дало толчок к появлению и развитию технологии модульного программирования (рисунок А.1), что предполагало выделение групп подпрограмм, использующих одни и те же глобальные данные в отдельно компилируемые модули (библиотеки). Связи между модулями осуществлялись через специальный интерфейс, в то время как доступ к реализации модуля (телам подпрограмм и некоторым «внутренним» переменным) был запрещен. Эту технологию поддерживают современные версии Pascal, С, C++, Ада и Modula. Разработка программ несколькими программистами существенно упростилась: модули разрабатывались независимо друг от друга и могли использоваться без изменений в других разработках, а их взаимодействие обеспечивалось через специально оговоренные межмодульные интерфейсы. Структурный подход в сочетании с модульным программированием позволяет получать надежные программы, размером не более 100 000 операторов. Недостаток: ошибка в интерфейсе при вызове подпрограммы выявляется только при выполнении программы (из-за раздельной компиляции модулей), а при увеличении размера программы возрастает сложность межмодульных интерфейсов, поэтому предусмотреть взаимовлияние отдельных частей программы становится практически невозможно. Для разработки программного обеспечения большого объема было предложено использовать объектный подход.
На третьем этапе (80-е - 90-е годы XX века) был сформирован объектный подход к программированию.Технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности взаимодействующих путем передачи сообщений программных объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию с наследованием свойств, была названа объектно-ориентированным программированием (рисунок А.2). Объектная структура программы впервые была использована в языке имитационного моделирова-ния сложных систем Simula, а затем использована в новых версиях универсальных языков программирования, таких как Pascal, C++, Modula, Java. Достоинством объектно-ориентированного программирования является «естественная» декомпозиция программного обеспечения, существенно облегчающая разработку. Это приводит к более полной локализации данных и интегрированию их с подпрограммами обработки, что позволяет вести практически независимую разработку отдельных объектов программы. Кроме того, объектный подход предлагает новые способы организации программ, основанные на механизмах наследования, полиморфизма, композиции, наполнения, позволяющих конструировать из простых объектов сложные. В результате существенно увеличивается показатель повторного использования кодов и появляется возможность создания библиотек классов. На основе объектного подхода были созданы среды, поддерживающие визуальное программирование (Delphi, C++ Builder, Visual C++), при использовании которого некоторая часть будущего продукта проектируется с применением визуальных средств добавления и настройки специальных библиотечных компонентов. В результате появляется заготовка будущей программы, в которую уже внесены коды. Использование объектного подхода имеет много преимуществ, однако его конкретная реализация в объектно-ориентированных языках программирования, таких, как Pascal и C++, имеет существенные недостатки: отсутствуют стандарты компоновки двоичных результатов компиляции объектов в единое целое даже в пределах одного языка программирования; изменение в реализации одного программного объекта связано с перекомпиляцией модуля и перекомпоновкой всего программного обеспечения, использующего данный объект. Таким образом, сохраняется объективная зависимость модулей программного обеспечения от адресов экспортируемых полей и методов, а также структур и форматов данных. Связи модулей нельзя разорвать, но можно стандартизировать их взаимодействие, на чем и основан компонентный подход к программированию.
Четвертый этап (90-е годы XX века - наше время) - компонентный подход иCASE-технологии. Компонентный подход предполагает построение программного обеспечения из отдельных компонентов, которые взаимодействуют между собой через стандартизованные двоичные интерфейсы. В отличие от обычных объектов объекты-компоненты можно собрать в динамически вызываемые библиотеки или исполняемые файлы, распространять в двоичном виде (без исходных текстов) и использовать в любом языке программирования, поддерживающем соответствующую технологию[1]. Компонентный подход лежит в основе технологий, разработанных на базе COM (Component Object Model - компонентная модель объектов, и технологии создания распределенных приложений CORBA (Common Object Request Broker Architecture - общая архитектура с посредником обработки запросов объектов), которые используют сходные принципы и различаются лишь особенностями реализации.
Дополнительную информацию по теме можно получить в [1, 2, 3, 5, 19].
Лекция № 2. Разработка сложных программных систем
Содержание лекции: обзор современных технологий программирования; разработка сложных программных систем.
Цель лекции: получить представление о технологиях COM, CORBA, CASE; выявить проблемы разработки сложных систем; рассмотреть блочно-иерархический подход к их созданию.
Среди современных технологий программирования по праву считаются лидерами технологии COM, CORBA и CASE.
Технология СОМ фирмы Microsoft является развитием технологии OLE I (Object Linking and Embedding - связывание и внедрение объектов), которая использовалась в ранних версиях Windows для создания составных документов. Она определяет общую концепцию взаимодействия программ любых типов (библиотек, приложений, операционной системы), т. е. позволяет одной части программного обеспечения использовать функции (службы), предоставляемые другой (рисунок А3). Модификация СОМ, обеспечивающая передачу вызовов между компьютерами, называется DCOM (Distributed COM - распределенная СОМ). Приложение предоставляет свои службы, используя специальные объекты - объекты СОМ (экземпляры классовСОМ). Объект СОМ включает поля и методы, но в отличие от обычных, каждый объект СОМ может реализовывать несколько интерфейсов, обеспечивающих доступ к его полям и функциям за счет организации отдельной таблицы адресов методов для каждого интерфейса. Классы СОМ поддерживают наследование интерфейсов, но не поддерживают наследования реализации, т. е. не наследуют код методов. Объект всегда функционирует в составе сервера - динамической библиотеки или исполняемого файла, которые обеспечивают функционирование объекта. Различают три типа серверов: внутренний, локальный и удаленный (например, MS Word является локальным сервером). Для обращения к службам клиент должен получить указатель на соответствующий интерфейс. Взаимодействие клиента и сервера обеспечивается базовыми механизмами СОМ или DCOM, поэтому клиенту безразлично местонахождение объекта. При использовании локальных и удаленных серверов в адресном пространстве клиента создается proxy-объект - заместитель объекта СОМ, а в адресном пространстве сервера СОМ-заглушка, соответствующая клиенту. Получив задание от клиента, заместитель упаковывает его параметры и, используя службы операционной системы, передает вызов заглушке. Заглушка распаковывает задание и передает его объекту СОМ. Результат возвращается клиенту в обратном порядке. На базе технологии СОМ и ее распределенной версии DCOM были разработаны компонентные технологии, решающие различные задачи разработки программного обеспечения [1]. К технологиям, реализующим компонентный подход, заложенный в СОМ, относятся:
OLE-automation - технология создания программируемых приложений, обеспечивающая программируемый доступ к их внутренним службам (например, MS Excel поддерживает ее, предоставляя другим приложениям свои службы);
ActiveX - технология, построенная на базе OLE-automation и предназначенная для создания как сосредоточенного на одном компьютере программного обеспечения, так и распределенного в сети. Предполагает использование визуального программирования для создания компонентов - элементов управления ActiveX, которые устанавливаются на компьютер дистанционно с удаленного сервера и применяются в клиентских частях приложений Интернет. Преимуществами технологии ActiveX являются: быстрое написание кода; открытость и мобильность; возможность написания приложений с использованием знакомых средств разработки (Visual Basic, Visual C++, Borland Delphi, Borland C++, Java); большое количество существующих бесплатных программных элементов ActiveX; стандартность;
MTS (Microsoft Transaction Server - сервер управления транзакциями) - технология, обеспечивающая безопасность и стабильную работу распределенных приложений при больших объемах передаваемых данных;
MIDAS (Multitier Distributed Application Server - сервер многозвенных распределенных приложений) - технология, организующая доступ к данным разных компьютеров с учетом балансировки нагрузки сети.
Технология CORBA, разработанная группой компаний OMG (Object Management Group - группа внедрения объектной технологии программирования), реализует подход аналогичный СОМ, на базе объектов и интерфейсов CORBA. Программное ядро CORBA реализовано для всех основных аппаратных и программных платформ, и потому технологию можно использовать для создания распределенного программного обеспечения в разнородной вычислительной среде. Организация взаимодействия между объектами клиента и сервера в CORBA осуществляется с помощью посредника (VisiBroker) и специализированного программного обеспечения.
Отличительной особенностью современного этапа развития технологии программирования, кроме изменения подхода, является создание и внедрение автоматизированных технологий разработки и сопровождения программного обеспечения, которые были названы CASE-технологиями (Computer-Aided Software/System Engineering - разработка программного обеспечения/программных систем с использованием компьютерной поддержки). Без средств автоматизации разработка достаточно сложного программного обеспечения на настоящий момент становится трудно осуществимой: память человека уже не в состоянии фиксировать все детали, которые необходимо учитывать при разработке программного обеспечения. CASE-технологии поддерживают как структурный, так и объектный (компонентный) подходы к программированию [5].
Большинство современных программных систем являются достаточно сложными. Эта сложность обуславливается многими причинами, главной из которых является логическая сложность решаемых ими задач. Раньше компьютеры применяли в очень узких областях науки и техники, в первую очередь там, где задачи были хорошо детерминированы и требовали значительных вычислений. Сейчас, когда созданы мощные компьютерные сети, появилась возможность переложить на них решение сложных ресурсоемких задач, о компьютеризации которых раньше не задумывались. В процесс компьютеризации вовлекаются новые предметные области, а для освоенных областей усложняются уже сложившиеся постановки задач. Сложность разработки программных систем увеличивается за счет сложности формального определения требований к этим системам, отсутствия удовлетворительных средств описания поведения дискретных систем с большим числом состояний при недетерминированной последовательности входных воздействий, коллективной разработки, необходимости увеличения степени повторяемости кодов. Однако все эти факторы напрямую связаны со сложностью объекта разработки - программной системы [4].
Подавляющее большинство сложных систем, как в природе, так и в технике имеет иерархическую внутреннюю структуру. Связи элементов сложных систем различны как по типу, так и по силе, что и позволяет рассматривать эти системы как некоторую совокупность взаимозависимых подсистем. Внутренние связи элементов таких подсистем сильнее, чем связи между подсистемами. Например, компьютер состоит из процессора, памяти и внешних устройств, а Солнечная система включает Солнце и планеты, вращающиеся вокруг него. Используя то же различие связей, каждую подсистему можно аналогично разделить на подсистемы до «элементарного» уровня, причем выбор уровня, компоненты которого следует считать элементарными, остается за исследователем. На элементарном уровне система, состоит из немногих типов подсистем, по-разному скомбинированных и организованных. Иерархии такого типа получили название «целое-часть».
В природе существует еще один вид иерархии - иерархия «простое-сложное» или иерархия развития (усложнения) систем в процессе эволюции. В этой иерархии любая функционирующая система является результатом развития более простой системы. Именно этот вид иерархии реализуется механизмом наследования объектно-ориентированного программирования.
Будучи отражением природных и технических систем, программные системы являются иерархическими и обладают описанными выше свойствами. На этих свойствах иерархических систем строится блочно-иерархический подход к их исследованию или созданию, предполагающий сначала создание частей объекта (блоков и модулей), а затем сборку из них самого объекта.
Процесс разбиения сложного объекта на сравнительно независимые части получил название декомпозиции. При декомпозиции учитывают, что связи между отдельными частями должны быть слабее, чем связи элементов внутри частей. Чтобы из полученных частей можно было собрать разрабатываемый объект, в процессе декомпозиции необходимо определить все виды связей частей между собой. При создании сложных объектов процесс декомпозиции выполняется многократно: каждый блок, в свою очередь, декомпозируют на части, пока не получают блоки, которые сравнительно легко разработать. Этот метод разработки получил название пошаговой детализации. В процессе декомпозиции стараются выделить аналогичные блоки, которые можно было бы разрабатывать на общей основе. Таким образом, обеспечивают увеличение степени повторяемости кодов и, соответственно, снижение стоимости разработки. Результат декомпозиции обычно представляют в виде схемы иерархии, на нижнем уровне которой располагают сравнительно простые блоки, а на верхнем - объект, подлежащий разработке. На каждом иерархическом уровне описание блоков выполняют с определенной степенью детализации, абстрагируясь от несущественных деталей. Как правило, для объекта в целом, удается сформулировать лишь общие требования, а блоки нижнего уровня должны быть специфицированы таким образом, чтобы из них действительно можно было собрать работающий объект. Другими словами, чем больше блок, тем более абстрактным должно быть его описание (рисунок А.4). При соблюдении этого принципа разработчик сохраняет возможность осмысления проекта и принимает наиболее правильные решения на каждом этапе, что называют локальной оптимизацией (в отличие от глобальной оптимизации характеристик объектов, которая для действительно сложных объектов не всегда возможна).
Итак, в основе блочно-иерархического подхода лежат иерархическое упорядочение и декомпозиция. Важную роль играют следующие принципы:
а) непротиворечивость - контроль согласованности элементов;
б) полнота - контроль на присутствие лишних элементов;
в) формализация - строгость методического подхода;
г) повторяемость - необходимость выделения одинаковых блоков для
удешевления и ускорения разработки;
д) локальная оптимизация - оптимизация в пределах уровня иерархии.
Совокупность языков моделей, постановок задач, методов описаний некоторого иерархического уровня принято называть уровнем проектирования. Различные взгляды на объект проектирования принято называть аспектами проектирования. Достоинства блочно-иерархического подхода: возможность создания сложных систем; упрощение проверки работоспособности отдельных блоков и системы в целом; обеспечение возможности модернизации систем. Использование блочно-иерархического подхода применительно к программным системам стало возможным только после конкретизации общих положений подхода и внесения изменений в процесс проектирования. При этом структурный подход учитывает только свойства иерархии «целое-часть», а объектный дополнительно использует свойства иерархии «простое-сложное».
Дополнительную информацию по теме можно получить в [1, 4, 5, 10].
Дата публикования: 2014-11-28; Прочитано: 3218 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!