Что такое объектно-ориентированное программирование
Этот вопрос задают на каждом собеседовании кандидату на должность программиста. Если программист не сможет ответить на этот вопрос, интервьюер, как минимум, засомневается в вашей компетенции и скорее всего вас не примут на работу в хорошую ИТ-компанию. Для того, чтобы ответить на вопрос что такое ООП, вам нужно не только выучить три свойства объектно-ориентированного программирования, но и понимать что такое инкапсуляция, полиморфизм и наследование.
Web-hosting rating: 8 out of 10 with 325 ratings

Введение в объектно-ориентированное программирование

Объектно-ориентированное программирование (ООП) - это популярная парадигма программирования, пришедшая на смену процедурному подходу в программировании.

Процедурное программирование - это монолитная программа с набором инструкций для выполнения, с ветвлениями и подпрограммами.

 

 

Для понимания разницы между процедурным программированием и ООП программированием, я приведу примеры одного и того же кода в разных парадигмах.

 

Пример кода на PHP процедурного программирования:


    $value = "Hi!;
    echo $value;

 

Пример кода на PHP в объектно-ориентированном стиле программирования:


class Human {
	private $words;

	public function setWords($words) {
		$this->words = $words;
	}

	public function getWords() {
		return $this->words;
	}

	public function sayIt() {
		return $this->getWords();
	}
}


$human = new Human();
$human->setWords("Hi!");
echo $human->sayIt();

 

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

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

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

 

Что такое класс (class)

Класс - это набор полей и методов программы. Рассмотрим прошлый пример. У нас есть класс Human:


class Human {
	private $words;

	public function setWords($words) {
		$this->words = $words;
	}

	public function getWords() {
		return $this->words;
	}

	public function sayIt() {
		return $this->getWords();
	}
}

 

Human - это имя класса.
$words - это поле класса (или переменная класса)
setWords, getWords(), sayIt() - это методы класса

 

Базовые принципы объектно-ориентированного программирования

Объектно-ориентированное программирование базируется на трех основных принципах. Это инкапсуляция, полиморфизм и наследование. На этих трех базовых принципах мы остановимся подробнее.

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

 

Что такое инкапсуляция

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

Для лучшего понимания, приведу пример инкапсуляции в жизни на примере телефона:

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

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

 

Пример инкапсуляции на примере класса Human:


	class Human {
		private $words;
		private $sex;

		public function setSex($sex) {
			if($sex == "male") {
				$this->sex = "male";
			} else if($sex == "female") {
				$this->sex = $sex;
			} else {
				echo "Error. Set only male or female sex";
			}
		}

		public function setWords($words) {
			$this->words = $words;
		}

		public function getWords() {
			return $this->words;
		}

		public function sayIt() {
			return $this->getWords();
		}
	}


	$human = new Human();
	$human->setSex("male");
	$human->setWords("Hi!");
	echo $human->sayIt();

 

В этом примере мы добавили в класс Human приватное поле пол ($sex). Ключевое слово private обозначает, что мы не сможем получить доступ к переменной $sex из вне класса.

Если мы попытаемся обратиться к полю $seх из вне класса, тогда мы получим ошибку:

$human->sex = "11"; Fatal error: Cannot access private property Human::$sex

 

Для того, чтобы задать поле пол, нам нужно обратиться к методу setSex() и передать ему в качестве параметра пол Human. В этом методе стоит проверка, male или female (мужчина или женщина).

Если в качестве параметра мы попробуем передать другой параметр в этот метод, например $human->setSex(“123"), тогда метод вернет нам ошибку.

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

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

 

Что такое наследование

Наследование - это второе свойство объектно-ориентированного программирования, позволяющее наследовать функционал (набор полей и методов) одного класса в другой.

 

Пример наследования из жизни очень простой:

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

За вами тянется целая эволюционная цепочка генов, начиная с генов древних предков обезьян, заканчивая генами современного человека - вашими родителями. В объектно-ориентированном программирование, наследование тоже самое свойство.

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

Наследование в объектно-ориентированном программированием обозначается ключевым словом extends. Давайте изменим класс Human и применив наследование ООП, создадим классы мужчины и женщины.

 


/* Родительский класс Human */
class Human {
	private $name;
    
    /* Конструктор (в нем мы задаем поле $name при создании экземпляра класса) */
	public function __construct($name) {
		$this->name = $name;

	}

    /* Метод say(). Предполагаем, что Human изначально может говорить */
	public function say() {
		echo "Меня зовут ".$this->name." и ";
	}
}

/* Класс Мужчина. Ключевым словом extends мы наследуем родителя Human */
class Man extends Human {
	public function beard() {
		echo "у меня растет борода";
	}
}

/* Класс Женщина. Ключевым словом extends мы наследуем родителя Human */
class Women extends Human {
	public function bearChildren() {
		echo "я рожаю детей";
	}
}


/* Создаем экземпляр класса Man и вызываем методы. */
$man = new Man("Sergey");
$man->say();
$man->beard();


/* Создаем экземпляр класса Women и вызываем методы. */
$women = new Women("Maria");
$women->say();
$women->bearChildren();

 

В результате выполнения программы, мы увидим следующее:

Меня зовут Sergey и у меня растет борода

Меня зовут Maria и я рожаю детей

В этом примере, классы Мужчина и Женщина унаследовали от родительского класса Human общий метод say(), то есть, и Мужчина и Женщина у нас умеют говорить, но для Мужчины и Женщины, мы ввели свои особенности: У мужчины растет борода, а женщина умеет рожать детей.

 

Метод под названием __construct - это конструктор класса. Что такое конструктор класса, читайте в статье.

 

Что такое полиморфизм

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

 

Пример полиморфизма из жизни:

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

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

Если полиморфизм перенести на пример с классами - то это общий метод для объектов. 

 

Давайте посмотрим на примере реализацию полиморфизма в PHP:



/* Это интерфейс Say */
interface Say {
 	public function say();
}

/* Это абстрактный класс Human имплементирующий интерфейс Say */
abstract class Human implements Say{
	private $name;

	public function __construct($name) {
		$this->name = $name;
	}

	public function getName() {
		return $this->name;
	}

}

/* Класс Man наследуют класс Human и обязан реализовать метод say() */
class Man extends Human {

	public function __construct($name) {
		parent::__construct($name);
	}

	public function beard() {
		echo "у меня растет борода";
	}

	public function say() {
		echo "У меня мужской голос, меня зовут ".$this->getName()." и ";
	}

}


/* Класс Women наследуют класс Human и обязан реализовать метод say() */
class Women extends Human {

	public function __construct($name) {
		parent::__construct($name);
	}

	public function bearChildren() {
		echo "я рожаю детей";
	}

	public function say() {
		echo "У меня женский голос, меня зовут ".$this->getName()." и ";
	}

}

$man = new Man("Sergey");
$man->say();
$man->beard();

$women = new Women("Maria");
$women->say();
$women->bearChildren();

?>

 

В результате выполнения программы, мы увидим следующее:

У меня мужской голос, меня зовут Sergey и у меня растет борода
У меня женский голос, меня зовут Maria и я рожаю детей

 

Мы модифицировали наши прошлые классы и добавили такие понятия объектно-ориентированного программирования как Интерфейс и Абстрактный класс

Обратите внимание, что метод say() в классах Man и Women мы реализуем по-разному. Это и есть полиморфизм.

 

Что такое интерфейс в ООП

Интерфейс - это шаблонный класс без реализации. То есть в интерфейсе мы только задаем методы и эти методы обязаны реализовать классы.

 

В нашем прошлом примере наш интерфейс Say с единственным методом say():


/* Это интерфейс Say */
interface Say {
 	public function say();
}

 

Этот интерфейс мы имплементируем в абстрактном классе Human. Для того чтобы имплементировать интерфейс, после названия класса нужно дописать ключевое слово implements.

 

Что такое абстрактный класс в ООП

Абстрактный класс в ООП - это класс шаблонный класс от которого нельзя создать экземпляр класса.

 

Это значит, что мы не можем с абстрактным классом сделать так:

$human = new Human("name");

 

Если мы попытаемся создать экземпляр абстрактного класса, интерпретатор PHP выдаст ошибку.

Абстрактный класс мы можем только наследовать. Взгляните еще раз на абстракный класс. Перед классом он содержит ключевое слово abstract.  Также он имплементирует интерфейс Say (implements).


/* Это абстрактный класс Human имплементирующий интерфейс Say */
abstract class Human implements Say{
	private $name;

	public function __construct($name) {
		$this->name = $name;
	}

	public function getName() {
		return $this->name;
	}

}

 

Выводы о ООП

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

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

В следущих статьях мы поговорим о таких ключевых словах как public, private, protected, static и рассмотрим еще примеры. Если у вас остались вопросы, пишите комментарии и мы обязательно попробуем вам подсказать решение. 

Вступайте в нашу группу VK и следите за новыми материалами.





Читайте также


Что такое NodeJS и npm?

XAMPP - как установить и настроить на Mac (Mojave, Sierra)

Как самостоятельно изучить веб-программирование

Взломали Cкайп, что делать?

Что такое реферальный спам в Google Analytics

Постраничная ленивая загрузка (lazy load) постов

Как стать профессиональным веб-разработчиком

Методы setTimeout и setInterval в Javascript

Реализация Lazy Load на Jquery

Три полезных CSS свойства для работы с изображениями

Массивы в Javascript

Что такое TypeScript

CSS3 - Эффект вращения

Sublime Text 3 - удобный редактор кода для веб-разработчиков

Установка и настройка веб-сервера для сайта в Ubuntu

Полезные приложения для веб-разработчиков в Google Chrome

Модальное окно на Jquery

GIT команды: Быстрый старт для новичков

Что такое конструктор в объектно-ориентированном программировании

Как отправить форму без перезагрузки страницы (AJAX)

Как быстро создать сайт и привлечь поисковый трафик

Bitbucket: Крутой облачный GIT репозиторий

Javascript: Классы в Javascript

Что такое веб-хостинг и как выбрать хостинг для сайта

SQL запросы: Основы администрирования MySQL

Команды Linux: оболочка BASH

Joomla CMS: Преимущества и недостатки

Качественный сайт: семь ключевых свойств



Все материалы с сайта wh-db.com и ru.wh-db.com защищены авторским правом. Копирование, публикация, продажа и распространение материала строго запрещены.



Комментарии





Виктор Смирнов ответить
Спасибо, хорошая статья. Наконец то я понял что такое ООП!!!
Влад ответить
Жалко что примеры ООП в этой статье на PHP, а не на JAVA :( Может быть вам в статьях писать примеры на двух языках программирования?
Эдуард ответить
Та в Java все также само(синтаксис очень похож). Только перед названием метода или полей ставится вместо function тип возвращаемой переменной и тип переменной соответственно.
Андрей. ответить
Спасибо! Чудесная статья. Все понятно и доступно!
Спасибо,доступно,ещё один винтик в голове провернулся.... )

Оставить комментарий









Поиск хостинга



HDD (mb)
8000
Максимальная цена за месяц, (RUB)
700

Дополнительно







Новые статьи

















ВСЕ СТАТЬИ


Обзоры хостинга















Категории


24x7 Support Web Hosting
Angular JS Web Hosting
Apache Web Hosting
ASP.NET Web Hosting
CPanel Web Hosting
Cron Web Hosting
DirectAdmin Web Hosting
Django Web Hosting
EMail Web Hosting
FireBird Web Hosting
Free Domain Web Hosting
GIT Web Hosting
Jabber Web Hosting
Java Web Hosting
JavaScript Web Hosting
JBoss Web Hosting
JSP Web Hosting
Linux Web Hosting
MERCURIAL Web Hosting
MongoDB Web Hosting
MySQL Web Hosting
NGinx Web Hosting
NodeJS Web Hosting
Perl Web Hosting
PHP Web Hosting
PostgreSQL Web Hosting
Python Web Hosting
Ruby Web Hosting
Russian Web Hosting
Servlets Web Hosting
Spring Web Hosting
SQLite Web Hosting
SSH Web Hosting
SSL Web Hosting
Stream Web Hosting
SVN Web Hosting
TomCat Web Hosting
Unlimited HDD Space Web Hosting
Unlimited Sites Web Hosting
Unlimited Traffic Web Hosting
USA Web Hosting
VmWare Web Hosting
Windows Web Hosting