112

Ответ на пост «Поговорим про ооп»1

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

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

Теперь к наследованию. Если мы пойдём в истории нашей бригады чуть назад, то мы поймём что все они строители (базовый класс - строитель), все они имеют некий общий набор свойств перечисленных выше. А вот уже от строителей отходят классы наследники - штукатуры, маляры и бетонщики. При этом каждый базовый "строитель" умеет таскать песок - то есть наши специализированные классы унаследовали от родительского такую возможность и в ООП это называется наследованием. Но иногда вы нанимаете шикарного маляра, который говорит: "я кароч песок таскать не буду, но зато смотри как шикарно я крашу!" И тогда это уже другой класс маляра - маляр-профессионал. Ему негоже таскать песок, но красит на пятёрочку и по другим методикам - это называется полиморфизм. На попытку заставить его таскать песок он ответит отказом, а покрасит лучше простого маляра. Это потомучто он переопределил в себе методы родителя CarryingSand() и PaintingAWalls(). Теперь к инкапсуляции. Если методичка по покраске стен написана хорошо, верно и конкретный Махмуд не несёт отсебятины, то результат предсказуем и повторяем. И самое главное нет нужды стоять у него над душой и контролировать процесс. В жизни так конечно не бывает, но мы предположим, что такие чудесные люди существуют в этом мире. Вот в таком случае считается что метод инкапсулирован и не важно что делает ваш маляр - важен итоговый результат или мотивированный отказ с указанием причины почему это сделать невозможно (например нет сен под покраску). Это конечно сильно утрированный пример, но зато понятнее для обывателя.

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

2K постов11.8K подписчиков

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

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

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

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

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

"Когда вы нанимаете пять маляров, вы создаёте пять экземпляров класса маляр. У класса есть свойства. Это например возраст маляра, его рост (мелким малярам сложнее работать без стремянки), вес (некоторым малярам возможно понадобится более основательная стремянка), имя и например оклад."


Может лучше не в пять классов, а по потокам их раскидать? ;)  нахрена мне знать их возраст, если мне крашеная стенка нужна? Ненавижу аналогии за такую херню....

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

Это первый урок и он затрагивает многопоточность. )))))) Самое главное чему учит урок - делегируй. Нехрен прорабу следить постоянно за всем процессом. Если все маляры красят одинаково неверно, значит есть ошибка в методичке - что упрощает её поиск.

показать ответы
12
Автор поста оценил этот комментарий
отлично, ждем продолжения.
этот текст перескажу ребенку
раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Эээээ.. батенька.... Спасибо конечно за купюрку. )))) А я штоле подключал донат? вот те раз...

показать ответы
1
Автор поста оценил этот комментарий
ООП - это организация освобождения Палестины или охрана общественного порядка?
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Один Обгоревший Пердак. Хотя по сути их много.

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

Хе-хе, чтобы осознать, насколько ООП хтонь и ужос, надо уразуметь, что согласно тому же принципу единственной ответственности, красить обязан один маляр, зарплату получать другой, медкомиссию проходить третий, а перед прорабом отчитываться четвертый. Задания им делигирует сущность, которая идентификацирует себя, как Наследик Абстрактного Строителя. По имени Вася, например. Чтобы поработать вместе, им надо либо собраться в шаблонный метод, либо оддекарировать друга друга, как куча извращенцев (при этом все запутываются). Каждый маляр притом насколько в своём познании преисполнился, что тащит пачку ссылок на Абстрактных Художников, Дизайнеров и Палитр, а маляр-переговорщик, соответственно, на Абстрактных Дипломатов, Лингвистов и Дикторов.


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

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

Ну не надо для непосвящённых плодить сущности - просили же попроще ))))

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

ИМХО многопоточность зря приплели, ООП сильно не просто это. Смысл ООП упрощение написания, отладки и переиспользование кода.

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

Частицу НЕ непропечатал. Там должно быть "Это первый урок и он НЕ затрагивает многопоточность."

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

А зачем переопределять метод таскания песка на что-то другое? Не будет ли это говнокодом? Т.к. мы от метода CarryingSand() ждём что песок переместится, да, это может быть перенос песка в детском ведёрке, но это должен быть перенос песка. Но я пе пыхыпист, не знаю, может там свои порядки, но выглядит странно, если CarryingSand() не сможет перенести песок.

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

Я тоже не ПХПыст и пример общий чисто для примера. Мы же не говорим тут о том как лучше делать, а как нет. В реальной то жизни супер маляра не будут заставлять таскать песок, потомучто чернорабочему можно платить условных 10 единиц, а супермаляру 100 и более. Уметь то он умеет, но станет ли.

показать ответы