Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы на вопросы по информатики.doc
Скачиваний:
537
Добавлен:
13.02.2016
Размер:
1.09 Mб
Скачать

1.5Языки без типов

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

1.6Языки программирования по способу определения типов данных

Ниже перечислены языки программирования по способу определения типов данных: 1) Языки с полиморфным типом данных. Одни языки не связывают переменные, константы, формальные параметры и возвращаемые значения функций с определёнными типами, поддерживая единственный полиморфный тип данных. В чистом виде таких языков не встречается, но близкие примеры — MS Visual Basic — тип variant, Пролог,Лисп — списки. В этих языках переменная может принимать значение любого типа, в параметры функции можно передавать значения любых типов, и вернуть функция также может значение любого типа. Сопоставление типов значений переменных и параметров с применяемыми к ним операциями производится непосредственно при выполнении этих операций. Например, выражение a+b, может трактоваться как сложение чисел, если a и b имеют числовые значения, как конкатенация строк, если a и b имеют строковые значения, и как недопустимая (ошибочная) операция, если типы значений a и b несовместимы. Такой порядок называют «динамической типизацией» (соответствует понятиюполиморфизм в ООП, полиморфный тип в теории типов). Языки, поддерживающие только динамическую типизацию, называют иногда «бестиповыми». Это название не следует понимать как признак отсутствия понятия типов в языке — типы данных всё равно есть. 2) Языки с неявным определением типов. Казалось бы, BASIC является примером языка без типов. Однако это строго типизированый язык: в нём различаются строковые типы (добавляется символ $), массивы (добавляется []) и числовые типы (ничего не добавляется). 3) Языки с типом, определяемым пользователем. Также хорошо известны языки, в которых типы данных определяются автоматически, а не задаются пользователем. Каждой переменной, параметру, функции приписывается определённый тип данных. В этом случае для любого выражения возможность его выполнения и тип полученного значения могут быть определены без исполнения программы. Такой подход называют «статической типизацией». При этом правила обращения с переменными, выражениями и параметрами разных типов могут быть как очень строгими (С++), так и весьма либеральными (Си). Например, в классическом языке Си практически все типы данных совместимы — их можно применять совместно в любых выражениях, присваивать значение переменной одного типа переменной другого почти без ограничений. При таких операциях компилятор генерирует код, обеспечивающий преобразование типов, а логическая корректность такого преобразования остаётся на совести программиста. Подобные языки называют «языками со слабой типизацией». Противоположнось им — «языки с сильной типизацией», такие как Ада. В них каждая операция требует операндовстрого заданных типов. Никакие автоматические преобразования типов не поддерживаются — их можно выполнить только явно, с помощью соответствующих функций и операций. Сильная типизация делает процесс программирования более сложным, но даёт в результате программы, содержащие заметно меньше труднообнаруживаемых ошибок.

29 Объектно-ориентированное программирование. Основные принципы

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

Определение ООП и его основные концепции

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

Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности — для этого требуется наличие наследования.

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

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

Основные понятия

Абстракция 

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

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

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

Класс 

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

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

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

Объект 

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

Полиморфизм 

Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Прототип 

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

Объектно-ориентированное программирование — это сравнительно молодая концепция, получившая широкое распространение только в середине 1980-х гг. До этого программирование было исключительно процедурным. Что отличает объектно-ориентированное программирование от процедурного? Отвечая на этот вопрос, можно выделить три основных принципа объектно-ориентированного программирования: абстракцию, инкапсуляцию, наследование. Главным преимуществом объектно-ориентированного подхода является широкое использование инкапсуляции. Инкапсуляция (или скрытие реализации) позволяет создавать программу в виде отдельных, в большей или меньшей степени изолированных блоков. Почему программу приходится разбивать на такие блоки? Вы имеете уже достаточный опыт в написании сценариев, чтобы понимать, что, каким бы опытным ни был специалист, проследить логику кода из более чем 3-5 тысяч строчек ему не удастся — это просто выше человеческих интеллектуальных способностей. Современные же программы образованы миллионами и десятками миллионов строчек кода. Естественно, что написать конкурентноспособный коммерческий продукт один человек вряд ли может. Над созданием программ работают группы кодеров, и порой весьма значительные (так, штат Microsoft — многие тысячи программистов и тестеров). Каждый из программистов в таких командах создает свой фрагмент кода. Далее все фрагменты объединяются в единый блок, производятся тестирование, отладка и т. д. Подумайте, если бы область видимости для всех фрагментов программы была единой — какие огромные проблемы возникли бы, например, из-за конфликта имен. Чтобы избежать этого, каждый программист должен был бы знать, как именно peaлизован участок кода, написанный его коллегой. А если переменных в программе тысячи? В этом случае основное время кодера ухолило бы на подбор идентификаторов, а не на создание алгоритма. Решением описанной проблемы является инкапсуляция кода. Инкапсулированный фрагмент программы может быть представлен в виде «черного ящика», получающего на входе данные и выдающего на выходе результат. Переменные и функции инкапсулированного кода обладают локальной видимостью, поэтому случайно изменить их извне невозможно. Это решает проблему конфликта имен. При использовании инкапсуляции кода программист совершенно не должен задумываться о том, какреали-зованы остальные блоки программы. Он должен знать лишь то, что блок X выполняет те или иные задачи, и иногда — в какой форме он принимает данные на обработку. Поэтому инкапсуляция значительно облегчает разработку программ — создать без нее код более чем из тысячи строчек очень сложно. Инкапсуляция присуща не только объектно-ориентированному программированию. Так, в процедурном программировании она реализуется, например, при помощи подпрограмм (как вы помните, в ActionScript подпрограммы называются функциями). Однако в объектно-ориентированном программировании ее применение значительно расширяется благодаря введению понятия объекта. Объект — это группа переменных и подпрограмм, объединенных в одну структуру по принципу выполняемых функций. В объектно-ориентированном программировании переменные объекта принято называть свойствами, а подпрограммы — методами. Свойства определяют состояние объекта, методы — его поведение. Методы, как правило, служат для изменения состояния объекта, т. е. при вызове нужным образом переопределяют его свойства, Свойства и методы объекта могут обладать разной степенью доступности. Они могут быть внутренними — при этом извне к ним нельзя получить доступ, допускающими только чтение, позволяющими чтение и переопределение, и наконец, доступными для чтения, удаления и переопределения. Разная степень доступности свойств позволяет минимизировать вероятность сбоя в работе всей системы при ошибочном удалении или переопределении одного из свойств. В ActionScript свойства и методы всех встроенных объектов защищены от удаления и перечисления циклом for—in, для большинства недопустимо также переопределение. Смысл введения понятия «объект» достаточно очевиден. Во-первых, все методы и свойства, выполняющие задачи одного типа, можно собрать в одном месте, что значительно повышает общую стройность программы. Во-вторых, возможно инкапсулировать переменные и подпрограммы. Польза от этого огромна. Например, слияние строк и объединение массивов выполняют методы с одним именем — concat(). Подобная перегруженность идентификатора возможна потому, что данные методы разделены по разным объектам. В-третьих, понятие объекта чрезвычайно близко к стереотипам нашего мышления, что делает программирование на объектно-ориентированном языке более интуитивным по сравнению с процедурным программированием. В этом проявляется одна из основных концепций объектно-ориентированного программирования — абстракция. Часто в программе должно быть несколько однотипных объектов. Создавать их копированием кода не очень технично, так как это приведет к увеличению размера программы. Обычно объекты формируются на базе шаблона, называемого классом, с использованием оператора new. Например, строка new Ball() создаст новый объект класса Ball. Объекты класса называют его экземплярами. Все методы и свойства, которые должны быть присущи объект, прописываются в его классе. Роль объекта и класса объектов не ограничивается объединением и инкапсуляцией переменных и подпрограмм. С ними связано второе важнейшее понятие объектно-ориентированного программирования — наследование. Наследование — это передача переменных и функций между двумя независимыми модулями программы. Зачем нужно наследование? Прежде всего, оно позволяет минимизировать размер программы, а также трудоемкость ее создания. Представьте, что вы решили написать собственный графический редактор и вам надо разработать инструменты Line и Rectangle. Очевидно, что часть методов в объектах, их реализующих, будет одинакова. Например, идентичны в них будут методы, рисующие прямую линию. Имеет смысл данные методы вынести в отдельный объект, а в объектах Line и Rectangle оставить пометку о том, что если методы с такими именами потребуются, то они должны быть позаимствованы в хранящем их объекте. При этом отпадает необходимость дважды переписывать один и тот же код, а также сокращается длина программы. Как вы помните, объекты создаются на базе определений классов. При этом часть свойств и методов может передаваться объекту непосредственно, а часть им наследуется. Непосредственно переносятся на объект те свойства и методы, которые должны иметь для каждого экземпляра класса индивидуальные значения. Те же компоненты определения класса, которые должны быть одинаковы для всех объектов, ими наследуются. Класс может наследовать свойства другого класса. При этом данный класс будет являться по отношению к объектам первого суперклассом. Вообше протяженность цепочки наследования может быть любой. В некоторых языках цепочка наследования может даже ветвиться. Важнейшей концепцией объектно-ориентированной модели является полиморфизм. Как следует из названия этого понятия, оно должно означать множественность форм. И действительно, полиморфизм обозначает способность объекта менять форму в процессе выполнения программы. Если вы новичок в программировании, приведенное описание принципов объектно-ориентированного программирования может показаться вам малопонятным. В этом случае попробуйте связать в своем сознании понятия объектно-ориентированного программирования с предметами из реальной жизни. Это можно сделать, так как объектно-ориентированное программирование разрабатывалось именно для того, чтобы «очеловечить» программирование, сделать написание программ более близким особенностям нашего мышления. Попробуем сопоставить понятия объектно-ориентированного программирования с обычным котом. Действительно, вполне можно считать, что идущий по крыше кот — это объект. Он обладает свойствами — окрасом, размером, возрастом и пр. Свойства кота делятся на индивидуальные (к примеру, цвет глаз) и присущие всему множеству (называемому в объектно-ориентированном программировании классом) котов (например, строение сердца). В свою очередь класс котов во многом схож с классом млекопитающих (например, количеством лап или способом вскармливания потомства) и, следовательно, является его подклассом. Любой класс может порождать подклассы, наследующие его свойства — так, в вид «кот домашний» входят тысячи самых разнообразных пород. В этом выражается концепция наследования. Коту присущи методы — алгоритмы, меняющие его свойства. К примеру, хлопок холодильника — безотказный метод, меняющий свойство положения кота на значение, совпадающее с координатой кухни. Чтобы позвать нашего питомца на обед, совсем не обязательно знать его анатомию и особенности нервной деятельности. Для этого достаточно владеть внешним «интерфейсным» методом «кис-кис». В этом заключается еще один важный принцип объектно-ориентированного программирования — инкапсуляция (или скрытие реализации). На действие одного и того же метода разные коты могут реагировать поразному. Так, услышав лай собаки, более осторожное животное залезет на дерево, а более смелое продолжит спать как ни в чем не бывало. В терминах объектно-ориентированного программирования подобное поведение объектов одного класса называется полиморфизмом.