65

Поговорим про ооп1

Серия ООП

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

Мем из интернетов

Мем из интернетов

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

Итак, говорят, что существует две основные парадигмы программирования. Часто одну называют функциональной, а вторую объектно-ориентированной. Однако в статье Яндекса к этому понятию подходят более широко.
Ну, нам теоретические нюансы не важны, будем считать, что сначала программы писали как последовательность команд. Компьютер эту последовательность выполнял и программист получал какой-то результат. Позднее программы стали больше и сложнее и в них появилось много повторяющихся операций, тогда программисты придумали использовать функции.
Функция - часть программы, оформленная для многократного использования.
Такие функции можно вызывать из любого места в основной программе и вызывать их множество раз. Таким образом, вместо 10 одинаковых команд в двух разных местах, мы можем вызвать одну и тужу функцию в двух местах программы и сэкономить время, силы и размер программы.

Еще позднее функций стало недостаточно и программисты придумали классы и объекты.
Класс - часть программы, которая может содержать внутри функции и переменные, оформленная для многократного использования в более сложных конструкциях.
Предположим, мы хотим создать программу, которая выведет строку "Hello, world!" несколько раз.
На PHP это будет выглядеть, например так:

Здесь три команды вывода текста на экран. Поэтому удобно использовать функцию:

<?php
echo 'Hello, world!';
echo 'Hello, world!';
echo 'Hello, world!';
?>

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

<?php
function hello(){
echo 'Hello, world!';
}
hello();
hello();
hello();
?>

Что на счет ООП?

Создадим класс Текст. Он будет печатать текст и хранить этот текст внутри себя.

<?php
class Text{
public $text = 'Hello, world!';
function printText()
{
echo $this->text;
}
}
$hello = new Text();
$hello->printText();
?>

Здесь у нас класс Текст. У него есть общедоступное свойство текст, которое равно "Hello, world" и метод, который выводит этот текст на экран. Из такого простого примера не очень понятна выгода классов по отношению к простым функциям. Однако такой класс имеет рад преимуществ.

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

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

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

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

В будущих статьях я попробую описать все основные моменты работы с ооп. Попробую разобраться в ни сам и объяснить заинтересованным. Так что, присоединяйтесь.

В заключении. Если мои странные объяснения показались или могут показаться вам полезными, присоединяйтесь на пикабу и на ютуб. Ссылка в профиле. Осторожно, видео на непонятном языке.

Лига программистов

2.4K постов12K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

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

Вы смотрите срез комментариев. Показать все
265
Автор поста оценил этот комментарий

К сожалению, Вы так и не смогли объяснить человеку, который никогда не видел ООП, для чего оно ему могло бы понадобиться. И на примерах вида "printText" никогда не объясните. Знаете, почему? В этом примере ООП попросту не нужен, он мешает. А реальный (но при этом простой) пример Вы придумать поленились или не смогли. Кроме того, невнятная мотивирующая часть: не показаны проблемы процедурного подхода, не показано, как их можно решить при помощи ООП. Процедурного, а не функционального! Функциональный это вообще про другое! Иллюстрация с кодом демонстрирует синтаксис php, но нихрена не объясняет для чего понадобилось писать больше кода, чтобы получить то же самое поведение. В общем, сорян, но попытка разобраться с ООП без теории провалилась.

раскрыть ветку (24)
26
DELETED
Автор поста оценил этот комментарий

только зря время потратил. можно было кратко - хуйня.

раскрыть ветку (3)
18
Автор поста оценил этот комментарий

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

4
Автор поста оценил этот комментарий
На самом деле хорошо что пытается разобраться. А то некоторые используют ооп вообще в любой ситуации не думая, поэтому мб он будет использовать его правильно
Автор поста оценил этот комментарий

Вы с хабра или stackoverflow?

5
Автор поста оценил этот комментарий
Браво!
10
Автор поста оценил этот комментарий

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


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


Если это всё держать в отдельных переменных в main'е - то можно будет свихнуться, потому что фигур 32

раскрыть ветку (10)
2
Автор поста оценил этот комментарий

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

раскрыть ветку (6)
0
Автор поста оценил этот комментарий

Соглашусь, структуры - это лишь небольшая часть ООП

раскрыть ветку (2)
2
Автор поста оценил этот комментарий

Структуры вообще не ООП никаким местом.


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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Аргумент

0
Автор поста оценил этот комментарий

А что же тогда ооп и когда его применять?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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


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


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

Автор поста оценил этот комментарий

Наследование не обязательно. Оно даже антипаттерн в наше время.

0
Автор поста оценил этот комментарий

фигур 6

раскрыть ветку (1)
12
Автор поста оценил этот комментарий

В начале игры у каждого игрока 16 фигур: один король, один ферзь, две ладьи, два слона, два коня и восемь пешек.


6 типов фигур

Автор поста оценил этот комментарий
В принципе ООП полезно когда тебе надо хранить метательное состояние но при этим гибко управлять скоупом видимости
1
Автор поста оценил этот комментарий

Хз, мне понятно, так что тсу спасибо

0
Автор поста оценил этот комментарий
Я вот тоже подумал, нахрен, класс нужен, когда функцией проще)) наверное, никогда в этих классах и объектах не разберусь.
раскрыть ветку (6)
1
Автор поста оценил этот комментарий

На тубе есть канал Simple code. Там курс у него по шарпам. Рекомендую. Реально человек на простых примерах показывает и рассказывает доходчиво, в том числе по ООП.

1
Автор поста оценил этот комментарий

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

0
Автор поста оценил этот комментарий

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

Автор поста оценил этот комментарий
Если проще функцией - делай функцией! Когда приложение разрастётся - сам задумаешься о классах
раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Странный совет. Допустим у меня есть 2 файла в одном примитивный "роутер" который обрабатывает запросы пользователя, в другом 1000 всяких функций которые вызываются этим самым "роутером ", в какой момент мне понадобится использовать класс? Когда этих функций станет 1000000, но зачем? А почему нельзя было использовать класс, когда было 50 функций? А если можно было, то зачем?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Если удобно 100500 функций - флаг в руки!

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества