Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
Поскольку любой метод может быть переопределен, в документации должно говориться не только о том, что делает данный метод, но и о том, в каком контексте он вызывается. Ведь переопределенные методы обычно вызываются не клиентом, а самим каркасом. Таким образом, программист должен знать, какие условия выполняются, когда вызывается данный метод. Для абстрактных методов, которые пусты, в документации должно говориться о том, для каких целей предполагается использовать переопределяемый метод.
В сложных иерархиях классов поля и методы обычно наследуются с разных уровней. И не всегда легко определить, какие поля и методы фактически относятся к данному классу. Для получения такой информации нужны специальные инструменты, вроде навигаторов классов. Если конкретный класс расширяется, то каждый метод обычно сокращают перед передачей сообщения базовому классу. Реализация операции, таким образом, рассредоточивается по нескольким классам, и чтобы понять, как она работает, нам приходится внимательно просматривать весь код.
Методы, как правило, короче процедур, поскольку они осуществляют только одну операцию над данными, зато их намного больше. В коротких методах легче разобраться, но они неудобны тем, что код для обработки сообщения иногда "размазан" по многим маленьким методам.
Инкапсуляцией данных не следует злоупотреблять. Чем больше логики и данных скрыто в недрах класса, тем сложнее его расширять. Отправной точкой здесь должно быть не то, что клиентам не разрешается знать о тех или иных данных, а то, что клиентам для работы с классом этих данных знать не требуется.
Многие считают, что ООП является неэффективным. Как же обстоит дело в действительности? Мы должны проводить четкую грань между неэффективностью на этапе выполнения, неэффективностью в смысле распределения памяти и неэффективностью, связанной с излишней универсализацией.
1. Неэффективность на этапе выполнения. В языках типа Smalltalk сообщения интерпретируются во время выполнения программы путем осуществления их поиска в одной или нескольких таблицах и за счет выбора подходящего метода. Конечно, это медленный процесс. И даже при использовании наилучших методов оптимизации Smalltalk-программы в десять раз медленнее оптимизированных С-программ. В гибридных языках типа Oberon-2, Object Pascal и С++ отправка сообщения приводит лишь к вызову через указатель процедурной переменной. На некоторых машинах сообщения выполняются лишь на 10% медленнее, чем обычные процедурные вызовы. И поскольку сообщения встречаются в программе гораздо реже других операций, их воздействие на время выполнения влияния практически не оказывает.
Однако существует другой фактор, который влияет на время выполнения: это инкапсуляция данных. Рекомендуется не предоставлять прямой доступ к полям класса, а выполнять каждую операцию над данными через методы. Такая схема приводит к необходимости выполнения процедурного вызова каждый раз при доступе к данным. Однако если инкапсуляция используется только там, где она необходима (т.е. в тех случаях, когда это становится преимуществом), то замедление вполне приемлемое.
2. Неэффективность в смысле распределения памяти. Динамическое связывание и проверка типа на этапе выполнения требуют по ходу работы информации о типе объекта. Такая информация хранится в дескрипторе типа и он выделяется один на кл&сс. Каждый объект имеет невидимый указатель на дескриптор типа для своего класса. Таким образом, в объектно-ориентированных программах необходимая дополнительная память выражается в одном указателе для объекта и в одном дескрипторе типа для класса.
3. Излишняя универсальность. Неэффективность также может означать, что в программе реализованы избыточные возможности. В библиотечном классе часто содержится больше методов, чем это реально необходимо. А поскольку лишние методы не могут быть удалены, они становятся мертвым грузом. Это не влияет на время выполнения, но сказывается на размере кода.
Одно из возможных решений — строить базовый класс с минимальным числом методов, а затем уже реализовывать различные расширения этого класса, которые позволят нарастить функциональность. Другой подход — дать компоновщику возможность удалять лишние методы. Такие интеллектуальные компоновщики уже существуют для различных языков и операционных систем. Но нельзя утверждать, что ООП неэффективно. Если классы используются лишь там, где это действительно необходимо, то потеря эффективности из-за повышенного расхода памяти и меньшей производительности незначительна. Кроме того, надежность программного обеспечения и быстрота его написания часто бывает важнее, чем производительность.
Заключение
В этой лекции мы рассказали об объектно-ориентированном подходе к разработке ПО, а также о том, что послужило предпосылками к его появлению и сделало его популярным. Были рассмотрены ключевые понятия ООП - объект и класс. Далее были описаны основные свойства объектной модели - инкапсуляции, наследование, полиморфизм. Основными видами отношений между классами являются наследование, ассоциация, агрегация, метакласс. Также были описаны правила изображения классов и связей между ними на языке ТЛМЬ.
Вариант 1
1. Почему объектно-ориентированное программирование пришло на смену процедурному программированию?
□ программы, написанные с использованием ООП, выполняются на компьютере быстрее
□ использование ООП позволяет создавать не зависящие от платформы программы
□ ООП позволяет уменьшить сложность создаваемого ПО
□ ООП позволяет увеличить надежность создаваемого ПО
2. Что используется для описания поведения объекта?
□ поля П методы
П наследование
3. Инкапсуляция - это:
□ объединение данных и обрабатывающего их программного кода в одной логической структуре (классе)
□ сокрытие реализации класса и отделение его внутреннего представления от внешнего интерфейса
□ одно из базовых понятий ООП, которое позволяет расширять функциональность программы, не расширяя объектную модель этой программы
1. Что из перечисленного является классами, а что - объектами (отметьте классы):
П яблоко
П Иван Сидорович Петров
П легковой автомобиль
□ страховое свидетельство №113-043-429-18
2. Зачем нужен полиморфизм?
П полиморфизм используется для написания общего кода,
который будет одинаково работать с разными типами данных (объектами разных классов), при условии, что классы, от которых созданы эти объекты, имеют общего предка
П полиморфизм позволяет создавать в одном классе несколько методов с одинаковыми именами, но с разным набором параметров
П полиморфизм необходим в любой программе, использующей ООП. Без него невозможно написать программу на объектноориентированном языке программирования
3. Метакласс - это:
П базовый класс в дереве наследования. Все потомки этого класса расширяют или замещают его функциональность
П некоторый шаблон, который описывает свойства и поведение класса, подобно тому, как класс описывает свойства и поведение объекта
П класс, от которого наследуются все классы в дереве наследования. Любой из классов в программе обязательно является наследником этого класса (пример java.lang.Object)
2. Что из перечисленного является в классе «Лифт» внешним интерфейсом:
□ кнопки управления П разводка проводов
□ реакция на нажатие какой-либо кнопки П количество людей в лифте
П марка металла, из которого изготовлен трос
3> Множественным наследованием называют:
П ситуацию, когда у некоторого класса есть более чем один непосредственный наследник
О наследование, в котором участвует множество классов (более двух)
О отношение наследования, при котором класс-наследник расширяет или дополняет функциональность нескольких базовых классов
—==