Фундаментальными понятиями в программировании являются: технология программирования, методология, метод. Технология программирования (programming technology, sofware engineering) - это совокупность методов, способов и приемов разработки, сопровождения и применения программ, а также описание методов программирования. Метод - это совокупность приемов и операций практического и теоретического освоения действительности, в том числе программирования.
Любая технология программирования базируется на некоторой методологии разработки программ. Методология - это система принципов и способов организации и построения теоретической и практической деятельности, а также учение об этой системе.
Целью методологии программирования является изучение и внедрение таких методов проектирования и реализации программ, которые облегчают задачу сопровождения программы. Легкость сопровождения - это одно из тех качеств программы, которые нельзя добавить к программе после ее разработки.
В настоящее время широкую известность приобрели методы: структурного программирования, модульного программирования, объектно-ориентированного программирования (ООП), формализованных технических заданий и др.
Исторически в развитии программирования можно выделить несколько принципиально отличающихся методологий.
Изначально понятие технологии как таковой — это 60-е годы прошлого столетия — это период "стихийного" программирования. В этот период отсутствовало понятие структуры программы, типов данных и т.д. Вследствие этого код получался запутанным, противоречивым. Программирование тех лет считалось искусством. Конец 60-х — кризис в программирование.
Выход из этого кризиса — переход к структурной парадигме программирования. Структурный подход к программированию представляет собой совокупность рекомендуемых технологических приемов, охватывающих выполнение всех этапов разработки программного обеспечения. В основе структурного подхода лежит декомпозиция (разбиение на части) сложных систем с целью последующей реализации в виде отдельных небольших подпрограмм. С появлением других принципов декомпозиции (объектного, логического и т.д.) данный способ получил название процедурной декомпозиции.
Другим базовым принципом структурного программирования является использование при составлении программ только базовых алгоритмических структур (см. билет 4), запрет на использование оператора GOTO.
Структурный подход требовал представления задачи в виде иерархии подзадач простейшей структуры. Проектирование осуществлялось "сверху-вниз" и подразумевало реализацию общей идеи, обеспечивая проработку интерфейсов подпрограмм. Одновременно вводились ограничения на конструкции алгоритмов, рекомендовались формальные модели их описания, а также специальный метод проектирования алгоритмов — метод пошаговой детализации.
Поддержка принципов структурного программирования была заложена в основу так называемых процедурных языков программирования. Как правило, они включали основные "структурные" операторы передачи управления, поддерживали вложение подпрограмм, локализацию и ограничение области "видимости" данных. Среди наиболее известных языков этой группы стоит назвать PL/1, ALGOL-68, Pascal, С.
Дальнейший рост сложности и размеров разрабатываемого программного обеспечения потребовал развития структурирования данных. Как следствие этого в языках появляется возможность определения пользовательских типов данных. Одновременно усилилось стремление разграничить доступ к глобальным данным программы, чтобы уменьшить количество ошибок, возникающих при работе с глобальными данными. В результате появилась и стала развиваться технология модульного программирования.
Модульное программирование предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные, в отдельно компилируемые модули (библиотеки подпрограмм), например, модуль графических ресурсов. Связи между модулями при использовании данной технологии осуществляются через специальный интерфейс, в то время как доступ к реализации модуля (телам подпрограмм и некоторым "внутренним" переменным) запрещен. Эту технологию поддерживают современные версии языков Pascal и С (C++), языки Ада и Modula.
Объектно-ориентированное программирование (ООП) определяется как технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного типа (класса), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов в такой системе осуществляется путем передачи сообщений.
Основным достоинством объектно-ориентированного программирования по сравнению с модульным программированием является "более естественная" декомпозиция программного обеспечения, которая существенно облегчает его разработку. Это приводит к более полной локализации данных и интегрированию их с подпрограммами обработки, что позволяет вести практически независимую разработку отдельных частей (объектов) программы. Кроме этого, объектный подход предлагает новые способы организации программ, основанные на механизмах наследования, полиморфизма, композиции, наполнения. Эти механизмы позволяют конструировать сложные объекты из сравнительно простых. В результате существенно увеличивается показатель повторного использования кодов и появляется возможность создания библиотек классов для различных применений.
Бурное развитие технологий программирования, основанных на объектном подходе, позволило решить многие проблемы. Так были созданы среды, поддерживающие визуальное программирование, например, Delphi, C++ Builder, Visual C++ и т. д. При использовании визуальной среды у программиста появляется возможность проектировать некоторую часть, например, интерфейсы будущего продукта, с применением визуальных средств добавления и настройки специальных библиотечных компонентов. Результатом визуального проектирования является заготовка будущей программы, в которую уже внесены соответствующие коды.
Программа - это средство, для которого в результате опытного внедрения и дополнительных испытаний определена наиболее эффективная область применения, отработана методика внедрения и использования. Программное обеспечение (ПО, software) - это совокупность программ системы определенной обработки данных и программных документов, необходимых для эксплуатации этих программ.
Эволюция языков программирования для разработки программ - естественный процесс. Две важные тенденции эволюции:
1) создание надежного ПО: за счет контроля типов и успешности выполнения
определенных действий;
2) в языки программирования все больше проникают средства разработки
программ, самого процесса их создания.
Эти средства рассредоточивают проектирование программ. При этом структура системы отделена от реализации ее компонентов; данные инкапсулируются с помощью абстрактных типов данных, что отделяет их реализацию от их описания. Такому расчленению разработки системы соответствуют модульное и ООП. Эта тенденция отражается на макроуровне языков введением понятий "модуль", "класс", "объект", "спецификация", "процесс".
Модульное и ООП - современные направления развития программирования. ООП - это новый этап развития современных концепций построения языков и систем программирования. В нем получили дальнейшее развитие принципы структурного программирования: структуризация программ и данных, модульность и пр. Традиционный подход к разработке программ не теряет своего значения. Но введение объектных типов достаточно радикально изменяет подход к программированию.
В основе ООП лежит понятие объекта (object). Объект - это тип, который включает не только поля данных объекта, но и подпрограммы для их обработки, называемые методами. Таким образом, в объекте сосредоточены его свойства (состояния, данные) и их поведение (обработка с помощью методов). Идеи создания нового типа (объект) были заложены при введении процедурных типов параметров.
ООП характеризуется тремя основными свойствами: инкапсуляцией (encapsulation), наследованием (inheritance) и полиморфизмом (polymorphism).
Инкапсуляция означает объединение в одном объекте данных и действий над ними.
Наследование - это возможность использования уже определенных объектов, что позволяет создавать иерархию объектов начиная с некоторого простого первоначального (предка) и кончая более сложными, включающими (наследующими) свойства предшествующих элементов иерархии (предков). Эта иерархия может иметь сложную иерархическую структуру. Каждый потомок несет в себе характеристики своего предка (содержит те же данные и методы), а также обладает собственными характеристиками (данными и методами). Включенные в объект подпрограммы (методы), как правило, оперируют с данными этого объекта или обращаются к методам объектов-предков.
Некоторые объекты программы, особенно находящиеся в начале иерархического дерева, могут и не соответствовать каким-либо реальным объектам. Они лишь указывают на некоторые свойства других, реальных, объектов. Однако выявление этих общих свойств в отдельные объекты бывает удобно, так как позволяет затем не повторять их многократно при описании реальных объектов. Такие объекты называются абстрактными, и переменных таких типов в программе не бывает. Они должны быть доопределены (и дополнены) в потомках.
Полиморфизм - это возможность определения единого по имени действия (процедуры или функции), применимого ко всем объектам иерархии наследования; причем каждый объект иерархии может иметь особенность реализации этого действия (например, движение точки, линии, окружности или различных фигур). Полиморфизм означает, что для различных родственных объектов можно задать единый класс действий (например, перемещение по экрану любой геометрической фигуры). Затем для каждого конкретного объекта составляется своя подпрограмма, вызывающая это действие для данного объекта (определенной геометрической фигуры); причем все подпрограммы, определяющие конкретный объект (и его фигуру), могут иметь одно и то же имя.