51469

Объектно-ориентированный подход в программировании. Теоретические основы объектно-ориентированного программирования

Лекция

Информатика, кибернетика и программирование

Теоретические основы объектно-ориентированного программирования Составные части объектного подхода Задачи для самостоятельного решения по теме Теоретические основы объектно-ориентированного программирования Тестовые задания по теме Теоретические основы объектно-ориентированного программирования...

Русский

2015-02-03

435.5 KB

16 чел.

Тема 5.2. Теоретические  основы                                                                                                  объектно-ориентированного программирования

5.2.1.  Основные определения

5.2.2.  Понятия о ОО декомпозиции и о ОО моделях

5.2.3.  Объектная модель

5.2.4.  Составные части объектного подхода

5.2.5.  Задачи для самостоятельного решения по теме  «Теоретические  основы  

           объектно-ориентированного программирования»

5.2.6.  Тестовые задания по теме «Теоретические  основы     объектно-ориентированного программирования»

5.2.1. Основные определения

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

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

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

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

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

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

 

В основе объектно-ориентированной технологии программирования лежат ''три кита'':

 Инкапсуляция (encapsulation) – свойство объединять внутри одной структуры состояние и поведение.

 Наследование (inheritance) – основанная на иерархии способность классов включать в себя свойства и поведение классов-предков, а также добавлять к ним свое собственное поведение и свойства.

 Полиморфизм (polymorphism) – способность классов ''играть роль'' своих предков, сохраняя при этом свое собственное поведение.

 

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

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

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

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

В программе объект – это экземпляр некоторого класса объектов или просто класса. Так, автомобиль Audi 6 является экземпляром класса автомобилей данной модели, приемник Sony также будет представителем класса одноименных приемников. Таким образом, класс – это абстрактное понятие. На унифицированном языке моделирования – класс  можно отобразить в виде прямоугольника, разделенного на три части. В первой содержится имя класса, во второй – атрибуты, в третьей – методы (рис. 5.2.1-1).

           Рис. 5.2.1-1

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

При наследовании все атрибуты и методы родительского класса наследуются классом-потомком. Наследование может быть многоуровневым, и тогда классы, находящиеся на нижних уровнях иерархии, унаследуют все свойства (атрибуты и методы) всех классов, прямыми или косвенными потомками которых они являются. На рис. 5.2.1-1 класс B унаследует атрибуты и методы класса A и, следовательно, будет обладать атрибутами A, B, C и D и методами A, B, C и D, а класс C – атрибутами A, B, C, E, F и методами A, B и E.

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

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

 Таким образом, в процессе разработки объектно-ориентированных программ необходимо:

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

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

После своего создания экземпляр класса должен получить значения для всех своих полей. Разные экземпляры одного и того же класса могут иметь различные значения полей, но обладают одними и теми же методами. Поля класса недоступны для непосредственного обращения, в том числе, и  присваивания. Это сделано для повышения надежности программ. Вместо непосредственного присваивания значения полю объекта должно быть выполнено обращение к специальному методу соответствующего класса, который выполняет такое присваивание и осуществляет контроль корректности вводимого значения. Аналогичным образом, для прочтения значения поля могут также использоваться специальные методы класса. Для связи полей с методами чтения/записи их значений используются члены класса, называемые свойствами. Пользователь, вводя данные для записи их в полях объекта или считывая значения полей, имеет дело со свойствами, представляющими эти поля. Поэтому обычно используется термин «значения свойств» вместо термина «значения полей».

Итак, членами класса могут быть:

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

5.2.2. Понятия об объектно-ориентированной декомпозиции и об объектно-ориентированных моделях

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

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

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

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

 

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

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

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

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

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

  1. условные обозначения – язык для описания каждой модели;
  2. процесс – правила проектирования модели;
  3. инструменты – средства, которые ускоряют процесс создания моделей, и в которых уже воплощены законы функционирования моделей.

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

 

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

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

5.2.3. Объектная модель

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

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

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

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

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

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

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

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

Оглядываясь на историю развития программирования, нельзя не заметить две сменяющих друг друга тенденции:

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

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

Кроме того, в каждом следующем поколении менялись поддерживаемые языками механизмы абстракции. Языки первого поколения ориентировались на научно-инженерные применения, и словарь этой предметной области был почти исключительно математическим. Такие языки, как FORTRAN, были созданы для упрощения программирования математических формул, чтобы освободить программиста от трудностей ассемблера и машинного кода. Первое поколение языков высокого уровня было шагом, приближающим программирование к предметной области и удаляющим от конкретной машины. Во втором поколении языков основной тенденцией стало развитие алгоритмических абстракций. В это время мощность компьютеров быстро росла, а компьютерная индустрия позволила расширить области их применения. Главной задачей стало инструктировать машину, что делать: сначала прочти эти анкеты сотрудников, затем отсортируй их и выведи результаты на печать. Это было еще одним шагом к предметной области и удалением от конкретной машины. В конце 60-х годов с появлением транзисторов, а затем интегральных схем, стоимость компьютеров резко снизилась, а их производительность росла почти экспоненциально. Появилась возможность решать все более сложные задачи, но это требовало умения обрабатывать самые разнообразные типы данных. Такие языки как ALGOL-68 и затем Pascal стали поддерживать абстракцию данных. Программисты смогли описывать свои собственные типы данных. Это стало еще одним шагом к предметной области и удалением от привязки к конкретной машине.

В 70-е годы неадекватность более ранних языков написанию крупных программных систем стала очевидной, поэтому созданные новые языки имели механизмы, устраняющие это ограничение. Лишь немногие из этих языков смогли выжить, однако многие их принципы нашли отражение в новых версиях более ранних языков. Таким образом, мы получили языки Smalltalk, Ada, C++. Наибольший интерес для дальнейшего изложения представляет класс языков, называемых объектными и объектно-ориентированными, которые в наибольшей степени отвечают задаче объектно-ориентированной декомпозиции программного обеспечения и в первую очередь полностью объектно-ориентированные языка программирования VB и C#.

Для пояснения вышесказанного рассмотрим топологии (основные элементы языков программирования и их взаимодействие), характерные для каждого поколения.

На рис. 5.2.3-1 показана, типичная топология для большинства языков первого поколения и первой стадии второго поколения.

Рис. 5.2.3-1. Топология языков первого и начала второго поколения

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

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

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

 

Рис. 5.2.3-2. Топология языков позднего второго и раннего третьего поколения

Начиная с FORTRAN II и далее (языков конца третьего поколения), для решения задач программирования «в большом» начал развиваться новый важный механизм структурирования. Разрастание программных проектов означало увеличение размеров и коллективов программистов, а, следовательно, необходимость независимой разработки отдельных частей проекта. Ответом на эту потребность стал отдельно компилируемый модуль, который сначала был просто более или менее случайным набором данных и процедур (рис. 5.2.3-3).

Рис. 5.2.3-3. Топология языков конца третьего поколения

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

Топология объектных и объектно-ориентированных языков. Значение абстрактных типов данных в разрешении проблемы сложности систем хорошо выразил Шанкар: «Абстрагирование, достигаемое посредством использования процедур, хорошо подходит для описания абстрактных действий, но не годится для описания абстрактных объектов. Это серьезный недостаток, так как во многих практических ситуациях сложность объектов, с которыми нужно работать, составляет основную часть сложности всей задачи» Осознание этого влечет два важных вывода. Во-первых, возникают методы проектирования на основе потоков данных, которые вносят упорядоченность в абстракцию данных в языках, ориентированных на алгоритмы. Во-вторых, появляется теория типов, которая воплощается в таких языках, как Pascal.

Естественным завершением реализации этих идей, начавшейся с языка Simula и развитой в последующих языках в 1970-1980-е годы, стало появление таких языков, как Object Pascal, C++ и, наконец, C#. На рис. 5.2.3-4 приведена топология таких языков применительно к задачам малой и средней степени сложности. Основным элементом конструкции в указанных языках служит модуль, составленный из логически связанных классов и объектов, а не подпрограмма, как в языках первого поколения.
 

Рис. 5.2.3-4. Топология малых и средних приложений в объектных и объектно-

                     ориентированных языках.

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

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

Рассмотрим другой подход.

Традиционная компьютерная система, основанная на так называемой аппаратной архитектуре фон Неймана, может рассматриваться как множество функций (процедур) или процессов, работающих с набором данных. Эта статическая архитектурная модель показана на рис. 5.2.3-5.


Рис. . 5.2.3-5. Архитектура обычной компьютерной системы

Из рисунка видно, что в процессе работы системы динамика состоит в вызове, например, некоторой функции f(1), которая считывает соответствующие данные A, преобразовывает их и записывает в B. Потом вызывается некоторая другая функция f(2), которая тоже считывает некоторые данные (возможно, те же), использует их по назначению и записывает в C.

На рис. 5.2.3-6 показан совершенно иной архитектурный подход к системам.

Все данные, доступ к которым нужен функции, инкапсулируются в один пакет с этой функцией –  так называемый объект – таким образом, чтобы другой объект не имел доступа к этим данным. Можно рассматривать эти объекты как яйца. Желток – это структура данных, белки это функции, которые имеют доступ к этим данным, а скорлупа представляет сигнатуру общедоступных операций. Оболочка интерфейса скрывает реализацию и самих функций, и структур данных. Предположим, что в яйце, изображенном «в разрезе» на
рис. 5.2.3-6, изменилась структура данных. Тогда специалисты должны проверить только факт влияния изменений на белок этого яйца; сфера вмешательства локализована. Изменение реализации одного объекта не может затронуть “внутренность” другого. В этом и состоит
инкапсуляция: данные и процессы их обработки объединяются и скрываются за интерфейсом.


Рис. . 5.2.3-6. Архитектура объектно-ориентированной системы

Однако при использовании этой модели в чистом виде возникает проблема. Допустим, каждый объект содержит функции, которым нужны одинаковые данные. В таком случае появляется необходимость дублирования данных, и подход становится довольно непрактичным. Решение состоит в передаче сообщений между объектами. Тогда объект X сможет использовать данные A, но не инкапсулировать их. При условии, что в желтке X хранится идентичность другого объекта Y, который содержит необходимые данные, он может передать сообщение, запрашивающее эти данные или даже несколько преобразованную их версию. Это показано на рис. 5.2.3-7, где маленькая черная точка символизирует идентичность целевого объекта, а стрелки показывают направление передачи сообщения. Можно сказать, что это половина принципа объектной технологии. Вторая половина – это возможность классификации объектов и их связывания различными способами. Обратите внимание на то, что этот подход локализует и таким образом сильно упрощает исходную задачу.


Рис. 5.2.3-7. Передача сообщений исключает дублирование данных

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

С этими, основными идеями можно переходить к обсуждению понятий объектно-ориентированных методов.

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

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


   Наиболее значительный вклад в объектный подход внесен объектными и объектно-ориентированными языками программирования. Впервые понятия классов и объектов введены в языке
Simula 67. Внесение объектно-ориентированного подхода в С привело к возникновению языков C++. На основе языка Pascal возникли Object Pascal и Ada. Появились диалекты LISP, такие, как CLOS (Common LISP Object System), с возможностями языков Simula и Smalltalk.

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

Развивавшиеся достаточно независимо технологии построения баз данных также оказали влияние на объектный подход, в первую очередь благодаря так называемой модели «сущность-отношение» (ER, entity-relationship). В моделях ER, впервые предложенных Ченом, моделирование происходит в терминах сущностей, их атрибутов и взаимоотношений.


Что же такое объектно-ориентированное программирование?  Будем понимать его

следующим образом:

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

В данном определении можно выделить три части:

  1.  ООП использует в качестве базовых элементов объекты, а не алгоритмы (иерархия «быть частью»);
  2.  каждый объект является экземпляром какого-либо определенного класса; 
  3.  классы организованы иерархически.

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

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

  1. поддерживаются объекты, то есть абстракции данных, имеющие интерфейс в виде именованных операций и собственные данные, с ограничением доступа к ним.
  2. объекты относятся к соответствующим типам (классам).
  3. типы (классы) могут наследовать атрибуты супертипов (суперклассов)»

Поддержка наследования в таких языках означает возможность установления отношения «is-a» ("есть", "это есть", " - это"), например, красная роза - это цветок, а цветок - это растение. Языки, не имеющие таких механизмов, нельзя отнести к объектно-ориентированным. Карделли и Вегнер назвали такие языки объектными, но не объектно-ориентированными. Согласно этому определению объектно-ориентированными языками являются Smalltalk, Object Pascal, C++ и C#. Но, поскольку объекты и классы являются элементами обеих групп языков, желательно использовать и в тех, и в других методы объектно-ориентированного проектирования.

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

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

В данном определении содержатся две важные части. Объектно-ориентированное проектирование:

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

Именно объектно-ориентированная декомпозиция отличает объектно-ориентированное проектирование от структурного; в первом случае логическая структура системы отражается абстракциями в виде классов и объектов, во втором алгоритмами. Иногда используется аббревиатура ООПр, для обозначения метода объектно-ориентированного проектирования.

 

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

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

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

5.2.4. Составные части объектного подхода

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

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

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

  1. абстрагирование;
  2. инкапсуляция;
  3. модульность;
  4. иерархия.

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

  1. типизация;
  2. параллелизм;
  3. сохраняемость.

Называя их дополнительными, мы имеем в виду, что они полезны в объектной модели, но не обязательны.

Без такой концептуальной основы можно программировать на языке типа Object Pascal, C++, VB или C#, но из-под внешней «красоты» будет выглядывать стиль FORTRAN, Pascal или С. Выразительная способность объектно-ориентированного языка будет либо потеряна, либо искажена. Но еще более существенно, что при этом будет мало шансов, справиться со сложностью решаемых задач.

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

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

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

  1. Абстракция сущности (Объект представляет собой полезную модель некой сущности в предметной области);
  2. Абстракция поведения  (Объект состоит из обобщенного множества операций);
  3. Абстракция виртуальной машины (Объект группирует операции, которые либо вместе используются более высоким уровнем управления, либо сами используют некоторый набор операций более низкого уровня);
  4. Произвольная абстракция (Объект включает в себя набор операций, не имеющих друг с другом ничего общего).


         Необходимо стараться строить абстракции сущности, так как они прямо
соответствуют сущностям  предметной области.

Абстракция фокусируется на существенных с точки зрения наблюдателя характеристиках объекта.

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

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

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

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

Одна из ключевых абстракций в такой задаче - датчик. Известно несколько разновидностей датчиков. Все, что влияет на урожай, должно быть измерено, так что мы должны иметь датчики температуры воды и воздуха, влажности, рН, освещения и концентрации питательных веществ. С внешней точки зрения датчик температуры - это объект, который способен измерять температуру там, где он расположен. Что такое температура? Это числовой параметр, имеющий ограниченный диапазон значений и определенную точность, означающий число градусов по Фаренгейту, Цельсию или Кельвину. Что такое местоположение датчика? Это некоторое идентифицируемое место в теплице, температуру в котором нам необходимо знать; таких мест, вероятно, немного. Для датчика температуры существенно не столько само местоположение, сколько тот факт, что данный датчик расположен именно в данном месте и это отличает его от других датчиков. Теперь можно задать вопрос о том, каковы обязанности датчика температуры? Мы решаем, что датчик должен знать температуру в своем местонахождении и сообщать ее по запросу. Какие же действия может выполнять по отношению к датчику клиент? Мы принимаем решение о том, что клиент может калибровать датчик и получать от него значение текущей температуры.

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

  1. атрибуты, такие как объем, положение или цвет, символизируют связи с другими объектами и состояние самого объекта;
  2. процедуры или услуги, предоставляемые объектом, такие как перемещение или расширение, их обычно называют операциями или методами;
  3. правила, которые устанавливают взаимосвязи свойств объекта или определяют условия его жизнеспособности,  Их иногда называют инвариантами.

Строго говоря, методы являются функциями, которые реализуют операции, а операции – это абстрактные спецификации методов. В традиционном объектно-ориентированном программировании атрибуты не являются видимыми для других объектов, однако это условие можно ослабить, что даст существенные преимущества. Идея пакетирования функций с данными тесно связана с понятием типа данных в традиционных языках программирования, где число 3 это экземпляр «типа» integer (целое число), а целые числа характеризуются только одним атрибутом (их значением) и несколькими допустимыми арифметическими операциями. Действительные числа характеризуются похожими операциями, но реальное осуществление умножения для чисел с плавающей точкой совершенно отличается от способа реализации этой операции для целых чисел. Аналогично задавая параметры и методы, можно трактовать более сложные объекты, часто встречающиеся в моделях данных. Слово «метод» в данном же контексте метод (method) определяется как процедура или функция, которая изменяет состояние объекта или заставляет объект отправить сообщение. Описание или сигнатура метода называется операцией (operation). Операции показывают, какие сообщения объект может успешно обрабатывать.

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

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

Инкапсуляция. Структуры данных и элементы реализации метода объекта являются невидимыми для других объектов в системе. Единственный путь получения доступа к состоянию объекта – это передача сообщения, вызывающего один из его методов. Строго говоря, доступ к атрибутам осуществляется через методы, которые считывают и устанавливают их значения. Другими словами, атрибуты – это словарь, с помощью которого можно обсуждать видимое извне поведение объекта. Вообще говоря, в программировании это обеспечивает эквивалентность объектного и абстрактного типов данных. Однако для полного описания объекта необходимо также четко определить его интерфейс. Некоторые методы объекта могут быть скрыты за интерфейсом – это закрытые методы. Интерфейс лучше всего рассматривать как общедоступное описание обязанностей объекта. Атрибуты могут быть рассмотрены как обязанность знания, а операции – как обязанность действия. Другими словами, можно сказать, что общедоступный интерфейс определяет вопросы, которые можно задать объекту, и программы действия, которые можно ему предложить. Такое представление объекта – иногда его называют “очеловечиванием” – позволяет рассматривать данный объект как маленького искусственного человечка, способного поддерживать диалог с другими особями и размышлять о собственных характеристиках. Это представление очень удобно на этапе выделения требований и анализа систем.

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

Наследование. Причину важности наследования можно понять, рассмотрев аналогию с вареным яйцом. Выше было показано, что сопровождение системы может быть упрощено, а необходимые изменения локализованы, потому что реализация скрыта от других объектов за интерфейсом. Следовательно, это преимущество предполагает, что интерфейс никогда не изменится. Однако наш мир не идеален. Технические требования меняются. Таким образом, интерфейс может подвергаться изменениям и (в связи с обновлением технологии) даже большим, чем при традиционных методах разработки. Ответ – это издание законов, запрещающих изменение интерфейсов и настойчиво требующих, чтобы видоизменения затрагивали только подклассы, которые расширяют или, возможно, заменяют свойства имеющихся объектов. Любое отклонение от этого режима должно рассматриваться как базовая перестройка архитектуры системы. Это правило предполагает, что классы пред назначены для расширения, и укрепляет позиции объектно-ориентированного анализа и проектирования. Экземпляры (обычно) наследуют все свойства классов (и только их), которым они принадлежат. Это называется классификацией (classification). Но в объектно-ориентированной системе можно дать возможность классам наследовать свойства более общих суперклассов. В этом случае унаследованные свойства могут перекрываться, кроме того, для обработки исключительных ситуаций могут вводиться дополнительные свойства. Наследование реализует идеи специализации (specialization) и абстракции (abstraction) и представляет частный случай структурной взаимосвязи между группами классов. Наследование — это только одна из абстрактных структур, с помощью которой мы упорядочиваем мир; но она чрезвычайно важна, и ее важность соответствует важности глагола to be в английском языке. Позже будет рассмотрена еще одна ключевая структура – композиция (соответствующая глаголу to have).

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

 

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

  1. Инкапсуляция
  2. Наследование

Как всегда, когда мы имеем дело с дихотомией, инкапсуляция и наследование не являются четко разделенными понятиями; между этими абстракциями существует некоторое противостояние и взаимное притяжение. Наследование может нарушать принцип повторного использования, потому что подобъекты могут иметь привилегированный доступ к реализации методов других подобъектов. Таким образом, некоторые термины, такие как полиморфизм, можно отнести к обеим категориям, а наследование можно даже рассматривать как форму абстракции. Общие и отличные свойства абстракции и наследования рассмотрены в разделе 1.3.3. Другие авторы при описании общей концепции предпочитают использовать термин “абстракция”, а не “инкапсуляция”. В данной книге эти термины взаимозаменяемы, и трудно сказать, какая точка зрения является более предпочтительной.

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

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

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


5.2.5.  Задачи для самостоятельного решения по теме  
«Введение   в объектно-ориентированное программирование»

  1.  В n разных  школах г. Москвы  (номера  школ известны)  проведен анонимный опрос  m   школьников 6 классов  (числа n и m известны).  Школьникам задавался вопрос,  курят ли они.  В опросе  участвовали  как мальчики, так  и девочки. Результаты  опроса поступали  неупорядоченными  по школам.   Определить школы  с    максимальным процентом курящих отдельно по мальчикам и девочкам. Предусмотреть проверку правильности  ввода   информации.
  2.  Известны фамилии n сотрудников больницы (n - заданное число). Сотрудники работают по индивидуальному графику (1-й день - утро, 2-й день - вечер, 3-й день - выходной). В первое число месяца известно, в какую смену работает каждый сотрудник или имеет выходной. Составить алгоритм и программу, которые позволяют на любое заданное число месяца напечатать пронумерованный список сотрудников, имеющих выходной. Считать, что в месяце 30 дней.
  3.  Известны названия m предприятий города, производящие по n наименований различных изделий, для которых известны  количества их выпуска в год. Составить алгоритм и программу, которые  по наименованию изделия определяют название предприятия, производящего максимальное количество этого изделия, а также  печатают список предприятий, на которых это изделие производится, располагая названия этих предприятий в порядке убывания объема  выпуска данного изделия.
  4.  Список n рабочих цеха (n – заданное число) содержит следующие сведения о каждом: фамилия, числовой номер бригады, зарплата. Список не имеет определенной упорядоченности. Составить алгоритм и программу, которые выводят на экран списки рабочих по бригадам, располагая фамилии в порядке убывания зарплаты, и, кроме того, определяют и печатают значения средних зарплат по бригадам.
  5.  Пароходство  владеет    n  пассажирскими теплоходами (n и названия теплоходов заданы),  каждый из которых   имеет   каюты люкс на 1 и 2 палубах,  первого  класса на 2 и 3 палубах,  второго класса на 3 и 4 палубах  и третьего класса на 3 и 4 палубах. На каждом из теплоходов каюта  может быть занята,  забронирована или свободна. Составить алгоритм и программу для вывода по указанному пользователем теплоходу отдельно информации о количестве свободных кают и отдельно информации о количестве забронированных кают. Информацию выдать по каждой из палуб в порядке возрастания их номеров с указанием класса кают.
  6.  В течение месяца (30 дней) абоненты международной телефонной сети производили переговоры с m странами. Каждая страна имеет свой код и тариф за 1 мин.  Составить алгоритм и программу, которые печатают счета абонентам, в которых указывается телефон абонента, код страны, количество минут, стоимость каждого разговора и итог за месяц.  В общем списке абоненты представлены телефонными номерами, а для каждого разговора известна его продолжительность.
  7.  В чемпионате  по футболу приняло участие n команд (названия команд известны). Составить алгоритм и программу, которые определяют 4 команды, показавшие лучшие результаты, если известен счет каждого матча. При равных условиях лучшей считается команда, у которой разность между забитыми и пропущенными мячами лучше.
  8.  В течение года (12 месяцев) отслеживалось изменение курсов n  валют. Известны названия валют и их курс по отношению к рублю на последнее число каждого месяца. Составить алгоритм и программу, которые за каждый квартал определяют валюты, у которых  наблюдался наибольший и наименьший рост относительно среднего квартального курса данной валюты.

  1.  Имеются сведения о доходах пяти магазинов по дням в течение одного месяца (в месяце 30 дней). Составить алгоритм и программу, которые для каждого магазина определяют числа месяца и соответствующие им дни недели с минимальным доходом, учитывая, что по субботам и воскресеньям магазины закрыты, а первое число месяца - вторник.
  2.  В отделе кадров предприятия имеется список сведений о n сотрудниках. О каждом сотруднике известно: фамилия (в списке фамилии расположены  по алфавиту), номер отдела, должность, оклад и стаж работы. Составить алгоритм и программу, которые выводят списки фамилий сотрудников по отделам с указанием занимаемой должности,  оклада и стажа.
  3.  Каждый из 5пяти цехов завода составляет ежемесячную заявку на приобретение по M разных комплектующих деталей. В заявке указаны: наименование детали, требуемое количество и завод-изготовитель (поставщик). Составить алгоритм и программу, которые выводят сводные списки заказов деталей для рассылки по поставщикам, в которых указаны наименования деталей с указанием общего количества требуемых деталей.
  4.  В бюро по трудоустройству имеются сведения о N вакансиях на предприятиях города. О каждом  вакантном месте известно: название предприятия, должность, оклад, требуемое образование (высшее или среднее), предельный возраст. Составить алгоритм и программу, которые  по данным об образовании и возрасте печатают список вакансий, располагая их в порядке убывания окладов.
  5.  В префектуре имеются сведения о потребностях в улучшении жилищных условий 1500 семей. О каждой семье известно, на квартиру из скольких комнат она претендует. Составить алгоритм и программу, которые печатают список семей, получивших квартиры в новом доме, и список семей, оставшихся в очереди, если известно, что в  доме 100 квартир, из которых 30 однокомнатных, 40 – двухкомнатных и 30 – трехкомнатных.
  6.  Имеются сведения об урожаях зерна в  n регионах России за m лет.  Составить алгоритм и программу, которые  определяют самый урожайный и самый неурожайный годы и для каждого года печатают список регионов в порядке убывания полученного в них урожая.
  7.  Список участниц конкурса красоты содержит 12 фамилий. Каждый из 200 опрошенных называет трех претенденток, и определяет каждой из них одно из первых 3-х мест. Вывести на экран фамилию участницы, набравшей наибольшее число первых мест. Если таких участниц несколько, то вывести фамилии всех участниц.     
  8.  В типографии заказано n визитных карточек. Составить алгоритм и программу, которые определяют стоимость заказа, если первые 100 визиток стоят 5 руб. за штуку, а стоимость каждой последующей карточки   уменьшается соответственно на 1 коп.  
  9.  Список участниц конкурса красоты содержит 12 фамилий. Каждый из 200 опрошенных называет трех претенденток и определяет каждой из них одно из первых 3-х мест. Вывести на экран фамилию участницы, набравшей наибольшее число первых мест. Если таких участниц несколько, то вывести фамилии всех участниц.                                                                        
  10.  Для  каждого из  20 классов школы известно, сколько в них мальчиков и сколько девочек. Составить алгоритм и программу, которые выводят номера классов по убыванию процентного состава мальчиков и определяют процент девочек и мальчиков по школе в целом.                                             
  11.  В доме проводится остекление окон. Количество квартир в доме и количество комнат в каждой квартире (1, 2 или 3) известно. Составить схему алгоритма и программу, которые определяют, сколько м2  стекла надо закупить и общую стоимость стекла, если в трехкомнатной квартире площадь окон составляет 10 м2, в двухкомнатной – 7 м2, в однокомнатной – 5 м2, а стоимость 1 м2 стекла 200 руб.
  12.  Составить алгоритм и программу, которые выводят список фамилий школьников по убыванию их среднего балла за год, а также определяют процент отличников (все отметки 5) и процент хорошистов (отметки 5 и 4), если для каждого из 25 школьников известны итоговые оценки по 15 предметам.
  13.  Объем файла, подлежащего архивации, составляет S мегабайт. При архивации объем файла уменьшается: программой ZIP – на 30%, а программой ARJ – на 25%, после чего архив разбивается на дискеты по 1,44 мегабайт. Составить алгоритм и программу, определяющую необходимое количество дискет для архивации файла заданного объема в зависимости от типа выбранной программы архивации (тип программы архивации вводится).
  14.  Известны сведения о багаже авиапассажиров одного рейса (багаж характеризуется фамилией пассажира,  количеством вещей и общим весом). Составить алгоритм и программу, которые определяют средний вес багажа авиапассажира (в самолете занято n мест, но не все пассажиры имеют багаж), подсчитывают число пассажиров, у которых отсутствует багаж, и число пассажиров, у которых вес багажа превосходит средний вес, а также напечатают список фамилий пассажиров, у которых вес багажа превысил норму – S кг.
  15.  Имеется n партий микросхем одного вида. Из каждой партии отобрали  m микросхем и раздали для контроля работникам отдела в произвольном порядке, которые определяли ее годность или негодность. Для того чтобы вся партия была забракована, достаточно, чтобы из m выбранных микросхем были забракованы k. Составить алгоритм и программу, которые по итогам контроля определяют количество негодных микросхем в каждой партии и количество забракованных партий.  
  16. Каждое из n швейных предприятий области специализируется на выпуске традиционных для данного предприятия m видах швейной продукции. Составить алгоритм и программу, позволяющие для каждого вида продукции определить предприятия (их номера), выпускающие данный вид  продукции.
  17.  Для обслуживания международной конференции необходимо отобрать бригаду переводчиков, обладающих навыками синхронного перевода. В оргкомитет поступили предложения от М переводчиков, каждый из которых владеет двумя языками. Составить алгоритм и программу, которые производят отбор переводчиков, руководствуясь минимизацией расходуемых средств, если в бригаде обязательно должны быть по два переводчика с каждого из пяти заявленных на конференцию языков.                                   
  18.  Ежедневно частное предприятие по быстрой доставке почты имеет n заказов, каждый заказ характеризовался стоимостью Ti и директивным сроком доставки Li. За превышения директивного срока предприятие выплачивало из стоимости заказа штраф, размеры которого линейно пропорциональны (с коэффициентом b) количеству просроченных часов. Досрочное выполнение заказа поощрялось премией в размере а% от стоимости заказа. Составить алгоритм и программу расчета дохода, полученного предприятием  за месяц, если известны реальные сроки выполнения каждого из n заказов в каждый из 30 дней месяца.
  19.  Агент 007, отправляясь на задание, формирует багаж необходимых спецсредств, каждое их которых характеризуется определенной убойной силой и объемом. В целях конспирации объем дипломатического багажа ограничен. Составить алгоритм и программу, которые помогут сформировать багаж агента, т.е. производят выбор из М вариантов каждого средства то средство, которое обладает максимальной убойной силой, при этом учитывают, что суммарный объем всех выбранных средств не должен превышать заданный (S).    
  20.  При производстве радиоприемника используется n наименований элементов. На складе имеется по M элементов каждого типа, каждый из которых характеризуется эффективностью, стоимостью и весом. Составить алгоритм и программу, которые позволяют выбрать самую эффективную элементную базу, вычислив при этом стоимость и вес составляющих ее элементов.    

  1.  При расчете Единого социального налога (ЕСН) придерживаются следующей схемы: если сумма дохода нарастающим итогом за расчетный период не превышает  N руб., то на эту сумму начисляют k1% налога, если превышает, то на сумму N руб. начисляют k1% налога, а на сумму превышения  начисляют k2% налога(k1>k2). Составить алгоритм и программу, которые производят начисления ЕСН за год для l сотрудников предприятия, если имеются списки сотрудников с указанием сумм доходов по месяцам года, и печатают фамилии тех сотрудников, на доходы которых сумма налога превысила S руб.
  2.  В театральную кассу поступило n заявок (n задано) от школ города. Каждая заявка содержит название одного спектакля и необходимое количество билетов. Составить алгоритм и программу, которые на основании этих данных определяют популярность каждого спектакля и печатают их названия в порядке убывания количества заказанных на них билетов.     
  3.  Кондитерская фабрика получила заказ на изготовление l тортов. Каждый торт изготавливается из n ингредиентов. На складе имеется по m видов каждого ингредиента, которые характеризуются сортом и ценой. Составить алгоритм и программу, которые определяют общую стоимость заказа, если для его выполнения были выбраны самые дорогие ингредиенты, и печатают список выбранных ингредиентов с указанием сорта и цены, обозначив ингредиенты номерами. Стоимость изготовления одного торта S руб.
  4.  Фирма по ремонту квартир получила n заказов, каждый их которых характеризуется стоимостью Ti и сроком его выполнения Li. За превышение срока выполнения стоимость заказа уменьшается на величину, пропорциональную количеству просроченных дней, а досрочное выполнение заказа поощряется премией в размере а% от стоимости заказа. Составить алгоритм и программу, которые определяют сумму, полученную фирмой за выполнение всех n заказов, если реальные сроки их выполнения известны.
  5.  При установленном счетчике расхода воды тариф составляет 35 коп. за один литр. При отсутствии счетчика, плата за воду в месяц для одной семьи составляет  150 руб.  Составить алгоритм и программу, которые по известным  данным о ежедневном потреблении воды (в литрах) одной семьей за 30 дней месяца, определяют, что выгоднее – оплата по счетчику или без счетчика, а также  среднесуточный расход воды.                              
  6.  Для каждого из n студентов (фамилии известны)  в архиве хранятся сведения о 60 оценках, полученных им за все время обучения в институте. Составить алгоритм и программу, определяющие, имеет ли студент право получить «красный диплом», если на «красный диплом» нельзя иметь ни одной тройки, а четверок – не более 10%. Вывести на экран список фамилий студентов с указанием его средней оценки, а также список студентов, которые имеют право получить «красный диплом».                        
  7.  Кабельный завод выпускает N видов кабелей. Каждый вид кабеля характеризуется маркой и стоимостью его метра. К заводу обратилось M заказчиков на поставку определенного количества каждого вида кабеля. Составить алгоритм и программу, которые для каждой марки кабеля определяют общее количество заказа, а также печатают список предприятий-заказчиков с указанием суммы договора, располагая названия предприятий  в порядке убывания суммы договора.
  8.  При медицинском обследовании у N учащихся СПТУ был взят анализ крови на сахар. О каждом ученике известно: фамилия, группа и результат анализа. Составить алгоритм и программу,  которые печатают по группам списки учащихся с их результатами анализа, а также отдельный список учащихся, у которых уровень сахара в крови превышает норму, расположив фамилии в списке в порядке убывания результата анализа, считая, что допустимая норма уровня сахара в крови заданная величина.


5.2.6.  Тестовые задания по теме  

«Введение в объектно-ориентированное программирование»




 

А также другие работы, которые могут Вас заинтересовать

700. Общая характеристика WWW 124.5 KB
  История возникновения WWW, понятие гипертекста. Интерфейс Web-приложений при работе в сети Internet. Гипертекстовая информационная система World Wide Web. Базы данных Gopher и поисковая система Veronica.
701. Моделирование прохождения сигнала через некогерентный и когерентный приемные тракты 64.5 KB
  Формирование сигнала на выходе приемника с линейным детектором и с фазовым детектором. Наблюдение интерференции сигналов от целей, разделенных интервалом меньше длительности импульса. Оценка влияния длительности зондирующего импульса на разрешение сигналов по времени.
702. Технология составления интерактивного кроссворда средствами Excel 83 KB
  Набор названия или заголовка кроссворда. Заполнение скелета кроссворда. Создание рамочки клеток кроссворда.(вкладка Главная. Панель Шрифт). Проверки правильности результатов.
703. Реализация модели Ханойские башни 56.5 KB
  Разработать программу на языке C#, реализующую модель игры Ханойские башни. В данной курсовой работе спроектирована и разработана программа на языке C#, которая на основе запрошенных у пользователя входных данных моделирует Ханойские башни или позволяет разложить их вручную.
704. Особенности проведения корреляционно-регрессионного анализа 133 KB
  Используя метод наименьших квадратов определить наличие линейной зависимости между двумя признаками f1 и f2. Коэффициент линейной корреляции между признаками η.
705. Погрузочно-разгрузочные машины напольного действия и область их применения 35 KB
  Погрузочно-разгрузочные машины напольного действия предназначены для погрузки-выгрузки тарно-штучных, сыпучих грузов на транспортные средства, а также для перемещения на складах (складирование и сортировка).
706. Комплексная механизация и автоматизация погрузо-разгрузочных работ и складских операций с зерновыми грузами 43 KB
  Характеристика зерновых грузов и типы зернохранилищ. Зерновые склады по назначению подразделяются на заготовительные, перевалочные, производственные и базисные. Элеватор состоит из рабочей башни и силосных корпусов. КМАПРР и складские операции для вяжущих строительных материалов.
707. Лекарственные средства, влияющие на функции органов дыхания 58.5 KB
  Классификация лекарственных средств, влияющих на дыхание. Противокашлевые средства. Отхаркивающие средства. Бронхолитические средства. Аналептики прямого и рефлекторного действия.
708. Утренняя гигиеническая гимнастика 97 KB
  Сущность утренней гигиенической гимнастики. Методические указания к использованию физических упражнений в комплексах утренней гигиенической гимнастики. Комплекс упражнений утренней гигиенической гимнастики. Самоконтроль для занимающихся утренней гигиенической гимнастикой.