Главная страница
Навигация по странице:

  • ТЕХНОЛОГИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ 4.1. ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД

  • 4.2. ОСНОВНЫЕ ПОНЯТИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

  • 4.3. ПРИНЦИПЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ: ИНКАПСУЛЯЦИЯ, НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ

  • Windows

  • Лекции по программированию. Основные понятия классификация программного обеспечения


    Скачать 1.57 Mb.
    НазваниеОсновные понятия классификация программного обеспечения
    АнкорЛекции по программированию.doc
    Дата15.01.2018
    Размер1.57 Mb.
    Формат файлаdoc
    Имя файлаЛекции по программированию.doc
    ТипДокументы
    #14117
    КатегорияИнформатика. Вычислительная техника
    страница3 из 6
    1   2   3   4   5   6

    Раздел завершения finalization является необязательным и может присутствовать только вместе с разделом инициализации initialization. В разделе завершения располагается список операторов, которые будут выполняться при завершении модуля, что обычно происходит при окончании работы приложения. Разде­лы finalization модулей приложения выполняются в порядке, противоположном выполнению разделов initialization этих модулей.

    Раздел завершения используется, как правило, для освобожде­ния ресурсов, которые выделяются приложению в разделе инициа­лизации. Это гарантирует корректное завершение приложения, что особенно это важно, когда приложение заканчивается по возникно­вению исключительных ситуаций.
    ТЕХНОЛОГИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

    4.1. ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД

    В основу структурного подхода положены структури­зация и декомпозиция окружающего мира. Задача любой сложно­сти разбивается на подзадачи, а те, в свою очередь, разбиваются далее, пока каждая подзадача не станет простой, соответствующей модулю (подпрограмме), выполняющему строго одно действие. Методы структурного проектирования используют модули в каче­стве строительных блоков программы, а структура программы представляется иерархией подчиненности модулей.

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

    Объектно-ориентированный анализ (object-orientedanalysis) -это методология, при которой требования к системе воспринима­ются с точки зрения классов и объектов, выявленных в предметной области. Объектно-ориентированный анализ направлен на создание моделей реальной действительности на основе объектно-ориенти­рованного подхода.

    Объектно-ориентированное проектирование (object-orienteddesign) - это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приемы представления моде­лей, отражающих логическую (классы и объекты) и физическую структуру системы (процессы и деление на компоненты, файлы или модули), а также ее статические и динамические аспекты.

    Объектно-ориентированное программирование (object-orientedprogramming) - это технология реализации программ, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы об­разуют иерархию наследования.

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

    4.2. ОСНОВНЫЕ ПОНЯТИЯ

    ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

    Понятие объектно-ориентированного программирова­ния определяет три основные концепции, при соблюдении которых программа будет объектно-ориентированной:

    объектно-ориентированное программирование использует в каче­стве базовых элементов классы, порождающие объекты;

    в процессе выполнения программы может одновременно ис­пользоваться несколько объектов, порожденных от одного класса (экземпляров реализации класса);

    классы организованы иерархически (иерархия означает «быть частью»).

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

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

    Объект — это структурированная переменная типа класс, со­держащая всю информацию о некотором физическом предмете или реализуемом в программе понятии. Все объекты - представители данного класса аналогичны друг другу в том смысле, что они име­ют один и тот же набор операций - методов.

    Объект, как логическая единица, содержит следующие данные и операции (методы с кодом алгоритма) в отдельном участке памяти:

    поля объекта (или атрибуты исходных данных), значения кото­рых определяют текущее состояние объекта;

    методы объекта, которые реализуют действия (выполнение ал­горитмов) в ответ на их вызов в виде преданного сообщения;

    свойства — часть методов, которые определят поведение объек­та, то есть его реакцию на внешние воздействия.

    При объявлении классов определяются описанные выше три характеристики объектов: поля, методы и свойства, а также указы­вается предок данного класса.

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

    4.3. ПРИНЦИПЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ: ИНКАПСУЛЯЦИЯ, НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ

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

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

    Принцип инкапсуляции использовался в технологии модульно­го программирования. В модуле в явной форме введена инкапсуля­ция путем разделения его на секции интерфейса и реализации.

    В объектно-ориентированном программировании принцип ин­капсуляции используется для изоляции класса от остальных частей программы, чтобы сделать его самодостаточным для решения кон­кретной задачи. Например, класс TFormв среде Delphiсодержит (инкапсулирует в себе) все необходимое для создания Windows-окна, класс ТМето представляет собой полнофункциональный тек­стовый редактор, класс TTimerобеспечивает работу программы с таймером и т. д.

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

    класса. Инкапсуляция позволяет защитить по интерфейсу доступ к полям и методам. Доступ разре­шается лишь к открытым методам и полям. Полная совокупность методов и тонкости их реализаций являются скрытыми.

    type

    TMyClass = class

    IntField: Integer;

    function MyFunc(a: Integer): Integer;

    procedure MyProc; end;

    Путем использования принципа инкапсуляции появляется воз­можность осуществлять обмен готовыми к работе программными заготовками. Например, библиотека классов Delphi - это, фактиче­ски, набор кирпичиков для построения прикладных программ.

    Наследование. Число абстракций в сложных программных системах намного превышает наши возможности их осознания. Инкапсуляция частично помогает устранить это препятствие, уби­рая из поля зрения внутреннее содержание абстракций.

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

    Принцип наследования оперирует с понятиями «предок - потомок» и предусматривает расширение набора свойств наследника за счет принятия всех свойств предка.

    Любой класс может быть порожден от другого класса. Для это­го при его объявлении указывается имя класса-родителя:

    TChildCIass = class (TParentClass )

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

    Все классы в ObjectPascalпорождены от единственного роди­теля - класса TObject. Этот класс не имеет полей и свойств, но включает в себя методы самого общего назначения, обеспечивающие весь жизненный цикл любых объектов - от их создания до уничтожения. Поэтому программист не может создать класс, кото­рый не был бы дочерним классом TObject. Следующие два объяв­ления идентичны.

    TaClass = class(TObject) <==> TaClass = class

    Принцип наследования приводит к созданию ветвящегося дере­ва классов. Каждый потомок дополняет возможности своего роди­теля новыми и передает их своим потомкам. Например, класс TPersistentобогащает возможности своего родителя TObjectтем, что он умеет сохранять данные в файле и получать их из него, в резуль­тате это умеют делать и все его потомки. Класс TComponent, в свою очередь, умеет взаимодействовать со средой разработчика и пере­дает это умение своим потомкам. TControlне только способен ра­ботать с файлами и средой разработчика, но он еще умеет созда­вать и обслуживать видимые на экране изображения, а его потомок TWinControlможет создавать Windows-окна и т. д.

    В ObjectPascalвозможно только так называемое одиночное на­следование, но в реальном мире у потомка два родителя, поэтому в ряде языков (например, в C++) предусмотрен механизм множест­венного наследования. Множественное наследование более логич­но с точки зрения моделирования реального мира, однако, оно ус­ложняет реализацию языков программирования.

    Полиморфизм. Одним из базовых понятий технологии объектно-ориентированного программирования является полимор­физм. Этот термин имеет греческое происхождение и приблизи­тельно означает «много форм» (polyмного, morphosформа).

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

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

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

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

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

    4.4. ПОЛЯ

    Класс представляет собой единство трех сущностей -полей, методов и свойств. Объединение этих сущностей в единое целое достигается за счет применения инкапсуляции.

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

    type

    TMyClass = class

    aIntField: Integer; aStrField: String; aObjField: TObject;

    end;

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

    type

    TMyClass = class

    aIntField: Integer; aStrField: String;

    end; var

    aObject: TMyClass; begin

    aObject.aIntField : = 0;

    aObject.aStrField : = 'Строка символов';

    end;

    Класс-потомок получает все поля своих предков и может до­полнять их своими, но он не может переопределять их или удалять. Таким образом, чем ниже в дереве иерархии располагается класс, тем больше данных получают в свое распоряжение его объекты.

    4.5. МЕТОДЫ

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

    type

    TMyClass = class Work: Boolean; procedure DoWork; end;

    procedure TMyClass.DoWork; begin

    Work := True; end;

    При определении тела метода необходимо использовать его полное имя с указанием класса. Вторая важная деталь - к любому полю объекта его метод может обратиться непосредственно. Дос­туп к методам класса, как и к его полям, возможен с помощью со­ставных имен.

    var

    aObject: TMyClass; begin

    aObject.DoWork;

    end;

    Статические методы. Как уже говорилось, методы клас­са могут перекрываться в потомках. Например:

    type

    TParentClass = class

    procedure DoWork; end;

    TChildClass = class(TparentClass)

    procedure DoWork; end;

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

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

    Динамические и виртуальные методы. В ObjectPascalгораздо чаще используется динамическое замещение мето­дов на этапе прогона программы. Для реализации этого, метод, за­мещаемый в родительском классе, должен объявляться как дина­мический (с директивой dynamic) или виртуальный (virtual). тив такое объявление, компилятор создаст две таблицы - DMT(DynamicMethodTable) и VMT (VirtualMethodTable) и поместит в них адреса точек входа соответственно динамических и вирту­альных методов.

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

    Например, родительский класс с помощью методов Show и Hide соответственно показывает что-то на экране или прячет изображе­ние. Для создания изображения он использует метод Draw с логи­ческим параметром:

    type

    TVisualObject = class(TWinControl)

    procedure Hide;

    procedure Show;

    procedure Draw(IsShow: Boolean); virtual; end; TVisualChildObject = class(TVisualObject)

    procedure Draw(IsShow: Boolean); override; end;

    Реализация методов Show и Hide выглядит следующим образом:

    procedure TVisualObject.Show; begin

    Draw(True); end;

    procedure TVisualObject.Hide begin

    Draw(False); end;

    Методы Draw у родителя и потомка имеют разную реализацию и создают разные изображения. В результате родительские методы Show и Hide будут прятать или показывать те или иные изображе­ния в зависимости от конкретной реализации метода Draw у любо­го из своих потомков. Таким образом, динамическое связывание в полной мере реализует полиморфизм классов.

    Разница между динамическими и виртуальными методами со­стоит в том, что таблица динамических методов DMTсодержит адреса только тех методов, которые объявлены как dynamicв дан­ном классе, в то время как таблица VMTсодержит адреса вирту­альных методов не только данного класса, но и всех его родителей. Большая по размеру таблица VMTобеспечивает более быстрый по­иск, в то время как при обращении к динамическому методу про­грамма сначала просматривает таблицу DMT у объекта, затем - у его родительского класса и так далее, пока не будет найдена нужная точка входа.

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

    У класса TObjectконструктор называется Create(), так же он на­зываются в подавляющем большинстве его потомков. Каждый объ­ект содержит, по крайней мере, один такой конструктор, который может иметь различное число параметров разного типа — в зависи­мости от типа объекта.

    Функцией деструктора является удаление объекта из памяти. По своей форме конструкторы и деструкторы являются процеду­рами, но объявляются с помощью зарезервированных слов Constructor и Destructor:

    type

    TMyClass = class

    IntField: Integer;

    Constructor Create(Value: Integer); Destructor Destroy; end;

    В отличие от C++, в ObjectPascalконструкторы автоматически не вызываются. Каждый объект создается с помощью вызова его конструктора. Обращение к конструктору должно предварять лю­бое обращение к полям и некоторым методам объекта. Синтаксис вызова конструктора следующий:
    1   2   3   4   5   6


    написать администратору сайта