Основы Pascal. Типы данных. Структура программы на языке Pascal
Вид материала | Документы |
- Компоновать программы из отдельных частей отлаживать программы выполнять программы., 197.76kb.
- Borland Turbo Pascal, знать простые основные алгоритмы работы с простыми типами данных, 316.19kb.
- Программирование на языке высокого уровня, 59.92kb.
- Задачи работы Научиться создавать программы на языке Turbo Pascal с использованием, 598.05kb.
- Курс «Программирование на языке Turbo Pascal 0» Цель курса, 19.6kb.
- Borland Turbo Pascal, знать простые основные алгоритмы работы с простыми типами данных, 324.26kb.
- Правила преобразований из одного типа в другой и правила приведения типов в языке Object, 19.03kb.
- Информатика Ответы на вопросы, 913.15kb.
- Конспект урока по информатике для десятого класса по теме «Условный оператор в Turbo, 32.44kb.
- Доманская Юлия Георгиевна г. Вилейка 2006г пояснительная записка, 74.95kb.
По размерам и вычислительной мощности компьютеры можно разделить на сверхбольшие (суперкомпьютеры или суперЭВМ), большие, малые и сверхмалые (микрокомпьютеры или микроЭВМ). К суперкомпьютерам относятся мощные многопроцессорные ВМ с быстродействием от сотен миллионов до десятков миллиардов операций в секунду. Большие компьютеры за рубежом часто называют мэйнфреймами. Основные направления их эффективного применения — решение научно-технических задач, работа в вычислительных системах с пакетной обработкой информации, работа с большими базами данных, управление вычислительными сетями и ресурсами. Малые компьютеры или миниЭВМ — надежные, недорогие и удобные в эксплуатации компьютеры, обладающие несколько более низкими по сравнению с мэйнфреймами возможностями. Они ориентированы на использование в качестве управляющих вычислительных комплексов. Среди микрокомпьютеров выделяют несколько подклассов:
Многопользовательские микрокомпьютеры — это мощные микрокомпьютеры, оборудованные несколькими видеотерминалами и функционирующие в режиме разделения времени, что позволяет эффективно работать на них сразу нескольким пользователям.
Персональные компьютеры — однопользовательские микрокомпьютеры, удовлетворяющие требованиям общедоступности и универсальности применения.
Рабочие станции — представляют собой однопользовательские микрокомпьютеры, часто специализированные для выполнения определенного вида работ.
Серверы — многопользовательские мощные микрокомпьютеры в вычислительных сетях, выделенные для обработки запросов от рабочих станций сети.
Сетевые компьютеры — упрощенные микрокомпьютеры, обеспечивающие работу в сети и доступ к сетевым ресурсам, часто специализированные на выполнение определенного вида работ, например защиту сети от несанкционированного доступа, организацию просмотра сетевых ресурсов, электронной почты и т.д.
- Способы повышения быстродействия вычислительных систем.
Вычислительная система (ВС) — это совокупность одного или нескольких компьютеров или процессоров, программного обеспечения и периферийного оборудования, организованная для совместного выполнения информационно-вычислительных процессов.
Одним из способов убыстрения процесса обработки информации является распараллеливание работ. Если выполняемую работу можно разделить на независимые части, то их реализацию естественно одновременно возложить на разных исполнителей (компьютеры или процессоры).
Если программа не имеет независимых друг от друга участков или они очень малы, но эта программа должна выполняться многократно, то можно сократить общее время вычислений за счет использования принципа конвейера. В этом случае программа разбивается на одинаковые по времени реализации части - подпрограммы (элементарные операции), последовательное выполнение которых решает поставленную задачу. После этого следует запрограммировать N процессоров на реализацию этих подпрограмм и расположить их в цепочку так, что результат работы i-го процессора будет исходными данными для i+1-го. Чем больше процессоров образуют "конвейер" обработки информации, тем быстрее она обрабатывается.
Таким образом, повысить быстродействие ВС можно за счет использования нескольких процессоров и адаптивной структуры системы. Процедура образования той или иной конфигурации ВС (параллельной, последовательной или другой) может происходить практически мгновенно. Из имеющихся процессоров образуется некоторая условная, виртуальная ВМ, специализированная для решения именно заданной задачи. Многопроцессорная ВС и характеризуется тем, что она способна для каждой решаемой задачи или комплекса задач очень быстро создавать такие виртуальные машины, решать с их помощью поставленные задачи, быстро менять конфигурацию виртуальной машины и снова решать на ней поступившие задачи.
Описанная модель адаптация ВС ограничивается жесткими рамками имеющейся архитектуры компьютеров, их системой команд, типом памяти и т.д. Адаптироваться здесь можно только в рамках заданной структуры, т.е. только варьируя программой. Для того, чтобы получить более сильный эффект от введения адаптации, надо варьировать структурой вычислительных средств, т.е. нужно иметь возможность изменять сами схемы, из которых составлена вычислительная техника.
- Многомашинные и многопроцессорные вычислительные системы.
Многомашинная ВС содержит некоторое число компьютеров, информационно взаимодействующих между собой. В многомашинных ВС каждый компьютер работает под управлением своей ОС. Информационное взаимодействие компьютеров может быть организовано на уровне процессоров, оперативной памяти или каналов связи. Ввиду сложности организации информационного взаимодействия на 1-м и 2-м уровнях в большинстве многомашинных ВС используется 3-й уровень, хотя и динамические характеристики (в первую очередь быстродействие), и показатели надежности таких систем существенно ниже. Типичным примером массовых многомашинных ВС являются компьютерные сети.
В многопроцессорной ВС имеется несколько процессоров, информационно взаимодействующих между собой либо на уровне регистров процессорной памяти, либо на уровне оперативной памяти. Общий доступ к внешней памяти и к устройствам ввода-вывода обеспечивается обычно через каналы оперативной памяти. Многопроцессорная ВС работает под управлением единой ОС, общей для всех процессоров. Быстродействие и надежность многопроцессорных ВС по сравнению с многомашинными, взаимодействующими на 3-м уровне, существенно выше. Примером многопроцессорных ВС являются суперкомпьютеры.
Суперкомпьютеры создаются в виде высокопараллельных многопроцессорных ВС (МПВС), которые имеют несколько разновидностей:
Магистральные (конвейерные) МПВС, у которых процессор одновременно выполняет разные операции над последовательным потоком обрабатываемых данных. Такие МПВС относятся к системам с многократным потоком команд и однократным потоком данных (Multiple Instruction Single Data).
Векторные МПВС, у которых все процессоры одновременно выполняют одну команду над различными данными. Это системы с однократным потоком команд и многократным потоком данных (Single Instruction Multiple Data).
Матричные МПВС, у которых микропроцессор одновременно выполняет разные операции над последовательными потоками обрабатываемых данных. Это системы с многократным потоком команд и многократным потоком данных (Multiple Instruction Multiple Data).
Получить быстродействующую ВС можно также за счет использования кластерных решений, объединяющих группы высокопроизводительных серверов. Кластеризация позволяет манипулировать группой серверов как одной системой, упрощая управление и повышая надежность. Важной особенностью кластера является обеспечение доступа любого сервера к любому блоку как оперативной, так и дисковой памяти.
- Основные методологии программирования.
В настоящее время при разработки программного обеспечения (ПО) используются следующие основные методологии:
- императивного программирования;
- объектно-ориентированного программирования;
- функционального программирования;
- логического программирования;
- программирования в ограничениях.
- Основные методологии программирования
Указанные методологии взаимосвязаны с понятиями алгоритма и модели. Они перечислены в порядке уменьшения связи с понятием алгоритм и увеличения связи с понятием модель. Каждая методология характеризуется своими преимуществами при решении задач различных классов. Эти преимущества в общем случае можно оценить исходя из двух параметров: эффективности работы получаемых программ на ЭВМ и объему общих затрат на разработку программ. В соответствии с этим языки программирования, поддерживающие методологии, можно разделить на языки, ориентированные на скорость выполнения кода программ, и языки, ориентированные на удобство и скорость разработки программ.
Основные особенности методологии императивного программирования.
Данный подход к разработке программ характеризуется принципом последовательного изменения состояния вычислительной системы пошаговым образом для решения поставленной задачи. При этом управление изменениями полностью определяется в ходе разработки программ и может быть полностью проконтролировано. В основе методологии лежат методы изменения состояний и управления потоком исполнения. Метод изменения состояний заключается в последовательном изменении состояний вы09числительной системы. Он поддерживается концепцией алгоритма. Метод управления потоком исполнения заключается в пошаговом контроле управления вычислениями. Он поддерживается концепцией потока исполнения.
Императивное программирование основано на описании процесса последовательного изменения состояний вычислительной системы. Обычно под ней понимается компьютер. В этом случае его состояние включает в себя содержание всех ячеек памяти, а также состояние процессора и всех сопряженных устройств. Соответствующая используемая структура данных — это последовательность ячеек памяти в виде пар адрес–значение с линейно упорядоченными адресами. Императивное программирование наиболее пригодно для решения задач, для которых можно достаточно четко определить последовательность операций для получения требуемых результатов. Данная методология хорошо сочетается с архитектурой большинства современных компьютеров, что позволяет получать эффективный исполняемый код. Вместе с тем, рост сложности решаемых задач приводит к снижению, подчас значительному, эффективности разработки программ с помощью методологии императивного программирования.
Языки, поддерживающие вычислительную модель императивного программирования, предоставляют компактные средства для описания функций переходов между состояниями вычислительной системы. Императивные языки программирования обеспечивают средства разработки программ, манипулирующих обрабатываемыми данными в пошаговом режиме. К числу языков императивного программирования относятся, в частности, языки Fortran, C, Pascal, Basic, Ada. Основным элементом программы является оператор, который может быть простым (атомарным) или структурным. Простой оператор представляет собой целостное образование, никакая часть которого не является самостоятельным оператором. Выполнение такого оператора приводит к соответствующему единичному изменению состояния вычислительной системы. Структурный оператор объединяет в своем составе ряд других операторов в новый, более крупный оператор. Порядок исполнения «дочерних» операторов определяется объемлющим их структурным оператором. К числу структурных принадлежат, в частности, составной оператор, операторы выбора, цикла. Структурирование программы может быть выполнено посредством разделения её на подпрограммы: процедуры и функции. Подпрограммы могут иметь параметры и задавать локальные, используемые только внутри них определения, например, константы, переменные, типы, подпрограммы. Кроме того, подпрограммы могут вызывать себя рекурсивно. Функции, в отличие от процедур, всегда возвращают некоторые значения как результат их работы, что позволяет использовать их при вычислении выражений.
Основные особенности методологии объектно-ориентированного программирования.
Данная методология основа на использовании объектной декомпозиции, позволяющей представить разрабатываемую программу в виде совокупности объектов, в процессе взаимодействия которых посредством передачи определенных сообщений между объектами реализуется набор функций, обеспечивающих решение соответствующей задачи. При разработке программ в соответствии с объектно-ориентированным подходом применяются методы объектно-ориентированной декомпозиции, абстрактных типов данных и пересылки сообщений. Метод объектно-ориентированной декомпозиции заключается в выделении из предметной области объектов и отношений между ними в соответствии со спецификой решаемой задачи и целями разработки. Он основан на понятиях инкапсуляции, наследования и полиморфизма. Инкапсуляция представляет собой сокрытие внутренней структуры объекта и формирование «внешнего» интерфейса (набора операций) для взаимодействия с ним. Реализация инкапсуляции обеспечивается использованием метода абстрактных типов данных. Метод поддерживается концепцией абстрагирования. Наследование заключается в возможности построения иерархии объектов, младшие элементы которой наследуют структуру старших, при необходимости уточняя и дополняя её. Полиморфизм позволяет задать одно имя для операции, присущей сразу нескольким объектам иерархии, но реализуемой по-разному в зависимости от особенностей конкретного объекта. Метод пересылки сообщений, основанный на концепции сообщения, обеспечивает возможность описания процесса функционирования разрабатываемой программы в терминах обмена сообщениями между выделенными объектами.
Основной операцией, обеспечивающей изменение состояния вычислительной системы и решение требуемой задачи, является посылка сообщения объекту, реализующему необходимые действия. Сообщение описывает операцию, которую допустимо выполнить над объектом. Оно может иметь параметры, являющиеся в свою очередь объектами, характеризующие особенности операции. Структура объекта включает в себя набор полей и методов. Поля предназначены для хранения персональных для каждого объекта данных и могут содержать ссылки на другие объекты. Методы обеспечивают обработку сообщений, адресуемых объекту, и реализуют функции, поддерживаемые объектом. Абстрактное описание структуры объекта называется классом. Сам объект, задающий конкретное содержание этой структуры, называется экземпляром класса. Набор классов, представляющих поля и методы используемых объектов, а также способы их взаимодействия, определяет структуру программы. Методология объектно-ориентированного программирования наиболее пригодна для задач, в которых процесс решения можно описать посредством отношений между выделенным набором объектов функционирования.
Среди языков, предоставляющих средства для объектно-ориентированного программирования, можно выделить 3 группы. «Чистые» объектно-ориентированные языки изначально разрабатывались таким образом, чтобы обеспечить инструментарий для поддержки объектно-ориентированной методологии. Обычно они содержат небольшую языковую часть и существенную библиотеку классов поддержки, включающую средства для разработки программ различного назначения. К числу таких языков относятся Simula, Smalltalk, Self. «Гибридные» языки представляют собой развитие императивных языков, в которые добавлены средства поддержки объектно-ориентированного программирования. Примером таких языков служат Object Pascal и C++. «Адаптированные» языки можно рассматривать как развитие «гибридных» языков, из которых исключены средства, ненужные для объектно-ориентированного программирования. К таким языкам принадлежат Java и C#.
Основные особенности методологии функционального программирования.
Данная методология описывает подход к разработке программ, в которых выполняемые для решения задачи действия реализуются посредством вызовов функций, структурирование осуществляется за счет введения имен для функций и определения соответствующих им выражений, задающих способ вычисления значений функций, а для композиции действий используется оператор суперпозиции (подстановки) функций. Подход поддерживается методами аппликативности, рекурсивного поведения и настраиваемости. Метод аппликативности заключается в том, что программа строится как выражение, составленное из применения функций к аргументам. Программа состоит из совокупности определений функций, представляющих собой вызовы других функций, и предложений, управляющих последовательностью вызовов. Метод поддерживается концепцией функции. Метод рекурсивного поведения обеспечивает возможность реализации самоповторяющегося поведения через операции, которые инициируют «возвращение» к самим себе. Метод связан с понятием рекурсии. Метод настраиваемости заключается в том, что программные объекты могут порождаться по образцу, как значения соответствующих выражений. Это позволяет описывать функции посредством индуктивных определений. Таким образом, программы представляют собой выражения и выполнение программ осуществляется за счет вычисления этих выражений.
Прикладная область функционального программирования связана с теми задачами, решение которых трудно сформулировать в виде последовательности операций, приводящих к получению результата. В эту область попадает большинство задач, связанных с проблематикой искусственного интеллекта
Специфика языков, поддерживающих средства функционального программирования, заключается в ряде следующих особенностей. Функции являются базовыми элементами программы. На них можно ссылаться посредством переменных, их можно включать в используемые в программе структуры данных, передавать в качестве аргументов в другие функции и возвращать как результат вычислений. Функции обмениваются между собой данными непосредственно, без использования промежуточных переменных и присваиваний. Переменные получают своё значение один раз и в дальнейшем его не меняют. Отсутствие присваиваний приводит, в частности, к тому, что циклы в функциональных языках реализуются посредством использования рекурсивных функций. Кроме того, обращение к функции не вызывает иного эффекта, кроме вычисления её результата. Соответственно нет возможных побочных последствий, связанных, например, с изменением значения глобальной переменной, способных привести к тому, что одна и та же функции от одного и того же аргумента вернет разные значения в разные моменты времени. Отсутствие побочных эффектов обеспечивает возможность вычисления независимых друг от друга функций (частей выражений) в произвольном порядке или параллельно, поскольку на конечный результат это не повлияет. Еще одной особенностью многих функциональных языков являются так называемые «ленивые» или отложенные вычисления. Суть их состоит в том, что аргумент функции или часть выражения вычисляется только в том случае, если это необходимо для получения значения функции или выражения. Функциональные языки позволяют определять одни функции посредством других. Такие функции называются функционалами или функциями высших порядков. Их результат зависит от того, какие функции переданы в качестве аргументов. Эти особенности позволяют в том числе достичь высокой степени модульности программ, предоставляя возможность коллективной разработки и повторного использования кода. К языкам, обеспечивающим средства функционального программирования, относятся, в частности, Lisp, Scheme, ML, Haskell, Caml.
Основные особенности методологии логического программирования.
В соответствии с этим подходом программа представляет собой описание проблемы в терминах фактов и логических формул, решение которой выполняется системой с помощью аппарата логических выводов. Вывод производится автоматически на основании заданных утверждений в соответствии с используемым формальным аппаратом. В основе методологии лежат метод единообразного применения механизма логического доказательства ко всей программе и метод унификации, определяющий процедуру сопоставления с образцом для формирования и декомпозиции структур данных. Математической основой логического программирования является аппарат математической логики, в частности логики первого порядка. В соответствии с этим, для выражения действий в программах применяется математическое понятие отношения или предиката.
Логическая процедура соответствует математическому понятию отношения. Поскольку при определении отношения не указывается какие элементы являются исходными, а какие производными (результатами), то это позволяет формировать запросы, в которых одни и те же аргументы играют разные роли, в одних случаях являясь исходными данными, а в других — величинами, подлежащими нахождению. Кроме того, логическая процедура может возвращать любое количество ответов на запрос: от нуля (нет ответов) до бесконечности. Эти особенности позволяют с успехом использовать логические программы для таких задач, как работа с базами данных, синтаксический анализ и разбор текстов, решение различных комбинаторных проблем.
Большинство из существующих языков логического программирования представляют собой разновидность языка Prolog. Программа на языке Prolog состоит из совокупности предложений, описывающих свойства объектов предметной области и отношения между ними. Свойства и отношения называются предикатами. Основным синтаксическим элементом программы является терм. Терм — это константа, переменная или составленное из других термов выражение. Константы делятся на числа и атомы, представляющие собой набор символов. Они используются для именования конкретных объектов предметной области и отношений между ними. Составной (или функциональный) терм — это структура вида атом([терм1, …, термn]). Атом перед скобками называется функтором, а термы в скобках — аргументами или компонентами. Каждый предикат определяется последовательностью предложений, которую называют процедурой. Предложение может принадлежать к одному из двух типов: фактам или правилам. Факты определяют аксиомы, то есть предложения, которые всегда истинны. Правила задают логические связи между предикатами в форме «если–то». В общем случае структура предложения имеет следующий вид: терм0[:– терм1, …, термn].
где терм0 — заключение, называемое также заголовком правила, а терм1, …, термn — посылки, составляющие тело правила и определяющие условия, при которых заключение истинно. Все термы в предложении рассматриваются как утверждения, истинность которых либо задана, либо требуется доказать. Факты состоят только из заключения и считаются верными при любых условиях. Правила включают одну или несколько посылок и интерпретируются следующим образом: если верны все посылки, то верно и заключение. Для доказательства утверждений в языке Prolog используются методы унификации и резолюций. Унификация — это сопоставление двух произвольных термов, содержащих переменные, с целью определения того, можно ли присвоить этим переменным такие значения, чтобы получилось два одинаковых терма. Метод резолюций состоит в последовательном доказательстве посылок, входящих в правило, для доказательства его заключения.
Основные особенности методологии программирования в ограничениях.
В соответствии с данной методологией программа представляет собой формализованное описание решаемой задачи. В программе определяется тип данных решения, предметная область решения и ограничения на значение искомого решения. Решение задачи выполняется и находится вычислительной системой. Методология ориентирована на двухуровневую архитектуру, включающую компонент ограничений и программный компонент. Компонент ограничений обеспечивает основные операции и состоит из системы выводов на фундаментальных свойствах набора ограничений. Операции, представляющие компонент ограничений, реализуются средствами программно-языкового компонента. В основу методологии положен метод описательной модели вычислений, согласно которому программа формируется в виде описания понятий и задач. Метод поддерживается концепцией модели.
Описание задачи в программе состоит из конечного набора переменных V = {v[1], …, v[n]}, соответствующих им конечных (перечислимых) множеств значений D = {D[1], …, D[n]} и совокупности ограничений C = {c[1], …, c[m]}. Ограничения представлены в форме утверждений, в которых в качестве параметров входят некоторые переменные из заданного набора V. Каждое ограничение может иметь вид, в частности, уравнения, неравенства или логического выражения. Решением задачи является набор значений A = {a[1], …, a[n]} переменных V из множеств D (a[i]ÎD[i]), удовлетворяющий всем заданным ограничениям C. Соответственно выполнение программы рассматривается как процесс нахождения значений переменных. При этом порядок удовлетворения отдельных ограничений несущественен. К задачам, которые можно сформулировать в представленной форме, относятся многие задачи исследования операций и искусственного интеллекта. Данный подход применяется в таких областях как анализ и понимание естественного языка, планирование, проектирование, прогнозирование, инженерные и экономические расчеты, компьютерная графика, работа с базами данных.
Программирование в ограничениях тесно связано с логическим программированием. Многие системы программирования в ограничениях представляют собой обычный Prolog-интерпретатор со встроенным механизмом для решения определенного класса задач с ограничениями. К языкам программирования в ограничениях относятся, например, УТОПИСТ, OPS5, OPL, Prolog III.
- Объектно-ориентированный подход к программированию: классы, объекты, инкапсуляция, наследование, полиморфизм.
Основные концепции и принципы объектно-ориентированного подхода к программированию.
Сущность объектного подхода заключается в преимущественном использовании декомпозиции объектов для описания и построения ПО. При этом функции такой программной системы выражаются через операции над объектами разных уровней иерархии, т.е. их декомпозиция существенно зависит от декомпозиции объектов. Под объектно-ориентированным подходом подразумевается объектный подход с ориентацией на описание объектов предметной области и построением их моделей, в котором в основном используются активные объекты, т. е. объекты, включающие программные части, способные находиться в процессе выполнения. Объектно-ориентированный подход к разработке ПО включает в себя три основных этапа:
Объектно-ориентированный анализ. Создается объектно-ориентированная модель предметной области программной системы, в которой модельные объекты представляют реальные или концептуальные объекты-сущности, а также определяются выполняемые над ними операции.
Объектно-ориентированное проектирование. Разрабатывается объектно-ориентированная модель ПО (системная архитектура) с учетом имеющихся требований, в которой определение всех объектов подчинено решению конкретной задачи.
Объектно-ориентированное программирование. Реализуется архитектура (модель) системы с помощью объектно-ориентированного языка программирования.
Объектно-ориентированное представление и декомпозиция программной системы основываются на принципах абстрагирования, инкапсуляции, модульности и иерархической организации. Абстрагирование сводится к формированию абстракций. Каждая абстракция фиксирует основные характеристики некоторого объекта, которые отличают его от других видов объектов и обеспечивают ясные понятийные границы. Абстракция концентрирует внимание на внешнем представлении объекта и позволяет отделить основное в поведении объекта от его реализации. Инкапсуляция содержит и скрывает реализацию объекта, которая обеспечивает его поведение. Инкапсуляция достигается с помощью информационной закрытости. Обычно скрывается структура объектов и детали их реализации. Модульность определяет способность системы подвергаться декомпозиции на ряд сильно связанных и слабо сцепленных модулей. Модули служат физическими контейнерами, в которых объявляются компоненты программной системы. Модульность определяет способ группировки логически связанных абстракций. Иерархическая организация предназначена для формирования из абстракций иерархической структуры. Иерархическая организация задает размещение абстракций на различных уровнях описания системы. Двумя важными инструментами иерархической организации в ООП являются: выделение отношений «общее-частное» и отношений «целое-часть». Чаще всего иерархия «общее-частное» строится с помощью наследования. Иерархия «целое-часть» базируется на отношении агрегации.
Объектно-ориентированный подход к программированию: понятие объекта и его характеристики, связи между объектами.
Объект — это конкретное представление абстракции. Класс определяет структуру и поведение похожих/подобных объектов, т.е. описывает их абстракцию. Объект обладает индивидуальностью, состоянием и поведением. Индивидуальность — это характеристика объекта, которая отличает его от всех других объектов. Состояние объекта представляет собой перечень всех его свойств/атрибутов и текущие значения каждого из них. Поведение характеризует то, как объект воздействует на другие объекты (или подвергается воздействию) в терминах изменений его состояния и передачи сообщений. Поведение объекта зависит от его состояния и набора соответствующих ему операций. Операция представляет услугу, которую объект предлагает для использования. Возможны пять типов операций над объектом: модификатор — изменяет состояние объекта; селектор — предоставляет доступ к состоянию, но не изменяет его; итератор — обеспечивает доступ к содержанию объекта по частям, в строго определенном порядке; конструктор — создает объект и инициализирует его состояние; деструктор — разрушает объект и освобождает занимаемые им ресурсы. Выполнение операции обеспечивает обработку соответствующего сообщения, которое может быть отправлено данному объекту. Средством реализации операций являются подпрограммы (методы). Таким образом, сообщение представляет собой вызов некоторой подпрограммы, реализующей одну из операций, присущих объекту. Набор подпрограмм, реализующих операции объекта, называется его протоколом или интерфейсом (сообщений).
Взаимодействие объектов зависит от отношений между ними, которые основываются на взаимной информации о разрешенных операциях и ожидаемом поведении. Наиболее значимы два вида отношений между объектами: связи и агрегация. Связь — это физическое или понятийное соединение между объектами. Связь обозначает соединение, с помощью которого объект-клиент вызывает операции объекта-поставщика (передает ему сообщения) или один объект перемещает данные к другому объекту. Различают четыре формы видимости между объектами: объект-поставщик глобален для клиента, объект-поставщик является параметром операции клиента, объект-поставщик является частью объекта-клиента, объект-поставщик является локально объявленным объектом в операции клиента. Агрегация представляет отношения объектов в иерархии «целое-часть» и обеспечивает возможность перемещения от целого (агрегата) к его частям (свойствам). Объект, являющийся частью (свойством) другого объекта (агрегата), имеет связь со своим агрегатом. Через эту связь агрегат может посылать ему сообщения. Агрегация может обозначать физическое вхождение одного объекта в другой, но не обязательно.
Объектно-ориентированный подход к программированию: понятие класса и его характеристики, отношения между классами.
Класс — описание множества объектов, которые разделяют одинаковые свойства, операции, отношения и семантику. Любой объект — просто экземпляр класса. В классе выделяют внешнее представление (интерфейс) и внутреннее устройство (реализацию). Интерфейс описывает возможности (услуги) класса, т.е. представляет внешней среде абстракцию класса, его «видимый» облик. Интерфейс состоит из объявлений операций, поддерживаемых экземплярами класса, объявлений типов, переменных, констант и исключительных ситуаций, уточняющих абстракцию, которую выражает класс. Интерфейс может быть разделен на три части: открытую или публичную (public), объявления которой доступны всем клиентам; защищенную (protected), объявления которой доступны только самому классу, его подклассам и друзьям; закрытую или приватную (private), объявления которой доступны только самому классу и его друзьям. Состояние объекта задается в его классе через определения констант или переменных, размещенных в его защищенной или закрытой части. Тем самым они скрыты (инкапсулированы) и их изменения не влияют на клиентов. Реализация класса отражает особенности его поведения. Она включает детальное описание (реализацию) всех операций, определенных в интерфейсе класса.
Абстракции каждой предметной области находятся между собой в различных отношениях, в результате чего формируется структура классов системы. Существует четыре основных типа отношений между классами: ассоциация — фиксирует структурные отношения, т.е. связи между экземплярами классов; зависимость — отображает влияние одного класса на другой; обобщение-специализация — отношения «общее-частное»; целое-часть — отношения агрегации/включения. Для выражения этих типов отношений большинство объектно-ориентированных языков поддерживает разные комбинации следующих видов отношений: ассоциация, наследование, агрегация, зависимость, конкретизация, метакласс, реализация. Ассоциация обозначает семантическую (смысловую) двустороннюю связь между классами. Она является наиболее общим и неопределенным отношением, поскольку не указывает направление и точную реализацию отношения. Наследование — отношение, при котором один класс разделяет структуру и поведение, определенные в другом (одиночное наследование) или в нескольких других классах (множественное наследование). Наследование представляет собой разновидность отношения обобщение-специализация. С наследование связано понятие полиморфизма. Полиморфизм — это возможность с помощью одного имени обозначать операции из различных классов, но относящиеся к одному суперклассу. Вызов обслуживания по полиморфному имени приводит к исполнению одной операции из некоторого набора, соответствующего иерархии наследования классов. Отношения агрегации между классами аналогичны таковым между объектами. Зависимость — отношение, которое показывает, что изменение в одном классе (независимом) может влиять на другой класс (зависимый), который использует его. Зависимость позволяет уточнить, какая абстракция является клиентом, а какая — поставщиком определенной услуги. Конкретизация — процесс наполнения или настройки шаблона (обобщенного или параметризованного класса) с целью получения класса, от которого возможно создание экземпляров. Конкретизация выражает другую разновидность отношения обобщение-специализация. Метакласс — класс классов, т.е. класс, экземпляры которого представляют собой классы. Реализация — отношение, при котором класс-приемник обеспечивает свою собственную реализацию интерфейса другого класса-источника.
- Стратегии разработки и технологичность программной системы.
Нисходящая и восходящая стратегии разработки программной системы.
В процессе проектирования и реализации программной системы как правило используется одна из следующих стратегий: нисходящая («сверху–вниз»), восходящая («снизу–вверх»), «расширения ядра» («изнутри к границам»), «формирования ядра» («от границ внутрь»).
В рамках нисходящего подхода проектирование и последующая реализация компонентов программной системы выполняется «сверху–вниз». Первоначально система представляется в виде абстрактного объекта, реализующего все функции, необходимые для решения требуемой задачи. Далее исходная задача разбивается на подзадачи и выделяются подсистемы, обеспечивающие функции, требуемые для их решения. Полученные подзадачи в свою очередь разделяются на более мелкие подзадачи, что позволяет выделить в подсистемах отдельные функциональные компоненты. Этот процесс продолжается до достижения необходимого уровня детализации создаваемой системы, на котором представлены компоненты, обеспечивающие реализацию элементарных функций. В соответствии с этой схемой выполняется и создание системы. При этом в процессе программирования компоненты нижних, еще не разработанных уровней заменяются специальными отладочными элементами — «заглушками». Это позволяет тестировать и отлаживать уже созданную часть системы.
Концептуальная схема нисходящей стратегии разработки программной системы
При использовании восходящей стратегии создание программной системы выполняется «снизу–вверх». Сначала определяются базовые, элементарные функции и разрабатываются соответствующие им программные компоненты самого нижнего уровня. Затем элементарные функции группируются в более комплексные функции, в результате чего происходит образование более крупных программных компонентов и подсистем на основе компонентов предыдущего уровня. Этот процесс продолжается до тех пор, пока не будет построена целостная программная система, обеспечивающая решение комплекса требуемых задач. При восходящем подходе компоненты нижних уровней часто организуются в специализированные библиотеки компонентов, реализующих логически связанные функции. По мере завершения разработки компонентов определенного уровня производится их тестирование и отладка. Только после этого выполняется сборка зависимых компонентов вышестоящего уровня. Для тестирования и отладки программных компонентов обычно проектируются и реализуются специальные тестирующие программы.
Концептуальная схема восходящей стратегии разработки программной системы
Стратегии «расширения ядра» и «формирования ядра» для разработки программной системы.
Подход к разработке программной системы на основе принципа «расширения ядра» или «изнутри к границам» представляет собой комбинацию двух предыдущих. Он предполагает первоначальное проектирование и разработку некоторой основы системы — её программного ядра, включающего компоненты, реализующие центральные, наиболее значимые функции. В дальнейшем ядро «наращивается» с использованием восходящего и нисходящего подходов. В соответствии с первым из них выполняется синтез новых, более крупных компонентов по принципу «изнури–вверх» с целью построения целостной системы, а нисходящий подход используется для декомпозиции существующих компонентов ядра по принципу «изнутри–вниз» с целью их детальной реализации.
Концептуальная схема стратегии «расширения ядра»
для разработки программной системы
Стратегия проектирования и разработки на базе принципа «формирования ядра» или «от границ внутрь» также является комбинацией нисходящего и восходящего подходов. В этом случае в начале определяются и разрабатываются компоненты на самом верхнем и нижнем уровнях детализации системы. Затем выполняется декомпозиция компонентов на верхнем уровне и синтез компонентов на нижнем уровне, в результате чего формируется промежуточный уровень, состоящий из компонентов, образующих функциональное ядро программной системы.
Концептуальная схема стратегии «формирования ядра»
для разработки программной системы
Технологичность программной системы и её характеристики.
При индустриальном подходе к разработке и сопровождению программных систем значительную роль начинают играть технологические характеристики создаваемых программ. Для обеспечения требуемых свойств разрабатываемой системы применяются специальные технологические приемы и определенные методики, которые включают в себя способы и правила декомпозиции системы, методы её проектирования, программирования и контроля качества.
Технологичность программной системы характеризует качество её проекта, определяющего совокупные материальные и трудовые затраты на реализацию и последующие изменения системы. Обеспечение высокой технологичности проекта особенно важно при разработке программной системы, рассчитанной на многолетнее интенсивное использование, или повышенных требованиях к качеству системы. Технологичность зависит от нескольких критериев.
1. Проработанность моделей программной системы. Чем лучше проработана модель создаваемой системы, тем четче определены решаемые подзадачи и используемые структуры данных для хранения входной, промежуточной и выходной информации, тем проще их проектирование и реализация и меньше вероятность ошибок, для исправления которых потребуются существенные изменения программ системы.
2. Уровень независимости модулей системы. Чем выше независимость модулей, тем проще они для понимания, разработки, модификации, тестирования и отладки.
3. Стиль программирования. Определяет стиль написания и оформления программ. Хороший стиль программирования способствует простоте чтения и понимания программы и снижению количества ошибок программирования.
4. Степень повторного использования программного кода. Увеличение степени повторного использования обеспечивается применением ранее созданных библиотек подпрограмм или классов и унификацией программных компонентов в ходе разработки. Однако, если степень повторного использования кода повышается искусственно, то технологичность проекта может существенно снизиться.
- Структурное программирование. Представление основных структур программирования: итерация, ветвление и повторение.
Структурное программирование можно определить как программирование, ориентированное на обеспечение простоты написания и понимания программ людьми, а не компьютерами. Оно преследует следующие цели: писать программы минимальной сложности, заставить программиста мыслить ясно, облегчить восприятие программы. Для достижения этих целей структурная программа должна удовлетворять следующим основным требованиям.
Текст программы должен представлять собой композицию трех основных конструкций: последовательное соединение (следование), условное предложение (ветвление) и повторение (цикл).
Употребление операторов перехода типа GOTO следует избегать всюду, где это возможно (если ограничения по объему и времени выполнения не критичны, то везде). Наихудшим применением GOTO считается переход на оператор, расположенный выше (раньше) в тексте программы.
По возможности следует отказаться от использования оператора ELSE Он обычно не является необходимым, поскольку эквивалентен оператору IF (not <условие>) THEN. Конструкция ELSE нужна только в той редкой ситуации, когда конструкция THEN изменяет одну из переменных в условии.
Программа должна быть написана в приемлемом стиле, облегчающем её понимание и модификацию.
Каждый модуль должен иметь ровно один вход и один выход.
Программа представляет собой простое и ясное решение задачи.
Управляющие конструкции структурных программ.
Структурные программы составляются из трех основных строительных конструкций управления вычислительным процессом:
следование — обозначает последовательное выполнение действий;
ветвление — соответствует выбору одного из двух вариантов действий в зависимости от условия (значения предиката);
цикл с предусловием — определяет повторение действий до тех пор, пока не будет нарушено заданное условие, выполнение которого проверяется перед началом каждого повторения.
Помимо базовых могут использоваться еще три управляющие конструкции, которые легко реализуются на их основе:
выбор — обозначает выбор одного варианта действий из нескольких в зависимости от значения некоторой величины или условия;
цикл с постусловием — определяет повторение действий до тех пор, пока не будет выполнено некоторое условие, проверка которого осуществляется после каждого повторения;
цикл с заданным числом повторений (счетный цикл) — определяет повторение действий указанное число раз.
Действия, являющиеся компонентами конструкций структурного программирования, представляют собой либо простые операторы используемого языка (например, операторы присваивания, ввода, вывода, вызова подпрограммы), либо фрагменты программ, являющиеся композицией основных управляющих конструкций.
Конструкции структурного программирования
Понятие стиля программирования и его характеристики.
Стиль программирования — это манера, в которой разработчик использует язык программирования при написании и оформлении текста программы. Хорошим считается стиль, облегчающий восприятие и понимание программы людьми. Стиль программирования характеризуется двумя основными показателями: ясностью программы и способом использования средств языка.
Следование принципу обеспечения ясности программы является основной предпосылкой для хорошего стиля программирования и требует при написании кода программы акцентирования внимания на простоте и понятности текста за счет игнорирования менее важных критериев, например, краткости или машинной эффективности. Для повышения ясности при написании программы необходимо придерживаться следующих основных правил.
Каждый объект программы должен иметь осмысленное, содержательное имя, определяющее его назначение.
Объекты программы не должны иметь похожие имена, например отличающиеся только регистром символов или один-двумя знаками. Нельзя также использовать в качестве имен ключевые слова языка и близкие к ним по написанию.
Следует избегать лишних промежуточных переменных.
Во избежание неоднозначности необходимо использовать скобки, поясняющие порядок выполнения операций.
Не следует размещать несколько операторов языка на одной строке.
Текст программы необходимо писать с использованием пропусков строк и отступов.
Текст программы должен быть прокомментирован во всех тех местах, где её понимание может быть затруднительным или смысл приведенного кода неочевиден. Комментарии должны содержать сведения, поясняющие код и отражающие цели выполнения тех или иных действий и последствия, к которым они приводят. Кроме того, рекомендуется использовать комментарии при объявлении объектов программы.
Следует придерживаться единого стиля при написании кода программы.
Если в практике применения языка программирования сложился более или менее определенный стиль оформления программ, то рекомендуется его использовать, если он не противоречит стандартам, принятым в организации или команде, в которой выполняется разработка.
Вторая важная характеристика стиля программирования определяется тем, как разработчик использует средства и возможности, предоставляемые языком программирования. Основная рекомендация относительно применения средств языка заключается в том, что необходимо изучить и понять все возможности языка и избегать тех из них, которые могут уменьшить ясность программы, в частности связанных с плохо продуманными или реализованными особенностями и зависящих от выполнения различных трюков.
- Формальные средства представления управляющих процессов в структурных программах (блок-схемы, FLOW –формы, диаграммы Насси-Шнейдермана).
Блок-схемы (структурные схемы) и их конструкции.
Для описания программ с помощью блок-схем используются следующие основные конструкции.
Основные конструкции для формирования блок-схем
1) Блок «Оригинатор / терминатор». Используется для обозначения начала и окончания структурной схемы. Каждая схема должна начинаться и завершаться этой конструкцией.
2) Блок «Процесс». Применяется для обозначения одного или нескольких действий, обеспечивающих изменение (обработку) данных, их формы представления или месторасположения. Для улучшения наглядности схемы несколько таких блоков могут быть объединены в один.
3) Блок «Решение». Используется для представления операции передачи управления в соответствии с заданным условием. Для каждого такого блока должны быть заданы собственно условие (вопрос), определяющее схему дальнейшего развития вычислительного процесса, а также возможные результаты проверки этого условия (ответы), соответствующие вариантам передачи управления.
4) Блок «Ввод / вывод». Применяется для обозначения операций, связанных с вводом или выводом данных. Отдельным логическим устройствам или функциям обмена данными должны соответствовать отдельные блоки. В каждом блоке указывается выполняемая операция, вид устройства или файла, а также тип участвующих в обмене данных.
5)–6) Блоки «Предопределенный процесс». Используются для обозначения вызовов подпрограмм. Блок с горизонтальной линией предназначен для описания обращений к подпрограммам, которые были специально разработаны для программы и которые представлены в документации своей структурной схемой. Блок с вертикальными линиями обозначает вызов внешних по отношению к программе подпрограмм, например входящих в состав окружения операционной системы.
7) Блок «Соединитель». Применяется в том случае, когда из-за большого размера необходимо разделить структурную схему на несколько частей, размещенных на отдельных листах бумаги. В этом случае в конце одного листа ставится данный блок, в который входит соединительная линия, а в начале следующего листа используется такой же блок, из которого соединительная линия выходит.
8) Блок «Комментарий». Позволяет включить в схему необходимые пояснения к тем или иным блокам. Большое количество подобных блоков может снизить наглядность структурной схемы.
Недостаток блок-схем относительно требований структурного программирования состоит в том, что они позволяют использовать в схемах неструктурные способы передачи управления, примером которых в программе является досрочный выход из цикла или применение оператора безусловного перехода типа GOTO.
Flow-формы (потоковые диаграммы).
Flow-формы представляют собой графическую нотацию, предназначенную для описания структурных программ с помощью вложенных друг в друга конструкций, устраняющих необходимость использования линий передачи управления и, тем самым, возможность представления неструктурных переходов в программе. Каждый элемент формы соответствует одной управляющей конструкции и изображается в форме прямоугольника, который может являться составляющей другого элемента и, в свою очередь, включать в себя некоторые другие части формы. Исходный прямоугольник, заключающий в себе всю форму, символизирует описываемую программу. Каждый элемент формы содержит текст на естественном или формальном языке, определяющий назначение этого элемента. Ниже приведены основные конструкции Flow-форм, применяемые при описании программ.
Основные конструкции Flow-форм