Объектно-ориентированное программирование: различия между версиями

Содержимое удалено Содержимое добавлено
→‎Общие замечания: исправлены списки
Строка 2:
== Общие замечания ==
 
Объектно-ориентированная парадигма программирования не нова. Её истоки восходят к Симуле-67, хотя первая полная реализация была в Smalltalk-80. ООП стало популярным во второй половине 80-х в таких различных языках, как Си-плюс-плюс, Objective C (другое расширение C), Object и Турбо Паскаль (Turbo Pascal), CLOS (ОО-расширение Лиспа), Eiffel, Ада (в её последних воплощениях) и недавно - — в Яве (Java). Эта работа сосредоточена на Си-плюс-плюс (C++), Обджект Паскале (Object Pascal) и Яве (Java), иногда упоминая и другие языки.
 
Ключевые черты ООП хорошо известны:
# Первая — '''инкапсуляция''' — это определение классов — пользовательских типов данных, объединяющих своё содержимое в единый тип и реализующих некоторые операции или методы над ним. Классы обычно являются основой модульности, инкапсуляции и абстракции данных в языках ООП.
 
# Вторая ключевая черта, — '''наследование''' — есть способ определения нового типа, наследуя элементы (содержание и методы) существующего и модифицируя или расширяя их. Это способствует выражению специализации и генерализации.
 
Ключевые черты ООП хорошо известны:
# Первая  — '''инкапсуляция'''  — это определение классов  — пользовательских типов данных, объединяющих своё содержимое в единый тип и реализующих некоторые операции или методы над ним. Классы обычно являются основой модульности, инкапсуляции и абстракции данных в языках ООП.
# Вторая ключевая черта,  — '''наследование'''  — есть способ определения нового типа, наследуя элементы (содержание и методы) существующего и модифицируя или расширяя их. Это способствует выражению специализации и генерализации.
# Третья черта, известная как '''полиморфизм''', позволяет единообразно ссылаться на объекты различных классов (обычно внутри некоторой иерархии). Это делает классы ещё более удобными и делает программы, основанные на них, легче для расширения и поддержки.
 
Инкапсуляция, наследование и полиморфизм  — фундаментальные свойства, требуемые от языка, претендующего называться объектно-ориентированным (языки, не имеющие наследования и полиморфизма, но имеющие только классы, обычно называются основанными на классах). Различные ОО языки используют совершенно разные подходы. Мы можем различать ОО языки, сравнивая механизм контроля типов, способность поддерживать различные программные модели и то, какие объектные модели они поддерживают.
 
''Алан Кей'' в свое время вывел пять основных черт языка Smalltalk - первого удачного ОО языка:
# '''Все является объектом.''' Объект как хранит информацию, так и способен ее преобразовывать. В принципе любой элемент решаемой задачи (дом, собака, услуга, химическая реакция, город, космический корабль и т.д.) может представлять собой объект. Объект можно представить себе как швейцарский нож: он является набором различных ножей и "открывашек" (хранение), но в то-же самое время им мы можем резать или открывать что-либо (преобразование).
 
# '''Программа - совокупность объектов, указывающих друг-другу что делать.''' Для обращения к одному объекту другой объект "посылает ему сообщение". Как вариант возможно и "ответное сообщение". Программу можно представить себе как совокупность к примеру 3 объектов: писателя, ручки и листа бумаги. Писатель "посылает сообщение" ручке, которая в свою очередь "посылает сообщение" листу бумаги - в результате мы видим текст (посыл сообщения от листа к писателю).
 
# '''Каждый объект имеет свою собственную "память" состоящую из других объектов.''' Таким образом программист может скрыть сложность программы за довольно простыми объектами. К примеру дом (достаточно сложный объект) состоит из дверей, комнат, окон, проводки и отопления. Дверь в свою очередь может состоять из собственно двери, ручки, замка и петель. Проводка так-же состоит из проводов, розеток и к примеру щитка.
 
''Алан Кей'' в свое время вывел пять основных черт языка Smalltalk - — первого удачного ОО языка:
# '''Все является объектом.''' Объект как хранит информацию, так и способен ее преобразовывать. В принципе любой элемент решаемой задачи (дом, собака, услуга, химическая реакция, город, космический корабль и  т. д.) может представлять собой объект. Объект можно представить себе как швейцарский нож: он является набором различных ножей и "«открывашек"» (хранение), но в то-же самое время им мы можем резать или открывать что-либо (преобразование).
# '''Программа - — совокупность объектов, указывающих друг-другу что делать.''' Для обращения к одному объекту другой объект "«посылает ему сообщение"». Как вариант возможно и "«ответное сообщение"». Программу можно представить себе как совокупность к примеру 3 объектов: писателя, ручки и листа бумаги. Писатель "«посылает сообщение"» ручке, которая в свою очередь "«посылает сообщение"» листу бумаги - — в результате мы видим текст (посыл сообщения от листа к писателю).
# '''Каждый объект имеет свою собственную "«память"» состоящую из других объектов.''' Таким образом программист может скрыть сложность программы за довольно простыми объектами. К примеру дом (достаточно сложный объект) состоит из дверей, комнат, окон, проводки и отопления. Дверь в свою очередь может состоять из собственно двери, ручки, замка и петель. Проводка так-же состоит из проводов, розеток и к примеру щитка.
# '''У каждого объекта есть тип.''' Иногда тип называют еще и классом. Класс (тип) определяет какие сообщения объекты могут посылать друг-другу.
# '''Все объекты одного типа могут получать одинаковые сообщения.''' К примеру у нас есть 2 объекта: синяя и красная кружки. Обе разные по форме и материалу. Но из обеих мы можем пить (или не пить, если они пустые). В данном случае кружка - — это тип объекта.
 
Самое лаконичное описание объекта предложил ''Буч'': "«Объект обладает ''состоянием'', ''поведением'' и ''индивидуальностью''"».
# '''Все объекты одного типа могут получать одинаковые сообщения.''' К примеру у нас есть 2 объекта: синяя и красная кружки. Обе разные по форме и материалу. Но из обеих мы можем пить (или не пить, если они пустые). В данном случае кружка - это тип объекта.
 
Самое лаконичное описание объекта предложил ''Буч'': "Объект обладает ''состоянием'', ''поведением'' и ''индивидуальностью''".
 
== Контроль во время компиляции и во время выполнения ==