Пятница, 11.10.2024, 03:29

Я программист!
Меню сайта
Форма входа
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 4
    Гостей: 4
    Пользователей: 0

    Рассылки Subscribe.Ru
    Как я стал программистом
    Подписаться письмом

    Рассылки Subscribe.Ru
    Как заработать капитал на уникальном бизнесе
    Подписаться письмом

    Рассылки Subscribe.Ru
    Как хорошо потрабатывать без отрыва от роботы
    Подписаться письмом

    Занятие 4. Объектно-ориентированное программирование (2 часа)

    Основные положения

    Прототипом объектно-ориентированного программирования послужил ряд средств, входящих в состав языка SIMULA-67. Но в самостоятельный стиль оно оформилось с появлением языка SMALLTALK, разработанного А. Кеем в 1972 году и первоначально предназначенного для реализации функций машинной графики.

    В основе объектно-ориентированного стиля программирования лежит понятие объекта, а суть его выражается формулой:

    «объект = данные + процедуры»

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

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

    Инкапсуляция

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

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

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

    Наследование

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

    Наследование может быть единичным и множественным.

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

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

     

    Полиморфизм

    В процессе работы с объектами допускается полиморфизм — возможность использования методов с одинаковыми именами для обработки данных разных типов.

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

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

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

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

     

    Перегрузка функций

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

    Перегруженные функции отличаются типом и/или числом аргументов.

    Перегрузка функций в С++ м.б. осуществлена и в программах не использующих классы.

    См. "Функции"

    Перегрузка операций

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

    См. "Операторы"

    Виртуальные функции

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

    C++

    Вопрос "Как пишут хорошие программы на C++" очень похож на вопрос "Как пишут хорошую английскую прозу?" Есть два вида ответов: "Знайте, что вы хотите сказать" и "Практикуйтесь. Подражайте хорошему языку." Оба совета оказываются подходящими к C++ в той же мере, сколь и для английского - и им столь же трудно следовать.

    Б. Страуструп

    Язык C++ был разработан в начале 80-х годов Б. Страуструпом, сотрудником лаборатории Bell корпорации AT&T. Им была создана компактная компилирующая система, в которой за основу был взят язык С, дополненный элементами языков BCPL, Simula-67 и Algol-68. К июлю 1983 года появился язык С с классами, а чуть позднее — C++.

    Название C++ выдумал Рик Масситти. Название указывает на эволюционную природу перехода к нему от C. "++" - это операция приращения в C.

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

    ·      Как создаются объекты этого класса?

    ·      Могут ли эти объекты копироваться и/или уничтожаться?

    ·      Какие действия можно производить над этими объектами?

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

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

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

     

    Правила Правой Руки (Б. Страуструп)

     

    1.   Когда вы программируете, вы создаете конкретное представление идей вашего решения некоторой задачи. Пусть структура отражает эти идеи настолько явно, насколько это возможно:

    a.   Если вы считайте "это" отдельным понятием, сделайте его классом.

    b.   Если вы считайте "это" отдельным объектом, сделайте его объектом некоторого класса.

    c.   Если два класса имеют общим нечто существенное, сделайте его базовым классом. Почти все классы в вашей программе будут иметь нечто общее; заведите (почти) универсальный базовый класс, и разработайте его наиболее тщательно.

    2.   Когда вы определяете класс, который не реализует некоторый математический объект, вроде матрицы или комплексного числа, или тип низкого уровня, вроде связанного списка, то:

    a.   Не используйте глобальные данные.

    b.   Не используйте глобальные функции (не члены).

    c.   Не используйте открытые данные-члены.

    d.   Не используйте друзей, кроме как чтобы избежать [a], [b] или [c].

    e.   Не обращайтесь к данным-членам или другим объектам непосредственно.

    f.    Не помещайте в класс "поле типа"; используйте виртуальные функции.

    g.   Не используйте inline-функции, кроме как средство существенной оптимизации.

    Java

    В 1990 году сотрудник корпорации Sun Д. Гослинг на основе расширения C++ разработал объектно-ориентированный язык Oak, основным достоинством которого было обеспечение сетевого взаимодействия различных по типу устройств. Новая интегрируемая в Internet версия языка, получила название Java.

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

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

    Системы визуального ООП

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

    - Visual Basic

    - Delphi

    - C++Builder

    - Visual C++.