Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
13.docx
Скачиваний:
8
Добавлен:
20.03.2016
Размер:
52.56 Кб
Скачать

3.Объектно-ориентированный подход (ооп) программированию и проектированию

Объекты — это крупнейшее достижение в современной технологии программирования. Изобретение и практическая реализация объектов являются подвигом человеческого гения. Объекты позволили строить программу не из чудовищных по сложности процедур и функций, а из кирпичиков-объектов, заранее наделенных нужными свойствами. При этом внутренняя сложность объектов скрыта от программиста, он просто пользуется готовым строительным материалом. С появлением Windows без объектов в программировании просто не обойтись. Delphi — не исключение, она в своей основе является объектно-ориентированной и говорить о программировании без объектов просто бессмысленно. ООП представляет собой новый этап развития современных концепций построения языков программирования. Здесь получили дальнейшее развитие принципы структурного программирования – структуризация программ и данных, модульность и т. д., а также новые подходы к созданию программ. Использование возможностей ООП незаменимо при визуальном программировании, когда программа «набирается» из отдельных объектов, обладающих необходимыми настраиваемыми характеристиками. ООП обладает рядом преимуществ при создании больших программ. В частности, к ним можно отнести:

  1. использование более естественных с точки зрения обычной повседневной практики понятий, простота введения новых понятий;

  2. упрощение разработки многократно используемых компонент приложений;

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

  4. возможность создания библиотеки классов; в частности, библиотека визуальных компонент Delphi и является примером такой библиотеки;

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

  6. возможность написания подпрограмм с различными наборами формальных параметров, но имеющих одно и то же имя;

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

  8. возможность разделения доступа к различным объектам программы и т. д.

В конце 60-х годов возникла идея объединить понятия тип данных, процедура, функция, запись и то, что получилось, назвать объектом. Рассмотрение данных в неразрывной связи с методами их обработки позволило вывести формулу объекта: Объект = Данные + Операции На основании этой формулы была разработана методология объектно-ориентированного программирования (ООП). Об объектах можно думать как о полезных существах, которые «живут» в вашей программе и коллективно решают некоторую прикладную задачу. Вы лепите этих существ, распределяете между ними обязанности и устанавливаете правила их взаимодействия. В общем случае каждый объект «помнит» необходимую информацию, «умеет» выполнять некоторый набор действий и характеризуется набором свойств. То, что объект «помнит», хранится в его полях. То, что объект «умеет делать», реализуется в виде его внутренних процедур и функций, называемых методами. Свойства объектов аналогичны свойствам, которые мы наблюдаем у обычных предметов. Значения свойств можно устанавливать и читать. Программно свойства реализуются через поля и методы. Например, объект «кнопка» имеет свойство «цвет». Значение цвета кнопка запоминает в одном из своих полей. При изменении значения свойства «цвет» вызывается метод, который перерисовывает кнопку. Кстати, этот пример позволяет сделать важный вывод: свойства имеют первостепенное значение для программиста, использующего объект. Чтобы понять суть и назначение объекта, вы обязательно должны знать его свойства, иногда — методы, очень редко — поля (объект и сам знает, что с ними делать). ОБЪЕКТЫ И КОМПОНЕНТЫ С появлением графических систем, в частности Windows, программирование пользовательского интерфейса резко усложнилось. Программист в какой-то мере стал дизайнером, а визуальная компоновка и увязка элементов пользовательского интерфейса (кнопок, меток, строк редактора) начали отнимать основную часть времени. И тогда программистам пришла в голову идея визуализировать объекты, объединив программную часть объекта с его видимым представлением на экране дисплея в одно целое. То, что получилось в результате, было названо компонентом. Компоненты в Delphi — это особые объекты, которые являются строительными кирпичиками среды визуальной разработки и приспособлены к визуальной установке свойств. Чтобы превратить объект в компонент, первый разрабатывается по определенным правилам, а затем помещается в Палитру Компонентов. Конструируя приложение, вы берете компоненты из Палитры Компонентов, располагаете на форме и устанавливаете их свойства в окне Инспектора Объектов. Внешне все выглядит просто, но чтобы постичь такой простоты, потребовалось создать механизмы, обеспечивающие функционирование объектов-компонентов уже на этапе проектирования приложения! Все это было придумано и блестяще реализовано в среде Delphi. Таким образом, компонентный подход значительно упростил создание приложений с графическим пользовательским интерфейсом и дал толчок развитию новой индустрии компонентов. КЛАССЫ ОБЪЕКТОВ Каждый объект всегда принадлежит некоторому классу. Класс — это обобщенное (абстрактное) описание множества однотипных объектов. Объекты являются конкретными представителями своего класса, их принято называть экземплярами класса. Например, класс СОБАКИ — понятие абстрактное, а экземпляр этого класса МОЙ ПЕС БОБИК — понятие конкретное. ТРИ ПАРАДИГМЫ (ПРИНЦИПА) ООП ООП держится на трех принципах: инкапсуляции, наследовании и полиморфизме. Наблюдаемое в объектах объединение данных и операций в одно целое было обозначено термином инкапсуляция (первый принцип ООП). Применение инкапсуляции сделало объекты похожими на маленькие программные модули и обеспечило сокрытие их внутреннего устройства. Для объектов появилось понятие интерфейса, что значительно повысило их надежность и целостность. Второй принцип ООП — наследование. Этот простой принцип означает, что если вы хотите создать новый класс, лишь немногим отличающийся от того, что уже существует, то нет необходимости в переписывании заново всех полей, методов и свойств. Вы объявляете, что новый класс является потомком (или дочерним классом) имеющегося класса, называемого предком (или родительским классом), и добавляете к нему новые поля, методы и свойства. Иными словами добавляется то, что нужно для перехода от общего к частному. Процесс порождения новых классов на основе других классов называется наследованием. Новые классы имеют как унаследованные признаки, так и, возможно, новые. Например, класс СОБАКИ унаследовал многие свойства своих предков - ВОЛКОВ Третий принцип — это полиморфизм. Он означает, что в производных классах вы можете изменять работу уже существующих в базовом классе методов. При этом весь программный код, управляющий объектами родительского класса, пригоден для управления объектами дочернего класса без всякой модификации. Например, вы можете породить новый класс кнопок с рельефной надписью, переопределив метод отрисовки кнопки. Новую кнопку можно «подсунуть» вместо стандартной в какую-нибудь подпрограмму, вызывающую отрисовку кнопки. При этом подпрограмма «думает», что работает со стандартной кнопкой, но на самом деле кнопка принадлежит производному классу и отображается в новом стиле.

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

Вычислить значение выражения 10^y - x^y + x^n, x>0. Реализованы принципы: инкапсуляция и наследование. ObjT1 = class  //описание класса ObjT1 вычисляет значение x^n  x:real;   // поле  n:word;  // поле  function Power:real;  //метод  constructor Create;   // специальный метод – конструктор create end; ObjT2 = class(ObjT1) //класс ObjT2 вычисляет значение x^y, является наследником от класса ObjT1 y:real;  // x наследует от ObjT1 function Power:real; constructor create; end; ObjT3 = class(ObjT2) ) //класс ObjT2 вычисляет значение 10^y, является наследником от класса ObjT2 function Power:real; end; var Form1: TForm1; o1:ObjT1; // описывается переменная объектного типа Objt1 o2:ObjT2; // описывается переменная объектного типа Objt2 o3:ObjT3; // описывается переменная объектного типа Objt3 implementation {$R *.dfm} constructor Objt1.create; begin  x:=1; // начальное значение поля x  n:=1; // начальное значение поля n  end; constructor Objt2.create; begin  inherited create;  // вызывается унаследованный метод create родителя, который присваивает полям x и n объекта o2 начальные значения y:=1; // начальное значение поля y  end; function Objt1.Power:real; // метод Power класса Objt1 возведения в степень x^n  begin Result:=exp(n*ln(x)); end; function Objt2.Power:real; // метод Power класса Objt2 возведения в степень x^y begin Result:=exp(y*ln(x)); end; function Objt3.Power:real; // метод Power класса Objt3 возведения в степень 10^y begin Result:=exp(y*ln(10)); end; procedure TForm1.Button1Click(Sender: TObject); // Обработчик события OnClick кнопки Button1 begin o1:=ObjT1.Create; // Вызов метода (конструктора) create класса Objt1. Создается объект o1, выделяется память полям x и n  o2:=ObjT2.Create; // Вызов метода (конструктора) create класса Objt2. Создается объект o2, выделяется память полям x, n и y  o3:=ObjT3.Create; // Вызов метода (конструктора) create класса Objt3. Создается объект o3, выделяется память полям x, n и y  o1.x := StrToFloat(form1.edit1.Text); // полю x объекта o1 присваивается значение из edit1.text  o1.n:=StrToInt(form1.edit3.Text); // полю n объекта o1 присваивается значение из edit3.text  o2.y:=StrToFloat(form1.edit2.Text); // полю y объекта o2 присваивается значение из edit2.text  edit4.text := FloatToStr(o3.Power-o2.Power+o1.Power); // вычисление искомого выражения  o3.Free; // разрушение объекта o3, освобождение памяти o2.Free; // разрушение объекта o2, освобождение памяти o1.Free; // разрушение объекта o1, освобождение памяти end; procedure TForm1.Button2Click(Sender: TObject); begin close; // закрытие приложения end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]