· Принцип абстракции. Абстракция позволяет разработчику вообразить требуемое решение проблемы без сиюминутного учета множества деталей. Используя принцип абстракции, разработчик может рассматривать программу по уровням. Верхний уровень показывает нам большую абстракцию, упрощает взгляд на проект, в то время как нижний уровень показывает мелкие детали. На принципе абстракции основываются многие структурные методы, например, восходящая и нисходящая стратегии программирования.
· Принцип формальности. Слово «формальность» предполагает строгий методический подход.
Принцип формальности является базой для превращения программирования из импровизации в инженерную дисциплину.
Кроме того, этот принцип дает основания для доказательства правильности программ, так как позволяет изучать программы (алгоритмы) как математические объекты.
Введению формальности в некоторый процесс, технический или не технический, часто сопротивляются на основании того, что она подавляет творчество. Однако структурный подход использует формальность для придания процессу творчества определенной дисциплины и строгости, что позволяет ускорить принятие решения и избегать множества ошибок. Формальность является положительным и мощным способом соединения искусства и инженерных аспектов программирования.
|
|
· Принцип «разделяй и властвуй». Этот принцип известен со времен Юлия Цезаря и является методом решения трудных проблем путем разделения проблемы на множество мелких независимых, которые легче понимать и решать.
· Принцип иерархического упорядочения. Этот принцип тесно связан с принципом «разделяй и властвуй». Структура разбиения на части не менее важна, чем сам факт самого разбиения. Принцип иерархической упорядоченности с успехом используется во всех областях человеческой деятельности и помогает решать сложные проблемы в системах, включающих множество частей. В применении к программированию этот принцип выдвигает требование иерархического структурирования связей между модулями программного комплекса, что облегчает достижение рассмотренных выше целей структурного программирования.
Языки программирования, которые поддерживают эту модель, называются структурно-ориенированными или процедурными. Главное внимание в них уделяется построениюпроцедур (подпрограмм) и, как следствие, решению следующих вопросов: передача аргументов в процедуры; получение вычисленных значений из процедур; внутренняя организация процедур и т. п. Типичным примером процедурно-ориентированного языка является Фортран – первый и все еще один из наиболее популярных языков программирования. Далее появилось целое поколение языков указанного типа: Алгол-60, Алгол-68, Паскаль, Си и другие. Последовательное использование идеи процедурного структурирования программ привело к созданию обширных библиотек программирования, содержащих множество сравнительно небольших процедур, из которых, как из кирпичиков, можно строить «здание» программы.
|
|
Структуризация данных привела к конструкциям типов. По мере прогресса в области вычислительной математики акцент в программировании стал смещаться с процедур в сторону организации данных. Оказалось, что эффективная разработка сложных программ нуждается в действенных способах контроля правильности использования данных. Контроль должен осуществляться как на стадии компиляции, так и при прогоне программ, в противном случае, как показала практика, резко возрастают трудности создания крупных программных проектов. Отчетливое осознание этой проблемы привело к созданию Алгола-60, а позже – Паскаля, Модулы-2, Си и множества других языков программирования, имеющих более или менее развитые структуры типов данных.
Логическим следствием развития этого направления стал модульный подход к разработке программ, характеризующийся стремлением «спрятать» данные и процедуры внутри модуля.
В модульном программировании основные акценты переносятся на построение модулей. При этом необходимо определить модули, которые будут использоваться, и разделить программу на модули так, чтобы ее данные были скрыты в этих модулях. В действительности указанная модель переносит основные акценты на организацию данных (а не на алгоритм, по которому обрабатываются эти данные). Модулем (в модульном программировании) называется множество взаимосвязанных процедур (подпрограмм) вместе с данными, которые эти процедуры обрабатывают. Основной целью данного направления является скрытие данных в модулях. Проанализируем, зачем это делается. Предположим, надо разработать очень большую программу. Такой разработкой будет заниматься коллектив программистов, в котором каждый программист отвечает за определенную часть общей программы. Если коллектив использует процедурное направление в программировании, то надо решить некоторые проблемы, например:
- договориться об используемых именах в программе для глобальных переменных, поскольку использование одного имени для разных переменных (разными программистами) приводит к ошибке;
- договориться об организации общих данных и способах доступа к этим данным и т. п.
Для большой программы указанные проблемы могут оказаться очень сложными. Гораздо проще поручить конкретному программисту некоторую самостоятельную часть программы. В этом случае он будет отвечать за конструирование всех необходимых процедур и данных для этих процедур. Если запретить доступ к данным из-за пределов модуля (скрыть данные), то будет предотвращено их случайное изменение, а значит, и нарушение работы программ. Теперь вместо решения перечисленных выше проблем надо только продумать интерфейс (взаимодействие) сконструированных модулей в разрабатываемой общей программе. Доступ к модулю будет осуществляться только через интерфейс, что исключит случайное изменение данных и, как следствие, ошибки в программе.
Непосредственная поддержка модульного программирования воплощена в языке Модула-2.
И, наконец, объединение структур данных и операций над ними (методов) привело к появлению понятия класса, объекта. Начиная с языка Симула-67 в программировании наметился новый подход, который получил название объектно-ориентированного программирования (ООП). Его руководящая идея заключается в стремлении связать данные с обрабатывающими эти данные процедурами в единое целое – объект. Характерной чертой объектов является инкапсуляция (объединение) данных и алгоритмов их обработки, в результате чего и данные, и процедуры во многом теряют самостоятельное значение. Фактически объектно-ориентированное программирование можно рассматривать как модульное программирование нового уровня, когда вместо во многом случайного, механического объединения процедур и данных акцент делается на их смысловую связь.
|
|