Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора теория [3240 вопросов].doc
Скачиваний:
60
Добавлен:
15.06.2014
Размер:
3.2 Mб
Скачать

Visitor (Посетитель)

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

Аспект: операции, которые можно применять к объекту не меняя класс.

Применимость:

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

  • над объектами, входящими в состав структуры, надо выполнять разнообразные, не связанные между собой операции и вы не хотите «засорять» класс такими операциями. Посетитель позволяет объединить родственные операции, поместив их в один класс. Если структура объектов является общей для нескольких приложений, то паттерн посетитель позволит в каждое приложение включить только относящиеся к нему операции;

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

Memento (хранитель)

Проблема: необходимо зафиксировать механизм поведения объекта для реализации, например, механизма отката.

+ не раскрывает инфу, доступную только «хозяину», упрощая т.о. его структуру.

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

  1. Паттерны поведения. “Observer”. “State”.

Observer (Наблюдатель)

Назначение: определяет зависимость типа «один ко многим» между объектами т.о., что при изменении состояния одного объекта все зависящие от него оповещаются от этом и автоматически обновляются.

Аспект: множество объектов зависящие от другого объекта.

Применимость:

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

  • когда при модификации одного объекта требуется изменить другие и вы не знаете, сколько именно объектов нужно изменить;

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

State (Состояние)

Проблема: варьировать поведением объекта в зависимости от его внутреннего состояния.

+ локализует зависящие от состояния поведение и делит его на части, соответствующие состояниям, переходы между состояниями становятся явными.

  1. Паттерны поведения. “Strategy”. “Template Method”.

Определяет семейство алгоритмов, инкапсулируя их все и позволяя под­ставлять один вместо другого. Можно менять алгоритм независимо от клиента, который им пользуется.

Определяет скелет алгоритма, перекладывая ответственность за некото­рые его шаги на подклассы. Позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.

  1. Язык Java. Абстрактный тип данных, классы, интерфейсы. Способы определения и использования. Реализация наследования и полиморфизма.

  1. Язык Java. Создание и удаление объектов. Счётчик ссылок и сборка мусора.

  2. Язык Java. Обработка исключительных ситуаций.

  3. Язык Java. Базовый ввод-вывод.

  4. Язык Java. Основные контейнеры.

  5. Язык Java. Построение пользовательского интерфейса.

  6. Назначение и обл. применения объектно-ориентированной методологии.

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

Первым объектно-ориентированным языком программирования была Симула, воплотившая главные черты того, что Алан Кэй, один из авторов языка Smalltalk, впоследствии назвал объектно-ориентированным программированием.

Главные понятия и разновидности

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

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

Характерные признаки

Абстракция данных

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

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

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

Полиморфизм

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

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

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

Реализационный подход

Каждый объект в ООП имеет свой тип (класс). Класс представляет собой тип данных, имеющий в составе:

Свойства

Параметры объекта (конечно, не все, а только необходимые в программе).

Методы

Действия, которые можно выполнять над объектом такого типа, или которые сам объект может выполнять.

Концептуальный подход

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

Критика ООП

Исследование Thomas E. Potok, Mladen Vouk и Andy Rindos показало отсутствие значимой разницы в продуктивности разработки програмного обеспечения между ООП и процедурным подходом.

Кристофер Дэйт указывает на невозможность сравнения ООП и других технологий во многом из за отсутсвия строгого и общепризнанного определения ООП (C. J. Date, Introduction to Database Systems, 6th-ed., Page 650)

Александр Степанов, в одном из своих интервью, указывал на то, что ООП «методологически неправильно» и что «... ООП практически такая же мистификация как и искусственный интеллект...» ( [2]).

Фредерик Брукс (Frederick P. Brooks, Jr.) в своей статье «No Silver Bullet. Essence and Accidents of Software Engineering» (Computer Magazine; April 1987) Указывает на то, что наиболее сложной частью создания програмного обеспечения является " ... спецификация, дизайн и тестирование концептуальных конструкций, а отнюдь не работа по выражению этих концептуальных конструкций...". ООП (наряду с такими технологиями как искусственный интеллект, верификация программ, автоматическое программирование, графическое програмирование, экспертные системы и др), по его мнению, не является «серебрянной пулей», которая может снизить сложность разработки програмных систем. По его мнению "...ООП позволяет сократить только привнесённую сложность в выражение дизайна. Дизайн остаётся сложным по своей природе..."

  1. Назначение и обл. применения аспектно-ориентированной методологии.

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

Методология контекстно-ориентированного программирования была предложена группой инженеров исследовательского центра Xerox PARC под руководством Грегора Кикзалеса (Gregor Kiczales). Ими же был разработан первый, и наиболее успешный до сих пор, контекстно-ориентированный язык программирования AspectJ.

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

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

Все языки АОП предоставляют способы для выделения сквозной функциональности в отдельную сущность. Различие между ними заключается удобстве, безопасности и области применения средств, которые они предоставляют. Наиболее популярный на данный момент язык АОП — AspectJ. Используемые в нем понятия распространились на большинство языков АОП. Основные понятия AspectJ: Точка выполнения (англ. JoinPoint) — определенная точка выполнения программы.

Срез (англ. PointCut) — набор точек выполнения программы.

Применение (англ. Advice) — состоит из условий применения и реализации функциональности. Условия применения определяют до, после или вместо какого среза надо вставить требуемую функциональность.

Аспект (англ. Aspect) — модуль AspectJ.

Представление (англ. Introduction) — метод изменения структуры класса путем введения новых полей и методов, а также изменения иерархии наследования.

Аспе́ктно-ориенти́рованное программи́рование (англ. AOP) — это новая технология, позволяющая программистам компоновать программы из взаимно пересекающихся блоков (crosscutting concerns). AOP вводит в действие аспекты (aspects). Они инкапсулируют особенности поведения взаимно влияющих друг на друга классов в составе повторно используемых модулей.

В последней версии AspectJ от Xerox PARC Java-разработчики могут пользоваться всеми преимуществами модульной компоновки, предлагаемыми AOP. В этой статье читатель познакомится с AspectJ и интересными возможностями его использования в проектировании.

Стоит ли использовать AspectJ? Гради Буч описывает аспектно-ориентированное программирование как одно из трех направлений, которые в совокупности знаменуют начало фундаментальных изменений в способах проектирования и написания программного обеспечения (см. статью Through the Looking Glass). С ним вполне можно согласиться. Сфера действия AOP охватывает пространство проблем, непосильных для объектно-ориентированных и процедурных языков. Оно предлагает элегантные пути для реализации задач, решение которых сдерживалось из-за фундаментальных ограничений программирования. Было бы справедливо сказать, что AOP представляет собой одну из самых мощных абстракций в программировании с момента появления объектов.

Разумеется, для AspectJ есть некоторая «кривая обучения». Как в любом языке или расширении языка программирования, в нем есть свои тонкости, которые необходимо освоить, прежде чем задействовать всю мощь этого средства. Однако, «кривая обучения» не слишком крутая — по прочтении руководства пользователя и после проработки нескольких примеров можно составлять полезные аспекты. AspectJ воспринимается естественно, поскольку скорее заполняет пробел в знаниях по программированию, чем придает им новое направление. Способность AspectJ к «модулированию немодулируемого» должна найти достойное применение. Если вы пока не готовы использовать AspectJ в полном объеме для разработки, его на первых порах можно легко применить в отладке, не упуская благоприятных возможностей, предоставляемых этим расширением.