323

ООП сейчас не все используют

Случайно наткнулся на такой комментарий

ООП сейчас не все используют

И прямо полыхнуло.


Где в трёх принципах ООП (наследование, инкапсуляция, полиморфизм) есть что-то про сеттеры, геттеры и деструкторы?


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


Сейчас в трёх китах ООП логика такая:

1. инкапсуляция — это объединение данных (называемых полями или атрибутами) и функций для работы с ними (называемых методами),

2. наследование — возможность породить класс из существующего, взяв себе все поля и методы,

3. полиморфизм — это возможность взаимозаменять объекты в рамках иерархии.


Давайте на примере. У нас собака - это сложная такая штука. Но всю сложность на себя берёт программист, который реализовал класс Собака. У нас есть поля (например, количество лап), есть методы (например, бежать). Вы можете сказать собака.бежать(), при этом внутреннее устройство собаки вас не интересует - в этом смысл инкапсуляции. Некоторые ошибочно говорят про "сокрытие" и начинают про private-public-protected, но этого не требуется. Поэтому, например, в python нет сокрытия, а инкапсуляция всё ещё есть.


Дальше. Мы создали Собаку. Теперь хотим Чихуахуа. Чтобы не переписывать общие места, у нас есть наследование. Мы создаём Чихуахуа(Собака), то есть наследуемся от неё. Теперь мы можем переписать только отличающиеся места (например, изменить метод Бежать так, чтобы Чихуахуа ещё противно шкрябала когтями).


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


# создадим пару очаровательных собак
dog_party = [ Dog(), Сhihuahua() ]
# пройдёмся циклом по всем собакам
for dog in dog_party:
.  # у каждой собаки вызовем свой метод бежать
dog.run()
И тогда все собаки из dog_party побегут как умеют. Такие дела.


PS: некоторые относят к китам ООП ещё и абстракцию "для выделения в моделируемом предмете важного для решения конкретной задачи по предмету" (вики). Тут у меня вопрос. Вообще всё программирование состоит в выделении важного и игнорировании неважного независимо от парадигмы. Причём тут ООП? А если мы говорим о выделении сущности собаки в виде полей, то это свойство называется инкапсуляция.


В телеграмм-канале devfm разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку.

Программирование на python

936 постов11.9K подписчика

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

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

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

Знаешь, рассказывать, что инкапсуляция это не сокрытие, это в наше время примерно то же самое, что рассказывать, что у человека нет инстинктов. Формально верно, но на самом деле спор об определениях.


Ну и много ты сейчас видел кода, в котором вот такие объекты типа собак? Тем более кода, где эти собаки бывают разных пород, чтобы применялся полиморфизм?

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

В питоне нет сокрытия. Всякие нижние подчёркивания — это договорённости, которые ничего не скрывают. При этом в питоне ООП есть, верно?


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


Дальше, в gamedev всё тоже на этом. Я выделяю юнитов и кликаю бежать. Каждый юнит бежит особым образом.

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

Тоже полыхнуло

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

С чего бы это в пайтоне нет необходимости в геттерах и сеттерах с точки зрения философии языка? То, что вместо функции set_a ты пишешь вначале property a, а затем a.setter ничего принципиально не меняют.

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

Думаю, товарищ имел в виду, что сеттеры не нужны, т.к. нету private полей. Тот факт, что сеттеры\геттеры ещё могут много магии в себе хранить по преобразованию — он не в курсе, наверное

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

Есть более строгие и широкие определения.


Инкапсуляция - это не просто хаотичное объединение данных, это разделение на логические абстракции и так же разделение их публичных контрактов от реализации. В строгом определении инкапсуляция подразумевает в себе абстракцию данных. Если вы запихнули все в один класс на 20к строк (объединили данные и методы), то это не инкапсуляция.


Нарушение инкапсуляции ведет к побочных эффектам и потенциальным ошибкам. В других языках закладываются ограничения специально, чтобы не было исскушения лезть куда не надо. В Python это всё на соглашениях, только и всего. А так и в тех же Java|C#|C++ есть способы обратиться к приватной переменной.


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


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


Полиморфизм - возможность обращаться одинаковым образом с сущностями разных типов. Это касается не только иерархии классов. Переопределяемые функции тоже являются частью полиморфизма, те же print, len и другие (ad-hoc и параметрические полиморфизм).


Пойду открою окно, а то душно стало...

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

Спасибо за дополнение

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

как собеседующий, правда AQA, отвечу - ради охуительных историй примеров. Для AQA SOLID это вопрос для сеньоров и уверенных мидлов и он обычно звучит не "что такое солид", а "почему им надо пользоваться". У сеньора к этому времени должен появиться хоть один любимый принцип, на примере которого он расскажет или почему АТ-фреймворк стал удобней и читабельней благодаря соблюдению, или как после нарушения начался анал-карнавал.

Если АQA к своему сеньорству не спроецировал solid на свой практический опыт, это не то что проблема, но тревожный звонок.

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

Нередка ситуация, когда человек интуитивно работает по SOLID, но объяснить не может. При этом подготовить историю про SOLID умеет любой гадкий курс "как пройти собес", и отличить прошедшего курс от реально понимающего непросто

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

you are welcome

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

:)

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

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

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

Образование в массы, чтобы не было как в фильме Идиократия или ролике про образование

Предпросмотр
YouTube7:26
показать ответы
2
Автор поста оценил этот комментарий

инкапсуляция, наследование, полиморфизм
Прям как учебнику.

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

Кажется, в новых учебниках пихают четвертый принцип. А в некоторых я видел 9 - ужас творится

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

С этим я не спорю.


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


Хотя, конечно, инкапсуляция не про геттеры и сеттеры - с этим я полностью согласен.


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

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

Триггернуло именно непонимание, что ООП не в сеттерах и геттерах.


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

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

Только не функций, а «подпрограмм», это могли быть как функции (call/ret), так и просто выделенные куски кода (jmp с ручным управлением адресами возврата)

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

Угу. Но функция вс подпрограмма вс именованный блок кода - это терминологические баталии. Типа как "а у функции на входе аргументы или параметры?"

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

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

А уж кусок что ты привел - нахуя? Кому ты что этим доказал?

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

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

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

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

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

Если интерфейс (в нашем случае метод run) остался, то я не вижу нарушения принципа открытости/закрытости


Даже не поленился для вас зайти в первоисточник Object-Oriented Software Construction Bertrand Meyer, 2 издание, стр. 57


A module is said to be closed if it is available for use by other modules. This assumes that the module has been given a well-defined, stable description (its interface in the sense of information hiding).

Я не меняю Dog. Я создаю Сhihuahua и в этом новом классе, соблюдая интерфейс, делаю своё поведение. Кому надо поведение Сhihuahua — вот он, используйте. Кому не надо — берите оригинальный Dog

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

причем тут ооп и микросервисы? Это разные уровни совсем. Микросервис как раз и будет инкапсулировать какую-то часть логики нид для бэка

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

Согласен, непонятно товарищ написал. Может, он имел в виду перезапуск докер-контейнеров? Ну тоже такое себе, если что-то сломалось и чинится перезапуском, то ситуация стрёмная

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

А куда code reuse дели? Тоже к ООП относится.

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

Мммм? Переиспользование кода придумали в ещё процедурной парадигме в виде повторного использования функций

показать ответы
0
Автор поста оценил этот комментарий
Объясни мне мудрый человек, а зачем в ABAP добавили ООП?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Понятия не имею. А зачем нам обсуждать древний коболоподобный язык?)

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

да, пишу автотесты и участвую в развитии АТ-фреймворка.


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

У меня до пизды классов из трёх-пяти полей и этак пяти методов, потому что с точки зрения бизнеса всё довольно просто, список систематически проверяемых значений небольшой, часть полей проверяется в 70 тестах и идёт в DTO, часть в 7 и проверяется непосредственно в тесте. А ещё для некоторых проверок я в очень упрощённом виде копирую полноценную работу приложения, например чтобы свериться что разрабы считают надбавку за сверхурочные по правильной формуле.


Ну и отдельные сто грамм про DTO. DTO - охуенная тема. В API тестах пишешь хороший годный DTO, может даже нагло копируешь у разрабов. Ответы с бэка в него парсятся просто отлично, пихать весь DTO в асёршен вместо построчной проверки по полям волшебно. Переиспользовать его для создания более сложных объектов и передачи части полей сразу в другой объект куда удобней чем ковырять построчно или писать методы-уродцы на 3-5 параметров. Потом берёшь и цепляешь API-репо как зависимость к UI. Этот же DTO используешь для парса объектов с UI, потому что это тот же бизнес-объект, просто представленный в ином формате. У тебя везде одинаковый объект для работы с некой бизнес-сущностью, даже полный дегенерат не сможет забыть проверить поле или заполнить его неправильно, потому что или получит эксепшеном в консоль, или будет трахаться с падающим асёршеном на дебаге. Если заказчик и как следствие приложение отказались от поля, поменяли формат, нассали в тапки, всё чинится в одном месте, а не во всех автотестах.


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

...и объяснять джунам что такое виверровые.

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

отличный коммент, спасибо

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

Что питон, что си++/ява слишком узко трактуют изначальные принципы. Реакция на события и взаимодействие событиями первичны (а вовсе не частная реализация на таблицах указателей), так что в этом смысле SmallTalk/Objective-C/Self бОлее ООП системы, чем обсуждаемые.

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

Безусловно соглашусь. Но  индустрия отошла от изначального понимания - это факт. Поэтому сошлись на трёх китах и ладно.


Например, почему HTML - это не язык программирования? Я знаю, что это язык разметки. Но что такое язык программирования? Вот тут и начинаются терминологические замуты. Кто-то скажет, что HTML - не тьюринг полный. Тут совсем прикол, т.к. много ЯП не тьюринг полные. Кто-то вспомнит про ветвления. Но в декларативных языках тоже может не быть ветвлений.


Короче, терминологические споры могут быть злом. Определите понятие "понятие", как это бесило в философии

13
Автор поста оценил этот комментарий
Исторически ООП задумывалось в таком виде: программа проектируется как множество объектов

Есть "исторически" а есть "практически". История ушла (это где там сообщения ыли ... в smalltalk'е?)


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


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

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

Или очешь ты дать возможность переопределить метод, но только один а не все сразу.


Ну и так далее...


А в питоне у нас вместо ограничений duck typing...

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

Как круто ты про Епифанцева и нейросеть запилил "Я записываю" (Stable Diffusion, правило 63)

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

Как это? Все сломает! У нее сразу скорость будет 30км/ч вместо ожидаемых 0.

Все, гонка выиграна

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

Не пойму я твоей логики. Давай на примере. Пусть собаку по документации надо использовать так:

dog = Dog(legs=4, name="vasya")
dog.move_to("start")
dog.run()  # тут внутри меняем self.speed
dog.move_to("home")

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


Ты утверждаешь, что порядок вызова можно проверять. Ну да. Тогда можно также проверять, что до run скорость была 0.


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

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

То есть все методы которые работают с полями обьекта и есть инкапсуляция?

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

Инкапсуляция - это объединение данных и методов для работы с этими данными. То есть да, поля и методы - это и есть инкапсуляция


Сокрытие - это техническая деталь реализации инкапсуляции, которой может и не быть

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

Кардинально все меняется! Нужно правильно софт писать и будет все ок! Никакой неправильпый порядок не помешает! Валидируем данные, паттерн State и State Machine еще почитай  - и все ок

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

Тогда и dog.speed ничего не сломает)

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

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


А если это еще и не обычный сайт а например управление цехом на заводе? А если управление космическим кораблем? Атомной электростанцией?

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

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


И да, софт может убивать, как в той истории про рентген-аппарат https://habr.com/ru/company/pvs-studio/blog/307788/


От того, что у вас есть private, ситуация кардинально не меняется. Можно в неправильном порядке вызывать методы. Подавать неверные аргументы. Изменение поля напрямую только один из примеров неправильного кода, и что он должен доказать?

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

Можно писать что угодно - вопрос - зачем нужна инкапсуляция?

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

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

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

что за пример - dog = cat? при чем это вообще

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


ограничение тоже важно! то что вы рассказываете - это просто архитектурное решение!

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

dog = cat - это пример присвоения кошки в собаку. Ровно как dog.speed = 30 - мы можем запрограммировать что угодно. В каких-то языках нам типизация что-то запрещает, в каких-то - наличие private. А в каких-то таких ЯП ограничений нет или меньше.


В С++ я могу сделать speed как public, и тогда я тоже смогу изменить скорость в любой момент. Бизнес-логика выходит за рамки обсуждаемого)

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

Инкапсуляция позволяет также скрыть от прямого доступа информацию обьекта

к примеру - сделали

const dog = new Dog();

//dog.run() мы не вызывали.
и напрямую делаем
dog.speed = 30;

Это норма? то есть собака бежать даже не начинала - а скорость ее уже 30 км/ч

Я python не шарю - но судя по спичу - инкапсуляции в нем нет.

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

Можно написать даже


dog = cat


И что?)


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

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

private методы и поля есть в python?

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

Нет. Есть только договоренность, которая показывает "это поле типа приватное", но доступ всё равно есть

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

Под абстракцией я понимаю более узкое определение - абстракция некое описание/представление объекта. Описание отдельно - операции с данными отдельно. Интерфейс - класс имплементирующий этот интерфейс.

Под сокрытием я тоже не про private/protected. А скорее про то что вызывая метод объекта, пользователь не видит что происходит в этом методе, есть набор параметров и есть ожидаемый результат, все что внутри - черный ящик, инкапсуляция

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

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


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

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

Странно... Точно помню что меня учили именно 4 принципам ООП. Питон вообще не знаю, не думал что там так устроено и этот аспект оставлен на ответственность разработчика.

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

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


Прикол в том, что в питоне нет сокрытия, но при этом есть ООП. Значит, сокрытие не часть ООП. Более того, можно сокрытие сделать на чистом Си (в заголовочном файле определив структуру Точка с координатами X, Y - в этом случае в файле реализации получить доступ к координатам нельзя, но можно использовать функции сложения точек, например). То есть сокрытие есть, а ООП нет

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

Эм. Какие меньше 10 лет?)))) Я когда начинал изучать, лет 15 назад, уже была одним из принципов.

Про сокрытие. В питоне вообще невозможно скрыть внутреннее состояние объекта?

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

Меня в 2010 году учили, что ООП стоит на 3 китах, а абстракция была основным инструментом в любой парадигме. Даже переменная сама по себе абстракция.


Нет, нельзя скрыть. Можно с помощью _name заявить, что name — внутреннее поле не для использования снаружи, с помощью __name изменить порядок доступа (но залезть всё равно нужно, просто синтаксис становится кривым), вроде с помощью костыля переопределить метода доступа к аттрибуту и создать ещё больший барьер для доступа — но полностью скрыть нельзя

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

Нахера объяснять, если не умеешь?

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

Что-то конкретное не понятно или некорректно?

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

Рефлексию тоже не просто юзать ) но, если мне не изменяет память, тот же Spring на ней целиком построен был, из-за чего и поломался при очередном обновлении Явы, где этот механизм поменяли.

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

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

Угу

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

Вроде всю жизнь было 4 основных принципа ООП? - Абстракция, инкапсуляция, наследование, полиморфизм.

Инкапсуляция - именно что сокрытие. Сокрытие внутреннего состояния, предоставление публичного набора методов.

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

Пост не читали? Абстракцию добавили как четвёртый принцип относительно недавно (меньше 10 лет), и я удивляюсь до сих пор.

Про инкапсуляцию в посте

Некоторые ошибочно говорят про "сокрытие" и начинают про private-public-protected, но этого не требуется. Поэтому, например, в python нет сокрытия, а инкапсуляция всё ещё есть.


Про абстракцию

некоторые относят к китам ООП ещё и абстракцию "для выделения в моделируемом предмете важного для решения конкретной задачи по предмету" (вики). Тут у меня вопрос. Вообще всё программирование состоит в выделении важного и игнорировании неважного независимо от парадигмы. Причём тут ООП? А если мы говорим о выделении сущности собаки в виде полей, то это свойство называется инкапсуляция.

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

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

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

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

Ну да. Но в питоне мало принято юзать два подчёркивания. Типа одно как рекомендация и поехали

показать ответы
0
Автор поста оценил этот комментарий
Ээ, в питоне что, все свойства публичные? Пиздец помойка, а не язык
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Угу, всё публичное. Можно через подчёркивание _name сделать рекомендацию "не лезь туда" или через __name слегка осложнить использование переменной.


А так динамически делай что хочешь

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

> а у функции на входе аргументы или параметры?

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

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

:)

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

Все это круто, но в реальности несколько сложнее.


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


Инкапсуляция в терминах ООП - обычно именно про состояние. Т.е. про поля. Но я видел как кучу классов без полей (по сути, контейнеры для функций), так и классы без логики (простые DTO-шки). А геттеры-сеттеры - это и вовсе карго-культ какой-то, так как 99% виденных мною ничего не делали кроме как чтения/записи приватного поля. Но все равно их зачем-то пишут.


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


Короче, ООП в реальных проектах не совсем по учебнику. И смешано с другими парадигмами, в частности с ФП.


Хотя, конечно, наверное ещё и от области зависит, я со своей колокольни смотрю.

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

Изоляция логики, понятно, везде есть. Этого и пытаются достичь


Инкапсуляция да, про состояние и поля, про это и писал. Естественно, можно игнорировать что угодно при написании кода. Типа можно класс использовать как пространство имён для группировки функций, кто запретит


Наследование сейчас стараются минимизировать и пользоваться композицией.


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


Своим постом я лишь попытался донести, что конкретно в ООП есть важные аспекты. Они дают плюсы и минусы. ООП — это не про классы или public/private

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

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

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

Так и я предложил переопределить Сhihuahua.run, чтобы оно внутри делало Dog.run + доп звук. При этом, вообще говоря, я могу изменить run на любой другой тип бега вообще не вызывая Dog.run. С точки зрения внешнего наблюдателя это run, что именно я делаю внутри зависит от конкретной собаки. Гипотетически, мы можем сделать ВреднуюСобаку, которая на эту команду бежать отказывается и начинает лай.


Не вижу нарушения буквы O из SOLID

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

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

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

Согласен, что senior и team lead — они ещё обязательно про коммуникацию. Даже middle на самом деле тоже.


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

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

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

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

Это скорее к монолит вс микросервисы. Последнее позволяет снизить вход новых разработчиков (им выдаётся обособленная задача), но добавляет головную боль на управление толпой микросервисов.


Внутри может быть ООП, а может быть и нет.


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

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

Мое ооп круче твоего)

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

Бог создал людей, а кольт сделал их равными. А беретта добавила изящности :)

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

Я вот вообще нихера не понял, но плюсов всем насовал.

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

Пикабу-ориентированное прочтение. Плюсую всем!

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

только знакомлюсь с питоном, это самое офигенное объяснение сути, которое я видел)

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

you are welcome. Это объяснение для почти любого языка подойдёт

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

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

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

Люблю self за явность. Нет магии, просто интерпретатор туда подставит экземпляр класса. Ты полностью понимаешь, что происходит

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

как ООП'шник со стажем. тесты никуда не деваются. это норма, я бы сказал база для любой разработки. язык, подходы, не особо важны

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

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

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

На практике - у типа 1 надо автоматом закрыть issue, если прошли тесты, а у типа 2 не надо. Вот появилось разное поведение. И оно не ползёт по коду в виде портянки if.

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


Но ты выбрал иф при конструировании хендлеров. Вот интересно чем ты руководствовался.

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

Я не хочу много функций.


У меня есть тракт обработки


for repo in self.repos:
.    repo.process()   

В зависимости от класса repo будет разный process(). В базовом варианте — просто смотрятся разные файлы. В более сложном — сам process разный, я привёл пример с закрытием issue.


Ты предлагаешь

for repo in self.repos:
.    if repo.type == 1:
.        process_1(repo)
.    if repo.type == 2:
.        process_2(repo)
...
Ну, это путь в ад, потому что он не расширяем. Да, где-то будет if выбора типа. Но я предлагаю делать этот if в одном месте, а дальше для каждого класса будет своя, сколь угодно отличная обработка. Более того, человек, который пишет код про process вообще не должен заморачиваться об отличиях внутри. Я скрыл всю сложность обработки от него

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

Инкапсуляция, если подняться повыше, от уровня языка к уровню архитектуры, несколько меняет смысл и становится ближе к модели чёрного ящика из системного анализа. Сокрытие реализации + контракт для взаимодействия. Модификаторы доступа в этом случае служат одним из инструментов достижения цели.
От сырого принципа из учебника информатики "мы объединили данные и методы в один класс, вот это да!" в проектировании пользы примерно ноль.

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

Вот именно. Один из инструментов, а никак не определение инкапсуляции

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

Да, вроде того. А потом все hander сохраняются в списке объектов для дальнейшей обработки

А как ты для себя решил, что вот этот подход лучше, чем такое же ветвление, но в методе класса handler? Чем один if лучше чем другой?

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

Потому что это переписывалось, и там if был в каждом месте обработки файлов, и вот это был ад.


В целом, никто не мешает if поместить в конструктор и заполнить нужный список файлов. Но подход с разными классами более расширяемый. Например, я могу переопределить метод "обработать" так, чтобы у Hander1 что-то дополнительное делалось, например, что-то туда копировалось. На практике - у типа 1 надо автоматом закрыть issue, если прошли тесты, а у типа 2 не надо. Вот появилось разное поведение. И оно не ползёт по коду в виде портянки if. Выбор if только при конструировании hander, а потом работает нужная сущность

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

Снаружи, т.е. указано во входном файле. Студент1 — тип1. Но там многостадийная система, поэтому проще при инициализации экземпляра класса сказать тип и забыть про него.

То есть у тебя где-то в фабричном методе код типа


var handler ;

if student.type == 1 then hander = new Handler1()

else if student.type == 2 then hander = new Hander2()


Так выходит?

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

Да, вроде того. А потом все hander сохраняются в списке объектов для дальнейшей обработки

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

Утверждаю, что определение "инкапсуляция - это сокрытие данных" неверное

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

Питон - мультипарадигменный. Там можно как угодно писать.

Ну так в основном как на нём пишут? Если без ООП, то тогда уверждение что ООП  в основном не используется,  вполне может быть верным ))

Да, len - параметрический полиморфизм, но полиморфизм же.

Ну так в ООП не любой полиморфизм, а полиморфизм подтипов. Так что с моей точки зрения функция len - не очень пример для ООП.

Метод process наследуется у BaseHandler и не трогается, а вот список файлов вынесен в поле Handler1 и Handler2.

А как ты принимаешь решение каким хендлером обрабатывать проект?

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

Но если ты это выдашь случайному программисту, то он мягко говоря офигеет от удивления ))) . И соответсвенно, рассчитывать, что когда ты говоришь инкапсуляция, он думает о чём-то отлчичном от сокрытия - нельзя.
Когда разработчик на вопрос "что такое инкапсуляция" говорит "это private-public-protected", то я расстраиваюсь. С этого и родился пост — когда человек говорит, что нет геттеров — значит, не ООП.

Если без ООП, то тогда уверждение что ООП в основном не используется, вполне может быть верным ))
Опять же, не спорю. И с len соглашусь, да


А как ты принимаешь решение каким хендлером обрабатывать проект?
Снаружи, т.е. указано во входном файле. Студент1 — тип1. Гипотетически, можно флагом при обработке указывать. Но там многостадийная система, поэтому проще при инициализации экземпляра класса сказать тип и забыть про него. В целом, ничего не мешает в конструкторе запомнить переменную и в зависимости от неё что-то заполнить. Ну да — в разработке всегда больше одного варианта
показать ответы
2
Автор поста оценил этот комментарий

В питоне нет сокрытия. Всякие нижние подчёркивания — это договорённости

Договорённостей вполне достаточно для того, чтобы писать код, так что предлагаю считать, что сокрытие в Питоне есть. Сложившаяся практика важнее наличия фич мне кажется.

При этом в питоне ООП есть, верно?

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

Например, функция len работает в зависимости от объекта, в которому она применяется.

Ты сейчас имел в виду именно свободную функцию? Не метод? Функцию, которая по разному работает, когда в неё передают объекты разных типов? Тогда это совсем не ООП, а в лучшем случае параметрический полиморфизм.

Дальше, в gamedev всё тоже на этом.

Ааа, ты геймдевом занимаешься? Это многое объясняет, конечно. Наверное там действительно есть такой код.


Ты слышал про ECS? В Unity вроде в полный рост практикуется. В Питоне в геймдеве этот подход не используют?

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

Договорённостей вполне достаточно для того, чтобы писать код, так что предлагаю считать, что сокрытие в Питоне есть. Сложившаяся практика важнее наличия фич мне кажется.

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

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

Питон - мультипарадигменный. Там можно как угодно писать.

Ты сейчас имел в виду именно свободную функцию? Не метод? Функцию, которая по разному работает, когда в неё передают объекты разных типов? Тогда это совсем не ООП, а в лучшем случае параметрический полиморфизм.

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


Или что я могу любой класса превратить в iterable тип, и внешний код сможет for obj in my_class делать.


Ладно, прикладной пример из недавнего. Есть группа проектов студентов, в каждом должны быть формальные файлы с фиксированными именами. Штука в том, что в некоторых проектах имена отличаются (условно, два варианта есть). Так вот, чем в код тащить if project_type == 1 делаем то-то, я делаю два класса-обработчика - Handler1 и Handler2. Метод process наследуется у BaseHandler и не трогается, а вот список файлов вынесен в поле Handler1 и Handler2.

Ты слышал про ECS? В Unity вроде в полный рост практикуется. В Питоне в геймдеве этот подход не используют?

Не, я не про gamedev, вспомнил просто оттуда пример. Про ECS не знал, почитаю, спасибо https://habr.com/ru/company/mygames/blog/590953/

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

Согласен, композиция это круто.

Отсутствие ограничений даёт проблемы в долгосрочной перспективы. Так как любая ошибка, которую не поймал компилятор - это потенциальный косяк в рантайме. Чем больше свободы, тем меньше ошибок ловит.

Ну хоть у меня это не основной язык, что радует. (*смотрит на страницу питон кода*)

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

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

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

Да спрашивают по тому, насколько глубоко в понимании нахера оно надо собеседуемый зайдет. Если скажет, что инверсия зависимостей это про "детали от абстракции", то значит список ответов на собесы прочитал, если расскажет, что это породило класс архитектур, включая чистую, расскажет про IOC контейнеры и прочая, то это значит чел хотя бы в курсе, как этим пользоваться

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

Тяжело определить. Сейчас много профильно готовят к собесам, и как раз развёрнутый ответ даст тот, кого натаскали. Крутым ответом я бы считал свой пример (либо на коленке сделанный типа dog_party, либо давайте зайдём на гитхаб в мой код, вот тут я этот принцип применил).


Пока лучшим решением по оценке разработчика я считаю дать фрагмент кода и попросить починить + объяснить, что было плохо. На это (пока?) натаскать нельзя

показать ответы
13
Автор поста оценил этот комментарий
Исторически ООП задумывалось в таком виде: программа проектируется как множество объектов

Есть "исторически" а есть "практически". История ушла (это где там сообщения ыли ... в smalltalk'е?)


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


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

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

Или очешь ты дать возможность переопределить метод, но только один а не все сразу.


Ну и так далее...


А в питоне у нас вместо ограничений duck typing...

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

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


Отсутствие ограничений, даааа. Радостно, конечно, что мне в питоне не нужны

порождающие паттерны, но блин. Цена за это тоже высока

Иллюстрация к комментарию
показать ответы
1
DELETED
Автор поста оценил этот комментарий

Можно ещё вспомнить принципы ООП SOLID:
- Единственной ответственности
- Открытости/закрытости
- Подстановки Лисков
- Разделения интерфейсов

- Инверсии зависимостей

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

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

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

В реализации классов.

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

Не понял, к чему уточнение?

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

ну значит и инкапсуляции в нем нет!

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

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


Можно зайти с другой стороны. Если я буду работать только с public полями и методами, от этого пропадёт инкапсуляция? Ну, тоже не пропадёт. Значит, инкапсуляция - оно не про сокрытие.


Но мне не трудно оставить вас при своём мнении :)

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

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

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

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

1
Автор поста оценил этот комментарий
А потому, что он жив. Живет хорошо и там зачем-то добавили ООП:)
раскрыть ветку (1)
Автор поста оценил этот комментарий

Потому и живёт, наверное. ООП выручает, 3 кита как-никак

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

Люто плюсую! Отлично написано!
Хотя меня, как заядлого плюсиста, реализация классов в питоне немножко раздражает. Такой шикарный лаконичный язык, а чтоб класс написать нужно много лишней требухи. Но это может потому что я его знаю херово =)

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

Вроде создать класс лаконично

class MyClass:
.    pass
a = MyClass()

и оно уже работает. Дальше, правда, надо знать про магические методы, но это в целом несложно

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

да вот фиг знает, что понадобится на самом деле)

Только за сегодня мне пришлось покопаться в деталях анзибля, эластика, с3 и кафки, вот как это проверишь?) нужны навыки основ и навык гугления. основы проще по теории и ревью, а гугление как раз допер ли человек погуглить "10 самых частых вопросов на собеседовании".

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

Навык гугления важен. Я даже пост про это писал Как анализировать предметную область перед разработкой на примере видеоаналитики


А ещё важнее — навык решения проблем и доведения дел до конца. Но на собесе не это спрашивают, а выполнение конкретных, но не имеющих отношения к работе действий (напиши на белой доске / расскажи о SOLID). При этом я сам люблю всякие аббревиатурки, но они не коррелируют с полезными навыками.


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

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

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

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

Считаю, что на собесе нужно проверять основные умения разработчика, требуемые в работе. Если разрабу не придётся писать маркером на доске, то зачем проверять этот навык? Если он не будет разрабатывать алгоритмы, то зачем проверять это?


Хочешь увидеть обход графа — сформируй задачу, дай входные данные и посмотри на код, который будет написан. Желательно в рабочем окружении того разработчика, которого собеседуешь. Если так не выходит, то в сколь-нибудь приближенном.


Вот я часто пользуюсь vim. Но я же не буду сажать разработчика за машину только с vim? Я дам pycharm, atom, vscode — что привычнее.

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

Гитхаб очень мало у кого есть, а вот дать кусок кода на ревью, обсуждая его построчно, довольно годная практика. Типа джун принес вам ЭТО на ревью, что будете делать?) Хотя времени отжирает от собеседования прилично...

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

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


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

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

в смысле, блядь, инкапсуляция - это объединение данных? Ты там совсем охуел?

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

Вероятно. Что ты считаешь неверным?

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

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

В каких-то языках программирование программист сам следит за жизненным циклом созданных объектов (классов), в каких-то ложится на плечи интерпретатора/компилятора.

О чём многоуважаемый господин Avlode пытается донести до общественности.

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

Ну да, а ещё надо за переменными следить и тоже их удалять, если в языке автоматическое управление памятью :)

7
Автор поста оценил этот комментарий
Только потом появляются костыли в виде type hints в питоне, js мутирует в TypeScript, один только bash держится.
раскрыть ветку (1)
Автор поста оценил этот комментарий

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества