Модульный, структурный и объективный подходы к проектированию и программированию

Описание эволюции парадигмы программирования. Характеристика структуры управления и основные типы подпрограмм. Сущность структурного подхода к проектированию. Рассмотрение модульного программирования и его применение при решении различных задач.

Рубрика Производство и технологии
Вид курсовая работа
Язык русский
Дата добавления 30.01.2014
Размер файла 113,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Курсовая работа

Модульный, структурный и объективный подходы к проектированию и программированию

Оглавление

Введение

1. Технологии и парадигмы программирования

1.1 Эволюция парадигмы программирования

1.2 Структуры управления и подпрограммы

2. Эволюция подходов к проектированию и программированию

2.1 Структурный подход к проектированию и программированию

2.1.1 Понятие структурного программирования

2.1.2 Структурный подход

2.1.3 Методы структурного проектирования

2.2 Модульный подход к проектированию и программированию

2.2.1 Понятие модульного программирования

2.2.2 Модульный подход

2.3 Объектный подход к проектированию и программированию

2.3.1 Объектно-ориентированное программирование

2.3.2 Объектно-ориентированное проектирование

3. Применение различных подходов при решении задач

Заключение

Список использованных источников

программирование управление проектирование

Введение

Программирование - сравнительно молодая и быстро развивающаяся отрасль науки и техники. Опыт ведения реальных разработок и совершенствования имеющихся программных и технических средств постоянно переосмысливается, в результате чего появляются новые методы, методологии и технологии, которые, в свою очередь, служат основой более современных средств разработки программного обеспечения. Исследовать процессы создания новых технологий и определять их основные тенденции целесообразно, сопоставляя эти технологии с уровнем развития программирования и особенностями имеющихся в распоряжении программистов программных и аппаратных средств.

Технологии программирования - это апробированные стратегии создания программ, которые излагаются в виде методик с информационными фондами, описаниями проектных процедур и проектных операций. Существуют технология структурного программирования, технология проектирования программ с рациональной структурой данных, технология объектно-ориентированного программирования, технология визуального программирования.

В каждой из этих технологий используется одна или несколько парадигм программирования (концепций, систем взглядов). Последние представляют собой разные подходы к написанию программ. Для каждой из них необходимы: свой тип мышления, особая школа обучения, приемы и способы программирования, определяемые используемым языком.

А между тем эволюция программного обеспечения, эволюция компьютеров, со всей очевидностью свидетельствует о том, что именно в этой сфере наиболее ярко проявляются законы эволюции, законы иерархии. Предшествующее поколение программистов обучалось программированию непосредственно программированием. Программисты мыслили абстрактными категориями (машинными двоичными кодами). Пользователь получал результат, не зная хода (пути) решения задачи. Выход из тупика вначале был найден на пути структурного (модульного) программирования, при котором задача расчленялась на блоки (модули), из которых потом складывалась та или иная программа. Формировались библиотеки стандартных программ, из которых, как из кирпичиков, строились другие программы. Здесь уже начал возникать совершенно новый механизм (в программировании, но не в математике и др. науках), при котором на некоторый стандартный набор кирпичиков отражалось бесконечное число пространственных «образов». Последовательное прохождение дерева конкретного «образа» программы, с использованием некоторого набора конкретных базисных элементов, приводило к получению конкретного результата. В программировании стал развиваться естественный механизм, который по своим возможностям можно сравнить, пожалуй, только с мозгом человека. При этом одни и те же кирпичики могли использоваться многократно, не только в рамках одного образа, но и при создании других компьютерных образов. Сами же кирпичики являлись листьями конкретных «образов». При этом, чем сложнее сеть деревьев с образами, тем сильнее будут возможности находить и определять «аналогичные» образы, тем больше у компьютера будет «интеллектуальных» возможностей.

Таким образом, прогресс в вычислительной технике обязан, прежде всего, тому, что человек, не зная об этом, скопировал у природы самый оптимальный способ организации иерархических систем. Целью работы является рассмотрение различных стратегий создания программ, их методов, преимуществ и недостатков (на примере программирования на языке Pascal). Объектом исследования является стратегия создания программ. Для достижения поставленной цели необходимо решить следующие задачи:

Рассмотреть различные подходы программирования и проектирования;

Применить каждый из подходов при реализации прикладной задачи.

1. Технологии и парадигмы программирования

1.1 Эволюция парадигмы программирования

Одним из ярчайших примеров торжества идей законов иерархии может служить эволюция вычислительной техники и, в первую очередь, программного обеспечения компьютеров.

Программное обеспечение компьютеров появилось позднее аппаратного. По мере увеличения сложности аппаратуры возрастали и возможности программного обеспечения. Были созданы ассемблеры, компиляторы, операционные системы и системы управления базами данных. Хотя в основе ряда дисциплин, смежных с вычислительной техникой, например, математической логики, лингвистики, теории автоматов и др., лежит математика, у большинства специалистов до сих пор был и остается подход к разработке программного обеспечения скорее прагматический, нежели теоретический.

Существуют четыре основные парадигмы, которые описывают большинство сегодняшних методов программирования: императивная, аппликативная, основанная на системе правил и объектно-ориентированная.

Императивная парадигма (лежит в основе структурного, модульного подхода). Эта модель вытекает из особенностей аппаратной части стандартного компьютера, выполняющей инструкции (команды) последовательно. Основным видом абстракции, используемым в данной парадигме, являются алгоритмы. На основе ее разработано множество операторно-ориентированных языков программирования. Программа на таком языке состоит из последовательности операторов, выполнение каждого из которых влечет за собой изменение значения в одной или нескольких ячейках памяти. В целом синтаксис такого языка имеет вид:

Оператор_1:

Оператор_2:

Обычно при первом знакомстве с концепциями программирования приходиться сталкиваются именно с этой моделью, и многие широко распространенные языки поддерживают именно ее (например, С, C++, FORTRAN, ALGOL, PL/I, Pascal, Ada, Smalltalk и COBOL).

Аппликативная парадигма. Представляет собой другой взгляд на вычисления, производимые с помощью языка программирования. В основу этой парадигмы положено рассмотрение функции, которую выполняет программа. Здесь не рассматривается последовательность состояний, через которые должна пройти вычислительная машина. Вопрос ставится по-другому: какую функцию необходимо применить к начальному состоянию машины (путем выбора начального набора переменных и комбинирования их определенным образом), чтобы получить желаемый результат?

Языки, в которых акцентирован именно этот взгляд на вычисления, называются аппликативными, или функциональными. Синтаксис такого языка, как правило, выглядит следующим образом:

Функция_n (... функция_2 (функция_1 (данные) )...)

Такую модель поддерживают такие языки как ML и LISP.

Парадигма, основанная на системе правил. Языки, основанные на этой парадигме, осуществляют проверку наличия необходимого разрешающего условия и в случае его обнаружения выполняют соответствующее действие. Наиболее известным языком, основанным на системе правил, является Prolog. Он называется также языком логического программирования.

Выполнение программы на подобном языке похоже на выполнение программы, написанной на императивном языке. Однако операторы выполняются не в той последовательности, в которой они определены в программе. Порядок выполнения определяют разрешающие условия. Синтаксис таких языков выглядит следующим образом:

разрешающее условие_1 --> действие_1 разрешающее условие_2 --> действие__2

разрешающее условие_n --> действие _n

Иногда правила записываются в виде «действие if разрешающее условие», когда выполняемое действие записывается слева.

Объектно-ориентированная парадигма (в основе объектного подхода). В этой модели строятся сложные объекты данных. Для операций над ними определяется некоторый ограниченный набор методов. Создаваемые объекты могут наследовать свойства более простых объектов. Благодаря такой возможности объектно-ориентированные программы имеют высокую эффективность, свойственную программам, написанным на императивных языках. Возможность разработки различных классов, которые используют ограниченный набор объектов данных, обусловливает гибкость и надежность, которые свойственны аппликативному языку.

Существуют и другие парадигмы, что объясняется необходимостью решать разные задачи. Нельзя считать какую-либо парадигму наилучшей во всех областях практического применения. Например, для вычислительных задач более пригодна императивная парадигма, а для проектирования интеллектуальных систем применяется парадигма, ориентированная на правила. В последние годы особую популярность приобрела парадигма визуального программирования.

1.2 Структуры управления и подпрограммы

Теория первичных программ была предложена Маддуксом в качестве обобщения методологии структурного программирования для определения однозначной иерархической декомпозиции блок-схем. В этой теории предполагается, что графы программ могут содержать три класса узлов (рисунок 1):

а) функциональные узлы - представляют вычисления, производимые программой, и изображаются прямоугольниками с одной входящей в этот узел дугой и одной выходящей. Функциональные узлы представляют операторы присваивания, выполнение которых вызывает изменение состояния виртуальной машины;

б) узлы принятия решения - изображаются в виде ромбов с одной входящей дутой и двумя выходящими (истина и ложь). Эти узлы представляют предикаты, и управление из узла принятия решения передается дальше либо по ветви истина, либо по ветви ложь;

в) узел соединения - представляется в виде точки, в которой сходятся две дуги графа, чтобы сформировать одну выходную дугу.

Рисунок 1 Узлы на графе программы

Любая блок-схема состоит только из этих трех компонентов.

Правильная программа - блок-схема, являющаяся некоторой формальной моделью структуры управления, которая имеет: одну входящую дугу; одну выходящую дугу; путь от входящей дуги к любому узлу и из любого узла - к выходящей дуге.

Первичная программа является правильной программой, которую нельзя разделить на более мелкие правильные программы. Исключением из этого правила является последовательность функциональных узлов, которая считается одной первичной программой.

2. Эволюция подходов к проектированию и программированию

2.1 Структурный подход к проектированию и программированию

2.1.1 Понятие структурного программирования

Исторически сложилось так, что императивные языки в настоящее время доминируют в программировании. Однако исследования, проведенные в 70-80-х годах XX века, показали, что аппликативная методика обеспечивает более эффективные способы верификации программ и доказательство их корректности. Это видно из блок-схемы, представленной на рисунке 2.

Рисунок 2 Типичная блок-схема программы 60-х годов

60-е годы прошлого столетия характеризуются как период «стихийного» программирования. В этот период отсутствовало понятие структуры программы, типов данных и т.д. Вследствие этого код получался запутанным, противоречивым. Программирование тех лет считалось искусством. Конец 60-х - кризис в программирование.

Выход из этого кризиса - переход к структурной парадигме программирования. На рисунке 2 изображена блок-схема, типичная для программ 60-х годов XX века. В ней нет никакой явной структуры. Такие программы называют про-граммами-спагетти. Из-за большого числа нерациональных передач управления назад и вперед трудно понять, каково состояние программы в каждый момент времени в процессе ее выполнения.

На рисунке 3 приведена более структурированная конструкция. Каждый сегмент данной блок-схемы можно заключить в пунктирный прямоугольник. Каждый из таких прямоугольников на этой схеме будет иметь одну точку входа и одну точку выхода. Эту программу можно рассматривать как композицию четырех функций-подпрограмм, и поведение программы можно определить как функцию, которая получает данное состояние на входе выделенного пунктиром прямоугольника и преобразует его в результирующее состояние на выходе из него. Писать сложные программы в тысячи и десятки тысяч строк без расчленения на самостоятельные фрагменты, т.е. без структурирования, просто невозможно.

Структурное программирование - подход, при котором для передачи управления в программе используются только три конструкции, допускающих последовательную, условную и итеративную передачи управления.

При этом безусловная передача управления, например, оператором goto запрещается.

В результате каждая сложная команда в программе, являющаяся комбинацией последовательных, условных и циклических операторов, имеет только одну точку входа и одну точку выхода, что дает возможность разбиения программы на относительно самостоятельные фрагменты.

Рисунок 3 Блок-схема программы структурированной конструкции

Структурное программирование является результатом применения аппликативных методов к императивным программам. Для этого используются процедурно-ориентированные языки, в которых имеется возможность описания программы как совокупности процедур. Процедуры могут вызывать друг друга, и каждая из них может быть вызвана основной программой, которую также можно рассматривать как процедуру.

2.1.2 Структурный подход

Структурный подход к программированию представляет собой совокупность рекомендуемых технологических приемов, охватывающих выполнение всех этапов разработки программного обеспечения. Его внедрение обеспечивает:

а) повышение производительности труда программистов при написании и контроле программ;

б) получение программ, которые более пригодны для сопровождения, так как состоят из отдельных модулей;

в) создание программ коллективом разработчиков;

г) окончание создания программ в заданный срок.

В структурированных программах обычно легко прослеживается основной алгоритм, они удобнее в отладке и менее чувствительны к ошибкам программирования. Эти свойства являются следствием важной особенности подпрограмм, каждая из которых представляет собой во многом самостоятельный фрагмент программы, связанный с основной программой лишь с помощью нескольких параметров. Такая самостоятельность подпрограмм позволяет локализовать в них все детали программной реализации того или иного алгоритмического действия, и поэтому изменение этих деталей, например в процессе отладки, обычно не приводит к изменениям основной программы.

Концепция структурного программирования предполагает разбиение программы на отдельные компоненты согласно принципу утаивания информации.

Принцип утаивания информации заключается в том, что идентификаторы локальных объектов (имена констант, типов, переменных, процедур, функций, меток, и полей в записях переменных), то есть тех, которые используются только внутри заданной последовательности инструкций, не должны иметь смысла за пределами этих инструкций.

Процедуры и функции выступают как естественные текстовые единицы, с помощью которых ограничивается область существования локальных идентификаторов.

Идентификатором называется строка символов, используемая для идентификации или именованная (последовательность букв, цифр и знаков подчеркивания, которая начинается с буквы или символа подчеркивания и не содержит пробелов).

Областью видимости (действия) идентификатора называется часть программы, где он может быть использован.

Область видимости идентификаторов определяется местом их объявления. Если идентификаторы допускается использовать только в рамках одной процедуры или функции, то такие идентификаторы называются локальными. Если действие идентификаторов распространяется на несколько вложенных (не менее одной) процедур и/или функций, то такие идентификаторы называются глобальными. Правила определения области видимости для идентификаторов состоят в следующем:

а) действуют все идентификаторы, определенные внутри процедуры/функции;

б) действуют все идентификаторы окружающего контекста, если их имена отличаются от имен, объявленных внутри процедуры/функции;

в) локальные идентификаторы процедуры/функции во внешнем окружении не действуют никогда;

г) в случае совпадения имен глобального и локального идентификаторов действует только внутренний, локальный идентификатор, независимо от того совпадают они по типу, или нет.

2.1.3 Методы структурного проектирования

При проектировании любого изделия, в том числе и алгоритма, на ранних стадиях основное внимание обращается на самые главные проблемы, и искусственно упускаются из виду многие частные детали. Поэтому наиболее общая тактика проектирования состоит в разложении процесса на отдельные действия. В основе структурного подхода лежит декомпозиция (разбиение на части) сложных систем с целью последующей реализации в виде отдельных небольших подпрограмм. С появлением других принципов декомпозиции (объектного, логического и т.д.) данный способ получил название процедурной декомпозиции. На каждом таком шаге декомпозиции нужно удостовериться, что:

а) решения частных задач приводят к решению общей задачи;

б) данная последовательность отдельных действий наиболее рациональна;

в) осуществленная декомпозиция позволяет получить инструкции, по своему смыслу наиболее близкие к языку, на котором впоследствии будет написана программа.

Нисходящий подход к проектированию программных систем. В соответствии с этим методом создание программы начинается сверху, т.е. с разработки самого главного, генерального алгоритма. Так как на верхнем уровне обычно еще не ясны детали реализации той или иной части программы, то эти части следует заменить временными заглушками.

Прогон незаконченной программы (перед заменой заглушек реально работающими процедурами) дает определенную уверенность перед разработкой и реализацией алгоритмов нижнего уровня. Если реализуемый в заглушке алгоритм достаточно сложен, его вновь структурируют, выделяя главный алгоритм и применяя новые заглушки и т.д. (Заглушка - заменяющая компонента, которая временно используется в программе с тем, чтобы можно было продолжать ее разработку, т.е. компилирование или тестирование, до того времени, когда эта компонента будет сделана в надлежащем виде). Процесс продолжается вниз до тех пор, пока не будет создан полностью работоспособный вариант программы.

На практике «чистую» нисходящую разработку осуществить невозможно. На одной из более поздних стадий часто обнаруживается, что некоторый выбор, сделанный ранее, был неадекватным и это приводит к необходимости итеративной разработки.

Восходящий подход к разработке программ. В этом случае осуществляется последовательное построение программы из уже имеющихся элементов, начиная с примитивов, предоставляемых выбранным языком программирования. Этот процесс заканчивается получением требуемой готовой программы. На каждом этапе из имеющихся элементов строятся более мощные элементы. Эти элементы будут использоваться на следующем этапе для построения еще более мощных элементов, и так далее до тех пор, пока не будут получены элементы, из которых можно непосредственно составить требуемую программу.

На практике восходящая разработка в чистом виде также как и нисходящая невозможна. Построение каждого нового элемента должно сопровождаться просмотром вперед с целью проверки, удовлетворяет ли он требованиям к разрабатываемой программе; но даже и при таком подходе на более позднем этапе часто обнаруживается, что использованная ранее последовательность построения была выбрана неправильно и требуется новая итерация.

При конструировании новых алгоритмов обычно доминирует нисходящий метод. При адаптации программ к несколько измененным требованиям предпочтение зачастую отдается восходящему методу. Оба этих метода позволяют разрабатывать структурированные программы.

Поддержка принципов структурного проектирования была заложена в основу так называемых процедурных языков программирования. Как правило, они включали основные «структурные» операторы передачи управления, поддерживали вложение подпрограмм, локализацию и ограничение области «видимости» данных. Среди наиболее известных языков этой группы стоит назвать PL/1, ALGOL-68, Pascal, С.

Дальнейший рост сложности и размеров разрабатываемого программного обеспечения потребовал развития структурирования данных. Как следствие этого в языках появляется возможность определения пользовательских типов данных. Одновременно усилилось стремление разграничить доступ к глобальным данным программы, чтобы уменьшить количество ошибок, возникающих при работе с глобальными данными. В результате появилась и стала развиваться технология модульного программирования.

2.2 Модульный подход к проектированию и программированию

2.2.1 Понятие модульного программирования

Модульное программирование - это организация программы как совокупности небольших независимых блоков (модулей), структура и поведение которых подчиняется определенным заранее правилам.

Модулем (в модульном программировании) называется множество взаимосвязанных подпрограмм (процедур) вместе с данными, которые эти подпрограммы обрабатывают.

Модульное программирование предназначено для разработки больших программ. Разработкой больших программ занимается коллектив программистов. Каждому программисту поручается разработка некоторой самостоятельной части программы. И он в таком случае отвечает за конструирование всех необходимых процедур и данных для этих процедур. Сокрытие данных (запрет доступа к данным из-за пределов модуля) предотвращает их случайное изменение и соответственно нарушение работы программы. Для взаимодействия отдельных частей (модулей) программы коллективу программистов необходимо продумать только интерфейс (взаимодействие) сконструированных модулей в основной программе.

Структура модуля в терминах языка Pascal.

Модуль (unit) - программная единица, текст которой компилируется независимо (автономно).

Модуль содержит 4 раздела: заголовок, интерфейсная часть (раздел объявлений), раздел реализации и раздел инициализации.

UNIT <имя модуля>; {заголовок}

INTERFACE {интерфейсная часть}

Uses <используемые модули>;

Const <объявления глобальных констант>;

Type <объявления глобальных типов>;

Var <описание глобальных переменных>;

Procedure <заголовки(!) доступных процедур>;

...

Function <заголовки(!) доступных функций>;

...

IMPLEMENTATION {раздел реализации}

Uses <используемые при реализации модули>;

Const <объявления скрытых (локальных) констант>;

Type <объявления скрытых (локальных) типов>;

Var <описание скрытых (локальных) переменных>;

Procedure <тела(!) скрытых (локальных) процедур>;

...

Function <тела(!) скрытых (локальных) функций>;

BEGIN

<основной блок модуля = раздел инициализации>

END.

2.2.2 Модульный подход

Концепцию модульного подхода можно сформулировать в виде нескольких понятий и положений:

а) большие задачи разбиваются на ряд более мелких, функционально самостоятельных подзадач - модулей, которые связаны между собой только по входным и выходным данным;

б) модуль представляет собой «черный ящик» с одним входом и одним выходом. Это позволяет безболезненно производить модернизацию программы в процессе ее эксплуатации, облегчает ее сопровождение, а также позволяет разрабатывать части программного проекта на разных языках программирования;

в) в каждом модуле должны осуществляться ясные задачи. Если назначение модуля непонятно, то это означает, что декомпозиция на модули была проведена недостаточно качественно. Процесс декомпозиции нужно продолжать до тех пор, пока не будет ясного понимания назначения всех модулей и их оптимального сочетания;

г) исходный текст модуля должен иметь заголовок и интерфейсную часть, где отражаются назначение модуля и все его внешние связи;

д) в ходе разработки модулей программы следует предусматривать специальные блоки операций, учитывающие реакцию на возможные ошибки в данных или в действиях пользователя.

Большое значение в концепции модульного подхода придается организации управляющих и информационных связей между модулями программы, совместно решающими одну или несколько больших задач.

При работе с модулями нужно помнить их основное отличие от процедур и функций. Традиционные правила сферы действия глобальных и локальных переменных для модулей не работают. Эта языковая конструкция разработана так, чтобы исключить влияние глобальных переменных, объявленных в главной программе, на внутренние описания модуля. Поэтому, если возникает необходимость ввести доступные для всех блоков программы глобальные описания, то следует создать модуль глобальных объявлений и включить его в список импорта всех модулей, где нужны его описания.

Модульное проектирование предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные, в отдельно компилируемые модули (библиотеки подпрограмм), например, модуль графических ресурсов. Связи между модулями при использовании данной технологии осуществляются через специальный интерфейс, в то время как доступ к реализации модуля (телам подпрограмм и некоторым «внутренним» переменным) запрещен. Эту технологию поддерживают современные версии языков Pascal и С (C++), языки Ада и Modula.

2.3 Объектный подход к проектированию и программированию

2.3.1 Объектно-ориентированное программирование

Объектно-ориентированное программирование определяется как технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности объектов (объект - это совокупность переменных состояния и связанных с ними методов; методы определяют, как объект взаимодействует с окружающим миром; под методами объекта понимают процедуры и функции, объявление которых включено в описание объекта), каждый из которых является экземпляром определенного класса (типа), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов в такой системе осуществляется путем передачи сообщений.

Основным достоинством объектно-ориентированного программирования по сравнению с модульным программированием является «более естественная» декомпозиция программного обеспечения, которая существенно облегчает его разработку. Это приводит к более полной локализации данных и интегрированию их с подпрограммами обработки, что позволяет вести практически независимую разработку отдельных частей (объектов) программы.

Объект, как логическая единица, содержит следующие данные и операции (методы с кодом алгоритма) в отдельном участке памяти:

а) поля объекта (или атрибуты исходных данных), значения которых определяют текущее состояние объекта;

б) методы объекта, которые реализуют действия (выполнение алгоритмов) в ответ на их вызов в виде преданного сообщения;

в) свойства - часть методов, которые определят поведение объекта, то есть его реакцию на внешние воздействия.

При объявлении классов определяются описанные выше три характеристики объектов: поля, методы и свойства, а также указывается предок данного класса.

Объекты в программах воспроизводят все оттенки явлений реального мира: «рождаются» и «умирают»; меняют свое состояние; запускают и останавливают процессы; «убивают» и «возрождают» другие объекты.

2.3.2 Объектно-ориентированное проектирование

Объектно-ориентированное проектирование - это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приемы представления моделей, отражающих логическую (классы и объекты) и физическую структуру системы (процессы и деление на компоненты, файлы или модули), а также ее статические и динамические аспекты.

Объектно-ориентированная парадигма становится парадигмой высокого уровня, и главенствует над принципами парадигмы структурного программирования, так как занимается моделированием реальности, строит модели предметных областей на языке специалистов этих областей. Если пренебречь этим ради написания хорошей программы, которую станет легко модифицировать, расширять, в которой будут четкие интерфейсы и независимые модули, то это будет означать возврат на уровень парадигмы структурного программирования. Программа будет всем хороша, но её нельзя будет понять, так как она не будет соответствовать реальности, она будет объяснена в терминах только известных программисту, а специалист знающий предметную область не сможет без помощи разобраться в программе. В конце концов, сложность будет понижаться в очень узком диапазоне, хотя и организована хорошая программа, но не модель. Отсутствие модели, или лишь её поверхностное представление, «взорвет» хорошую программу изнутри, и не даст дальше развивать и сопровождать её в дальнейшем.

Когда вводятся классы, абстракций которых не существует, когда эти классы чисто системные и не имеют ничего общего с предметной областью, когда они введены лишь для упрощения потоков взаимодействия других классов - программное обеспечение становится «с бородой», и если путем рефакторинга не следить за такими участками в один прекрасный момент развитие программного обеспечения остановится, и станет невозможным.

Проектирование программных и технических систем при объектно-ориентированном подходе базируется на том условии, что никакая подсистема данного уровня не должна зависеть от устройства любой другой подсистемы этого уровня. Такая независимость внутреннего устройства одного объекта от внутреннего устройства другого называется инкапсуляцией.

Принцип инкапсуляции использовался в технологии модульного программирования. В модуле в явной форме введена инкапсуляция путем разделения его на секции интерфейса и реализации.

В объектно-ориентированном программировании принцип инкапсуляции используется для изоляции класса от остальных частей программы, чтобы сделать его самодостаточным для решения конкретной задачи. Например, класс TForm в среде Delphi содержит (инкапсулирует в себе) все необходимое для создания Windows-окна, класс TMemo представляет собой полнофункциональный текстовый редактор, класс TTimer обеспечивает работу программы с таймером и т.д.

Инкапсуляция достигается путем совмещения в одной записи языка программирования структур данных с процедурами и функциями, которые манипулируют полями данных этой записи, для получения нового типа данных ~ класса. Инкапсуляция позволяет защитить по интерфейсу доступ к полям и методам. Доступ разрешается лишь к открытым методам и полям. Полная совокупность методов и тонкости их реализаций являются скрытыми.

type

TMyClass = class

IntField: Integer;

function MyFunc(a: Integer): Integer;

procedure MyProc; end;

Путем использования принципа инкапсуляции появляется возможность осуществлять обмен готовыми к работе программными заготовками. Например, библиотека классов Delphi - это, фактически, набор кирпичиков для построения прикладных программ.

Применяя инкапсуляцию, мы защищаем данные, принадлежащие объекту, от возможных ошибок, которые могут возникнуть при прямом доступе к этим данным. Кроме того, применение этого принципа очень часто помогает локализовать возможные ошибки в коде программы. А это намного упрощает процесс поиска и исправления этих ошибок. Однако применение инкапсуляции ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова методов для изменения внутренних элементов (переменных) объекта. Но при современном уровне развития вычислительной техники эти потери в эффективности не играют существенной роли.

Значительное упрощение понимания сложных задач достигается за счет усложнения иерархии. Под иерархией здесь понимается упорядочение абстракций, расположение их по уровням. Усложнение иерархии от уровня к уровню достигается за счет наследования.

Принцип наследования оперирует с понятиями «предок - потомок» и предусматривает расширение набора свойств наследника за счет принятия всех свойств предка.

Любой класс может быть порожден от другого класса. Для этого при его объявлении указывается имя класса-родителя:

TChildCIass = class (TParentClass )

Порожденный класс автоматически наследует поля, методы и свойства своего родителя и может добавлять их новыми. Таким образом, принцип наследования обеспечивает поэтапное создание сложных классов и разработку собственных библиотек классов. Смысл и универсальность наследования заключается в том, что не надо каждый раз заново («с нуля») описывать новый объект, а можно указать «родителя» (базовый класс) и описать отличительные особенности нового класса. В результате новый объект будет обладать всеми свойствами родительского класса плюс своими собственными отличительными особенностями.

Все классы в Object Pascal порождены от единственного родителя - класса TObject. Этот класс не имеет полей и свойств, но включает в себя методы самого общего назначения, обеспечивающие весь жизненный цикл любых объектов - от их создания до уничтожения. Поэтому программист не может создать класс, который не был бы дочерним классом TObject. Следующие два объявления идентичны.

TaClass = class(TObject) <==> TaClass = class

Принцип наследования приводит к созданию ветвящегося дерева классов. Каждый потомок дополняет возможности своего родителя новыми и передает их своим потомкам. Например, класс TPersistent обогащает возможности своего родителя TObject тем, что он умеет сохранять данные в файле и получать их из него, в результате это умеют делать и все его потомки. Класс TComponent, в свою очередь, умеет взаимодействовать со средой разработчика и передает это умение своим потомкам. TControl не только способен работать с файлами и средой разработчика, но он еще умеет создавать и обслуживать видимые на экране изображения, а его потомок TWinControl может создавать Windows-окна и т.д.

В Object Pascal возможно только так называемое одиночное наследование, но в реальном мире у потомка два родителя, поэтому в ряде языков (например, в C++) предусмотрен механизм множественного наследования. Множественное наследование более логично с точки зрения моделирования реального мира, однако, оно усложняет реализацию языков программирования.

Полиморфизм - это средство для придания различных значений одному и тому же событию в зависимости от типа обрабатываемых данных. Этот принцип определяет различные формы реализации одноименного действия.

Целью полиморфизма является использование одного имени для задания общих для класса действий, причем каждый объект или класс иерархии имеет возможность по-своему реализовать это действие своим собственным, подходящим для него, кодом. Таким образом, полиморфизм является свойством классов решать схожие по смыслу проблемы разными способами.

В рамках Object Pascal поведенческие свойства класса определяются набором входящих в него методов. Этот принцип используется, когда требуется расширить свойства класса не путем добавления новых методов, а путем достраивания одного из методов или набора методов. Изменяя алгоритм того или иного метода в потомках класса, программист может придавать этим потомкам отсутствующие у родителя специфические свойства.

Для изменения метода необходимо перекрыть его в потомке, т.е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие различную алгоритмическую основу и придающие объектам разные свойства. В этом сущность полиморфизма объектов.

Кроме этого, в Object Pascal полиморфизм достигается не только механизмом наследования и перекрытия методов родителя, но и их виртуализацией, позволяющей родительским методам обращаться к методам своих потомков

Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного интерфейса для единого класса действий. Выбор конкретного действия, в зависимости от ситуации, возлагается на компилятор.

Структура программ при объектно-ориентированном подходе представляется графом взаимодействия объектов, а не деревом иерархии, как это имеет место в структурном проектировании. Эти механизмы позволяют конструировать сложные объекты из сравнительно простых. В результате существенно увеличивается показатель повторного использования кодов и появляется возможность создания библиотек классов для различных применений.

Бурное развитие технологий программирования, основанных на объектном подходе, позволило решить многие проблемы. Так были созданы среды, поддерживающие визуальное программирование, например, Delphi, C++ Builder, Visual C++ и т. д. При использовании визуальной среды у программиста появляется возможность проектировать некоторую часть, например, интерфейсы будущего продукта, с применением визуальных средств добавления и настройки специальных библиотечных компонентов. Результатом визуального проектирования является заготовка будущей программы, в которую уже внесены соответствующие коды.

3. Применение различных подходов при решении задач

Рассмотрим, как будет выглядеть программная реализация с использованием различных подходов при решении задачи: Поменять первую и последнюю цифру в натуральном числе. Язык реализации Pascal.

Структурный подход. Программный код выглядит следующим образом:

program Perestanovka;

{раздел объявления переменных}

label

M1, M2, M3, M4;

var

N, copy_N, number, copy_number, first, last, stepen, new_N: integer;

begin

{тело программы}

{ввод числа}

write('input N=');

readln(N);

number:=0;

copy_N:=N;

{подсчет количества цифр в числе}

M1:

number:=number+1;

copy_N:=copy_N div 10;

if copy_N<>0 then

goto M1;

if number=0 then

goto M2;

{вычисление степени числа 10^(number-1)}

copy_number:=number;

last:=N mod 10;

copy_N:=N;

{выделение первой и последней цифры}

M3:

copy_N:=copy_N div 10;

copy_number:=copy_number-1;

if copy_number<>1 then

goto M3;

first:=copy_N;

stepen:=1;

copy_number:=number;

{перестановка цифр}

M4:

stepen:=stepen*10;

copy_number:=copy_number-1;

if copy_number>1 then

goto M4;

new_N:=N-first*stepen+last*stepen-last+first;

N:=new_N;

{вывод результата}

M2:

writeln(N);

readln;

end.

Код линейный, все действия выполняются последовательно, передача управления осуществляется за счет использования оператора перехода goto.

Модульный подход. Программный код выглядит следующим образом.

program Perestanovka;

{раздел объявления переменных}

var

N, number, new_N: integer;

{раздел объявления процедур и функций}

{процедура подсчета количества цифр в числе}

procedure kol_cifr(var kol: integer; NN: integer);

begin

while NN<>0 do

begin

kol:=kol+1;

NN:=NN div 10;

end;

end;

{функция определения первой цифры числа}

function first_cifra(NN: integer; kol: integer): integer;

begin

while kol<>1 do

begin

NN:=NN div 10;

kol:=kol-1;

end;

first_cifra:=NN;

end;

{функция определения последней цифры числа}

function last_cifra(NN: integer): integer;

begin

last_cifra:=NN mod 10;

end;

{функция возведения целого числа в целую степень}

function stepen(bas: integer; pokaz: integer): integer;

var

st: integer;

begin

st:=1;

while pokaz<>0 do

begin

st:=st*bas;

pokaz:=pokaz-1;

end;

stepen:=st;

end;

{тело программы}

begin

write('input N=');

readln(N);

number:=0;

kol_cifr(number,N);

if number<>0 then

new_N:=N-first_cifra(N,number)*stepen(10,number-1)+

last_cifra(N)*stepen(10,number-1)-

last_cifra(N)+first_cifra(N,number)

else

new_N:=N;

writeln(new_N);

readln;

end.

Код программы более читабельный, однотипные действия объединены в процедуры и функции, уменьшилось количество объявленных переменных в программе, следовательно, выделяемая память. Для оптимизации следует объединить все процедуры и функции в модуль и подключать его к программе. Организация модуля позволит использовать разработанные процедуры и функции многократно, что облегчит процесс программирования, сократит коды программ.

Объектный подход. Программный код выглядит следующим образом.

Program perestanovka;

type

tN = class

znach: integer;

number: integer;

first: integer;

last: integer;

procedure input;

procedure output;

procedure kol_cifr(var kol: integer; NN: integer);

procedure perestavka(var NN: integer; cf, cl: integer);

function first_cifra(NN: integer; kol: integer): integer;

function last_cifra(NN: integer): integer;

end;

var

N: tN;

function stepen(bas: integer; pokaz: integer): integer;

var

st: integer;

begin

st:=1;

while pokaz<>0 do

begin

st:=st*bas;

pokaz:=pokaz-1;

end;

stepen:=st;

end;

procedure tN.input;

begin

write(`input N=');

readln(N.znach);

end;

procedure tN.kol_cifr(var kol: integer; NN: integer);

begin

while NN<>0 do

begin

kol:=kol+1;

NN:=NN div 10;

end;

end;

function tN.first_cifra(NN: integer; kol: integer): integer;

begin

while kol<>1 do

begin

NN:=NN div 10;

kol:=kol-1;

end;

first_cifra:=NN;

end;

function tN.last_cifra(NN: integer): integer;

begin

last_cifra:=NN mod 10;

end;

procedure tN.perestanovka(var NN: integer; cf, cl: integer);

begin

NN:=NN-cf*stepen(10,number-1)+cl*stepen(10,number-1)-cl+cf;

end;

procedure tN.output;

begin

Form1.Edit1.Clear;

Form1.Edit1.Text:=inttostr(N.znach);

end;

begin

N.input;

N.number:=0;

N.kol_cifr(N.number,N.znach);

if N.number<>0 then

N.perestanovka(N.znach,N.first_cifra(N.znach,N.number),N.last_cifra(N.znach));

N.output;

end;

end.

Код программы очень похож на код программы при модульном подходе, но теперь можно использовать все возможности объектного подхода: наследование, полиморфизм, создавая дочерние классы, расширяя их свойства по сравнению с родительским классом и т.д.

Заключение

В ходе работы были рассмотрены различные виды подходов к проектированию и программированию в разрезе развития, указаны их характерные черты, преимущества и недостатки.

Показаны на примерах, как происходит программная реализации при применении того или иного подхода.

Можно сделать вывод, что эволюция в технологии программирования позволила сделать программирование более понятным, разделять сложные программы на отдельные части и вести проектирование и программирование каждой из них самостоятельно, несмотря на усложнение программных продуктов появляются средства сокращать и ресурсные затраты.

Развитие не стоит на месте - появляются новые подходы, дающие большие возможности программистам, облегчающие их работу использованием готовых программных блоков, делающие процесс проектирования программных продуктов независимым, понятным не только программисту, но и заказчику, пользователю. Программа превращается в модель реального мира.

Список использованных источников

1. Буч, Г. Объектно-ориентированный анализ и проектирование с примерами на С++ / Г. Буч, перевод с англ. под ред. И. Романовского и Ф. Андреева. - М.: Вильямс, 2008. - 721 с.

2. Архангельский, А.Я. Программирование в Delphi 7 / А.Я. Архангельский. М.: ООО «Бином-Пресс», 2003. - 1152 с.

3. Программирование. Лекции по программированию. - Режим доступа www.studifi.ru

4. Технология программирования. Структурное и объектно-ориентированное. - Режим доступа www.sgm.forumssity.ru

5. Технология структурного программирования. . - Режим доступа www.razlib.ru

6. On-line Информатика. Модульное программирование. - Режим доступа www.online-ane.ru.

Размещено на Allbest.ru

...

Подобные документы

  • Рассмотрение существующего подхода к проектированию упаковочной продукции. Методы разработки с использованием средств автоматизированного проектирования. Обзор рынка конструкций для размещения рекламных буклетов. Выполнение эскизов в графике и в объеме.

    дипломная работа [3,0 M], добавлен 28.08.2014

  • Разработка принципов создания систем агрегатно-модульного инструмента для тяжелых станков с целью повышения эффективности. Теоретический анализ напряженно-деформированного состояния модульного инструмента с учетом особенностей тяжелых токарных станков.

    дипломная работа [5,5 M], добавлен 04.06.2009

  • Требования, предъявляемые к тепловому оборудованию предприятий общественного питания. Назначение и классификация пищеварочных котлов, их современные конструкции. Описание модернизированной конструкции котла газового секционного модульного КПГСМ-60.

    курсовая работа [1,5 M], добавлен 27.11.2012

  • Главный подход к исследованию сложных объектов - системный анализ. Практическая реализация системного анализа - структурный системный анализ, его принципы и методы. Истоки структурного моделирования. Классы моделей структурного системного анализа.

    реферат [25,4 K], добавлен 18.02.2009

  • Описание САПР "Ассоль" - модульного программного комплекса, который позволяет по эскизу, фотографии или образцу быстро и точно разработать лекала моделей любой сложности. Комбинаторный синтез технического эскиза. Сфера применения "Ассоль-Дизайн".

    учебное пособие [8,0 M], добавлен 07.02.2016

  • Склад атмосферной сушки. Техническая характеристика сушильной камеры "Интер–Урал". Основные требования к проектированию цеха. Технологический процесс изготовления изделий из пиломатериалов. Производственная программа деревоперерабатывающего цеха.

    курсовая работа [46,8 K], добавлен 13.07.2015

  • Оптимизация решения на моделях нелинейного программирования. Решение задачи линейного программирования графическим методом. Разработка раскроя древесно-стружечных плит на заготовки. Затраты времени на обработку деталей. Обоснование решений на моделях СПУ.

    курсовая работа [2,8 M], добавлен 17.05.2012

  • Организационная подготовка, проведение предпроектного обследования системы и разработка технического задания. Проведение экспертизы и утверждение комплекта документации по техническому проектированию организации производства, труда и управления.

    презентация [186,6 K], добавлен 09.12.2015

  • Методология структурного анализа и проектирования. Описание системы с помощью данной методологии - модель. Использование естественных и графический языков. Функциональное, информационное и динамическое моделирование. Основные средства методологии.

    реферат [137,2 K], добавлен 18.02.2009

  • Общие требования к проектированию предприятий ремонта бытовой РЭА. Выбор и расчет штатного состава, оснащения организации. Описание технологии движения РЭА по ремонтному предприятию: прием аппаратуры, проведение ремонта, выдача аппарата заказчику.

    курсовая работа [83,2 K], добавлен 12.10.2011

  • Описание технических характеристик основных узлов гидроэлектростанции. Особенности разработки алгоритма программы управления маслонапорной установкой, специфики программирования микроконтроллеров Siemens. Правила техники безопасности при обслуживании.

    дипломная работа [3,3 M], добавлен 12.02.2010

  • Производственный и технологические процессы. Правила оформления графической части проектной документации. Рекомендации по проектированию подсобных и административно-бытовых помещений. Условные графические изображения проектируемых территорий и границ.

    методичка [740,0 K], добавлен 23.09.2008

  • Назначение и структура деревообрабатывающего комплекса, требования к проектированию, архитектурно-строительное и объемно-планировочное решение; обеспечение последовательности технологического процесса. Состав и расчет оборудования для бытовых помещений.

    курсовая работа [3,5 M], добавлен 21.10.2011

  • Основы технологии машиностроения - пособие для студентов всех машиностроительных специальностей. Обучение самостоятельному проектированию технологических процессов. Краткое изложение теоретических положений с проектными задачами и образцами их решения.

    методичка [576,7 K], добавлен 08.07.2009

  • Теплотехнический расчет ограждающих частей жилого здания. Общие требования по проектированию. Удельная отопительная характеристика здания. Технико-экономическая оценка эффективности промывки системы водяного отопления. Подбор смесительного насоса.

    дипломная работа [467,5 K], добавлен 10.04.2017

  • Определение конструктивных элементов резца. Материал фасонного резца, допуски на размеры и технические требования. Указания по проектированию шаблона и контршаблона. Проведение исследования и создание резца для обработки цилиндрических поверхностей.

    курсовая работа [1,4 M], добавлен 02.12.2021

  • Рассмотрение сущности, целей и задач теплотехнических испытаний котлов. Описание последовательности проведения балансовых и режимно-наладочных тестирований агрегата. Применение экспресс-метода для оценки качества ремонта или модернизации оборудования.

    реферат [1,7 M], добавлен 28.06.2011

  • Разработка определенного плана действий по проектированию конструкции и разработке технологии производства шкафа для белья. Характеристика конструкции: декоративно-художественные требования и назначение. Расчет основных и вспомогательных материалов.

    курсовая работа [48,1 K], добавлен 06.01.2011

  • Подготовка к комплексному проектированию поршневого насоса с кривошипно-ползунным механизмом. Ознакомление с общими принципами исследования кинематических и динамических свойств механизмов. Построение диаграмм движения методом графического интегрирования.

    курсовая работа [429,2 K], добавлен 18.10.2010

  • Выбор схемы производства с анализом сертификации продукции. Технологическая схема разлива минеральных вод и экономические расчеты. Оценка эффективности предложенных мероприятий по проектированию и развитию предприятия. Охрана окружающей среды и труда.

    дипломная работа [112,9 K], добавлен 09.12.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.