Блог

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

7 years ago
13K
Sergei Nikonov

 

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

 

Чтобы дать адекватный ответ на данный вопрос, придется ознакомиться не только с основными свойствами ООП, но и разобраться с некоторыми понятиями - к примеру, полиморфизм, а также, инкапсуляция и наследование. Из интерактивных курсов по разработке и программированию веб-сайтов в модуле PHP/MySQL вы можете познакомиться с теоретической базой ООП, а применить знания на практике в модуле CodeIgniter MVC - весь модуль.

 

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

 

Введение в ООП

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

 

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

 

Чтобы сразу же разобраться с отличиями данных способов программирования, необходимо рассмотреть код в нескольких вариантах:

 

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

$value = "Hi!";
echo $value;

 

ООП:

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();
 

 

Стоит сразу же выделить видимое отличие - в первом варианте все намного проще, меньше кода. Многие посчитают код ООП слишком сложным и выберут первый вариант, но это лишь изначальное обманчивое впечатление.

 

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

 

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

 

Что из себя представляет КЛАСС

Здесь все достаточно просто - это методы, а также, поля программы. В качестве примера можно рассмотреть 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(), являются методами.

 

Несколько базовых принципов ООП

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

 

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

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

 

Чтобы сразу же стало понятно что это, приведем реальный пример.

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

 

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

 

Приведем в качестве примера инкапсуляции следующее:

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” (пол), которое сделали приватным - это не позволит внешним пользователям получить к нему доступ.

 

Вот как будет выглядеть попытка получения доступа к данному поля вне самого класса:

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

 

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

 

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

Также очень важное свойство ООП, возможность наследовать функционал определенного класса в другой класс.

 

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

Каждый человек обладает определенным набором функций при рождении, это так называемый базовый набор - дыхание, переваривание пищи, крик.

 

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

 

Как это работает? Существуют родительские классы с базовым функционалом - при создании нового класса, не потребуется создание новых базовых навыков, он изначально унаследует "базу" родительского класса. Это существенно упрощает работу программистам. Есть слово "extends", которое обозначает наследование, сейчас покажем вам определенный пример:

/* Родительский класс 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 и я рожаю детей

 

Если рассматривать созданные классы - они оба обладают базовым набором навыков, но есть свои отличия - "Мужчина" отращивает бороду, "Женщина" рожает ребенка.

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

 

 

Полиморфизм

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

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

Ну как? Теперь проще понять разное поведение одного метода в ООП?

 

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

/* Это интерфейс 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 */
interface Say {
 	public function say();
}

 

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

 

Абстрактный класс

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

 

Пример того, чего мы не сможем сделать:

$human = new Human("name");

 

В любом случае будем получать ошибку.

 

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

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

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

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

}

 

Выводы

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

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

 

Мы привели достаточно простые примеры - это отличная возможность для любого новичка в сегменте программирования! Надеемся, что помогли вам понять особенности ООП, изучить наиболее важные принципы, чтобы в дальнейшем совершенствовать свои умения. Несколько будущих статей будут направлены на то, чтобы разобраться с важными ключевыми словами public, private, protected, static. Увидеть все особенности на весьма простых примерах.