Типы программирования и основы объектно-ориентированного программирования

Типы программирования и основы объектно-ориентированного программирования

Когда-то знакомство с основами программирования начиналось не с изучения таких сложных языков, как С и Assembler, а с изучения языка Basic. Эта аббревиатура расшифровывается как "универсальный символьный код для начинающих". Basic является интерпретирующим языком.

Раньше интерпретирующие языки программирования были предназначены только для начинающих, так как программы, написанные на этих языках, могли выполняться лишь в редакторах программ. Теперь же Visual Basic (наследник Basic) имеет в своем составе компилятор, а для интерпретирующих языков программирования предусматривается среда выполнения, которая встраивается в различные операционные системы.

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

Главная процедура main (основной блок кода - как блок с зеленым флажком в Scratch на котором мы тренировались прошлый раз) последовательно вызывала другие процедуры программы, которые могли передавать управление друг другу. Написанная таким образом программа была громоздкой и не очень структурированной.

Этих недостатков в определенной мере лишена программа, построенная по принципам объектно-ориентированного программирования (ООП). Такие программы стали писать на языке С++, выступившим наследником языка С. В ООП структурной единицей программы считается не процедура, а так называемый класс. У класса есть свойства (характеристики класса) и методы (действия над конкретным объектом — "экземпляром" — данного класса). Ссылки на объект сокращают текст программы за счет обращения к соответствующим характеристикам и методам класса, к которому принадлежит данный конкретный объект. Приведем пример, который пояснит сказанное.

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

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

Язык С++ — предшественник Java — нельзя было назвать исключительно "объектно-ориентированным языком". В программе на языке С++ могли не использоваться классы — структурные единицы ООП, а главная процедура main не принадлежала ни к какому классу.

Напротив, Java — строго объектно-ориентированный язык, он четко выдерживает все требования парадигмы ООП.

Рассмотрим еще три важных понятия ООП: наследование, инкапсуляция, полиморфизм. Наследование — это способность классов быть производными от других классов, наследуя при этом какие-то их методы и свойства. Вернемся к нашему старому примеру.

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

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

Спасибо за внимание.