ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД

К ПРОГРАММИРОВАНИЮ

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

 

Структурный подход - базируется на двух основных принципах:

1 Использование процедурного стиля программирования;

2. Последовательная декомпозиция алгоритма решения задачи сверху вниз.

 

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

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

Решение следующих проблем, возникающих при проектировании и разработке программ и комплексов, привело к созданию объектно-ориентированного программирования:

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

2. Ускорение разработки программ требовало упрощение их сопровождения и модификации.

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

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

 

 

Объект

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

16.03.2012 г. (пт)

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

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

Полиморфизм.

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

Классы и объекты – два общепринятых термина.

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

Компоненты.

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

У компонента два типа интерфейсов: интерфейс стадии проектирования и интерфейс стадии выполнения.

1. Интерфейс проектирования позволяет включать компоненты в современные среды разработки приложений.

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

 

 

АЛГОРИТМИЗАЦИЯ

 

Различают линейные, циклические и разветвляющиеся алгоритмы.

 

Разветвляющийся алгоритм.

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

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

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

Объем продукции V
Цена Q 4.6 3.3 2.5 1.7 1.4 1.2 1.1 0.9 0.8

Экспериментальные данные таблицы можно аппроксимировать тремя отрезками прямых с координатами: (1, 10), (2, 4.6), (5, 1.8), (12, 0.8). Уравнения аппроксимирующих прямых имеют вид:

1. Q = AV + B;

2. Q = CV + D;

3. Q = EV + F.

Коэффициенты A-F определяют по двум точкам для каждой прямой. Таким образом для первой прямой с заданными точками (1, 10) и (2, 4.6) составляется система уравнений вида:

Аналогично определяем коэффициенты двух остальных прямых:

Подставим коэффициенты в исходные уравнения:

Алгоритм вычисления цены Q по объему товара V состоит в определении по заданному значению V соответствующего уравнения аппроксимирующей прямой и вычислении по нему значения Q.

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

Блок-схема:

       
 
 
   

 

 


Циклические алгоритмы.

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

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

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

 

Ввод начальных значений Х = Хmin à Тело цикла Y = F(x) à Изменение на шаг значения аргумента Х = Х + шаг à Проверка окончания цикла Х > Хmax

 

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

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


Циклический процесс, получение значений Q, как функции от V, можно представить в виде блок-схемы:

 

       
 
 
   

 


Погрешность:

ΔQ = Qмодельное - Qтабличное

 

06.04.2012 г. (пт)

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

Для оценки рационального размера функции и количества ее параметров можно использовать правило 7±2. Смысл правила в том, что количество элементов (параметров функции или операторов в языках программирования), которые человек воспринимает хорошо, не должно превышать семи. Следовательно, при удачной декомпозиции размер функции не превосходит обычно 25-81 строк текста, а количество параметров должно быть не более 5-9. При этом 25-81 строка текста для одной функции соответствует в ее блоке не более 5-9 элементарным конструкциям, каждая из которых должна занимать не более 5-9 строк.

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

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

 

 

ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ С И С++

 

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

1. Язык должен быть простым, доступным для широкого круга специалистов;

2. Язык должен быть однозначным при истолковании алгоритма, в отличие от естественного языка;

3. Язык должен предполагать простой в создании и функционировании транслятор с этого языка на язык компьютера;

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

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

Существуют различные способы описания синтаксиса языка. Обычно выделяют два способа, как наиболее известные, предложенные Бэкусом и Виртом в соответствии с рисунком.

 

Бэкус Металингвистические формулы Вирт Синтаксические диаграммы
<Прописная_буква> : : = А|В|…|Z   <строчная_буква> : : = a|b|…|z Прописная_буква -------------------- \/ \/ \/ \/ A B C … Z \/ \/ \/ \/ ----------------------à строчная_буква -------------------- \/ \/ \/ \/ a b c … z \/ \/ \/ \/ ----------------------à
<Буква> : : = (<Прописная_буква>|<строчная_буква>) Буква àПрописная_букваà| à| |à àСтрочная_буква--à|
<Ненул_восм_цифра> : : = 1|2|…|7 Ненул_восм_цифра -------------------- \/ \/ \/ \/ 1 2 3 … 7 \/ \/ \/ \/ ----------------------à
<Восм_цифра> : : = (<Ненул_восм_цифра>|0) Восм_цифра ----------------------------- \/ \/ Ненул_восм_цифра 0 \/ \/ ------------------------------à

 

Из допустимых символов языка можно писать программу в соответствии с синтаксисом этого языка. Удобными способами описаниясинтаксиса языка являются следующие:

1. Использование металингвистических формул, которые предложены Бэкусом (автора языка AlgoL-60);

2. Использование синтаксических диаграмм, предложенных Виртом (автором языка Pascal);

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

Металингвистическая формула определяет понятия путем перечисления всех его значений, используя обозначения:

: : = – «это есть по определению»

| – «или»

( ) – «и»

{ } – неограниченное повторение заключенной в скобки конструкции

[ ] – необязательность конструкции, заключенной в скобки.

 

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

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

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

 

 



>