112

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

А как чистые функции или возможности композиции спасут от гонок или взаимоблокировок?

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

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


Осьминога надо распутать и не будет проблем с общей памятью. Что там с мейнстримом в C++? Корутины с изолированным в кадрах состоянием, ленивые рэйнджи и концепты для гибкой композиции. По сути, это ОНО.

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

Еще момент - сейчас только обратил внимание - композиция не нужна для борьбы с повторяемостью кода. Композиция позволяет - вы не поверите - "скомпоновать" несколько морфизмов/функторов в один. Такой проблемы как повторяемость кода на этом уровне абстракции не существует.

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

"вы не поверите". Да вы что, правда что ли? Ну так не компануйте, а сразу одной функцией пишите полную реализацию. Повторно функции не используйте, из модулей / библиотек не импортируйте. Причем тут повторяемость кода, в самом деле?


"Такой проблемы как повторяемость кода на этом уровне абстракции не существует." - бред написал и доволен.

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

Где там? Какого осьминога? По какой сути это ОНО? Можно меньше МЕТАФОР и больше конкретики? В плюсах не разбираюсь, не знаю какие там подкапотные механизмы, но набор "умных" слов оценил. Особенно интересно как изоляция стейта зависит от ленивых вычислений. Еще хотелось бы определения гибкой и негибкой композиции.

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

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


Ну вот в чистых функциях это невозможно.


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


Хотелось бы определения гибкой и негибкой композиции. Мне тоже, откуда это вообще взялось?

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

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

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

Да-да. Только сначала посетите ресурсы с вакансиями и узрите те полторы, что про ФП. А потом можно обмазываться хаскелем, замыканиями и теориями категорий. Инфернально надрачивая от переизбытка ЧСВ.

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

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

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

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

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

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

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

Я не говорил, что не нужен. Я говорил, что есть нюансы трудоустройства. Элементы ФП в мультипарадигменных мейнстримовых языках редко удовлетворяют фанатиков труъ-функциональщиков. Ведь в этих языках всё ещё остаётся состояние и побочные эффекты. То ли дело в православном хаскеле. Да и на собесах на позицию разработчика С++/# вопросы по ООП встречаются куда чаще, чем по ФП. Ибо ФП в проектах на оных языка встречается куда реже, чем ООП. Вот и остаётся бедному функциональщику два стула: превозмогать неприязнь к ООП и работать на мейнстримовом языке, от случая к случаю привнося в проект красоту функциональщины. Либо претендовать на полторы вакансии чисто ФП языков и проектов.

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

Понятно. А я понял смысл как "фпшных вакансий нет == нахуй ваш фп не нужон", грубо говоря. А по ООП вопросам как будто гоняют джунов, чтобы уровень оценить? А на этом лвле просить понимания от кандидата концепций ФП которые щедро заправлены терминами теории категорий не очень разумная идея. Звучит как альтернативная причина почему по фп "не гоняют" на собесах.

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

Да-да, я помню: Ответ на пост «IT»

Не хочешь толкаться локтями в толпе и ловить зубами брошенную корку хлеба? Тогда выбирай первый язык программирования так, чтобы следовать Особым Путём! Haskell, Erlang или Q# востребованы настоящими ПРО. И ты начинай становится ПРО как можно скорее!

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