
- •Цель и задача курса. Характеристики качества по.
- •1.2. Эволюция технологий программирования.
- •1.3. Структурный подход к программированию
- •1.4. Основания и история объектно-ориентированного подхода к программированию
- •1.5. Сложность по
- •1.6. Пути ограничения сложности
- •1.7. Основные положения объектной модели
- •1) Абстрагирование является одним из главных способов, используемых для решения сложных задач.
- •2) Ограничение доступа (инкапсуляция).
- •3) Модульность.
- •4)Иерархия.
- •Варианты использования (прецеденты)
- •2.3. Диаграммы вариантов использования
- •Пример диаграммы ви для финансовой торговой системы:
- •Связи типа «расширение» и «использование». Кроме связей между действующими лицами и ви на диаграмме существуют 2 других типа связей. Это связи типа «расширение» и «использование».
- •2.4. Диаграммы классов. Общая характеристика
- •2.4.1 Ассоциации
1.2. Эволюция технологий программирования.
С момента появления первых компьютеров разработка ПО прошла большой путь от простейших программ на машинном языке до осознания того, что именно технология разработки ПО определяет прогресс в вычислительной технике. По мере совершенствования аппаратуры возрастало значение ПО. Важнейший прорыв произошел в конце 50-х годов, когда появились языки программирования высокого уровня (Фортран, Алгол и др.). Появление этих языков было вызвано тем, что написание программ без них становилось все более сложной задачей. Эти языки ускорили и упростили процесс программирования и существенно расширили круг задач, которые стали решаться с помощью ЭВМ. Новые более сложные задачи, привели к тому, что имеющихся средств снова стало недостаточно для их решения.
Таким образом, каждое новое достижение в аппаратном либо в программном обеспечении приводит к попыткам расширить сферу применения ЭВМ, тем самым ставит новые задачи, для решения которых нужны новые возможности.
Языки этого поколения (Фортран, Алгол, PL/1) являются процедурными и поддерживают процедурный стиль программирования. Программа разрабатывается в терминах тех действий, которые она выполняет. Основной единицей программы является процедура. Процедуры вызывают другие процедуры, все вместе они работают по определенному алгоритму, который ведет к решению задачи.
Ключевые понятия процедурного программирования – понятия структуры данных, оператора и процедуры (функции) как основной семантической единицы программы. Данные, объединенные в структуры, обрабатываются различными процедурами, а совокупности семантически связанных между собой процедур объединяются в программные модули.
С помощью таких языков решались в основном вычислительные задачи. Основными пользователями ЭВМ были физики, математики и инженеры.
Применение ЭВМ для решения задач искусственного интеллекта и обработки текстов привело к созданию функциональных языков, в частности языка Лисп. Функциональное программирование представляет собой подход, при котором алгоритм описывается как алгоритмически вычислимая функция. Описания программ-функций осуществляется в терминах функциональных определений, а основной операцией, ре6ализующей вычисления функциональной программы, является применение функции к аргументу.
Были разработаны также логические языки программирования – для поддержания логического стиля программирования (ПРОЛОГ). Логическое программирование использует точку зрения на алгоритмы, выработанную в математической логике. Данные логических программ представлены фактами, играющими роль специальных аксиом соответствующей предметной области, а алгоритмы описываются в виде совокупности т.н. правил логического вывода. Т.о., факты и правила вывода образуют специальную логическую теорию. Реализацию вывода в этой логической теории называют машиной (логического) вывода.
Принципиально важным методологическим различием между процедурным стилем и логическим стилем описания алгоритмов является то, что процедурный стиль предполагает описание алгоритма в виде последовательности шагов (действий), а логический стиль – описание алгоритма как совокупности определяющих свойств специальной предметной области. Процедурный алгоритм императивен – он предписывает выполнение строго определенной последовательности действий. Логический алгоритм декларативен – он описывает логические свойства специальной предметной области.
В 60-е годы многими теоретиками и практиками было осознано, что только лишь создание новых, более совершенных языков программирования не может решить все проблемы разработки программ. Начались интенсивные исследования в области тестирования программ, организации процесса разработки программного обеспечения и др.
Первой была осознана проблема ошибок. Возник вопрос, можно ли так организовать тестирование и проверку программ, чтобы добиться 100-процентной уверенности в ее правильности?
Работы по организации процесса тестирования начали появляться в конце 60-х годов. Примерно к середине 70-х годов были заложены основы организации тестирования, которыми в основном пользуются в настоящее время.
В 70 - 80-х годах бурно развивалась теория доказательства правильности программ. Она основывалась на том, что текст программы задает все, что она делает. Утверждалось, что, имея формальное описание семантики всех конструкций языка, можно на основе анализа текста строго математически вывести заключение о правильности или неправильности программы.
Широкого практического применения эта теория не получила по двум причинам:
формально определить, каков правильный результат программы, можно только для небольшого круга математически сформулированных проблем.
для большинства реальных программ строгое описание того, что программа должна делать, существенно больше по объему самой программы и требует очень высокой математической квалификации программиста. Для большого количества программ описание в принципе неформализуемо. (Для примера посмотрите на объем руководства, например, текстового редактора (которое довольно не строго).
Именно поэтому результаты теории доказательств нашли применение в очень ограниченных областях программирования (например, в разработке компиляторов). Для массового программирования они оказались неприменимы.
В это же время началось создание методик программирования. Разработка методов построения программ, с одной стороны, создавала основу для массового промышленного программирования, а с другой стороны, обобщая и анализируя текущее состояние программного обеспечения, давала мощный импульс созданию новых языков программирования, операционных систем, сред программирования.
Одной из наиболее широко применяемых методик программирования стало структурное программирование, которое поддерживается процедурными языками.
Следствием интенсивных исследований в области методов программирования явилось появление большого числа средств автоматизации разработки программ (CASE-средств, Computer Aided Software Engineering). Предполагалось, что после записи задачи на каком-либо высокоуровневом языке эти системы автоматически (или хотя бы с минимальным участием человека) сгенерируют готовую, правильно работающую программу, которая адекватно решает поставленную задачу.
В целом CASE-средства не смогли достичь обещанного: либо описание задачи по сложности оказывалось сравнимым с результирующей программой, либо решался крайне ограниченный круг сравнительно простых задач, либо качество генерируемой программы оказывалось слишком низким.
По мере увеличения сложности решаемых задач и соответственно увеличения размеров программных систем все большее значение приобретали вопросы организации процесса разработки программного обеспечения.
В 70-е годы была сформулирована модель процесса разработки. Эта модель выделяла несколько фаз процесса: анализ, кодирование, тестирование, внедрение. Каждая последующая стадия «вытекает» из предыдущей, поэтому и модель получила название каскадной.
Последующее развитие привело к модификации этой модели к виду спирали, при которой стадии разработки итеративно повторялись, но каждый раз на новом уровне, с учетом предыдущей разработки. Осознание исключительной важности организации разработки привело к построению всеохватывающих моделей и даже международных стандартов.
Очередное увеличение сложности решаемых задач и размеров создаваемых программных систем привело к широкому распространению объектного программирования.