Начинаем третий про наследование и отношения. Во второй части был опрос про отношения, на который правильно ответило только 29 процентов! И кажется что не все поняли первый тред. #oopmyths
Начнем как обычно с опроса. Вопрос: "Объяснять ООП надо через аналогию с реальным миром". Именно так делается в подавляющем большинстве источников и сервисах типа стековерфлоу.
Строго говоря, отношение частное-общее про типы, а не классы. В статье про сабтайпинг об этом написано внизу: en.wikipedia.org/wiki/Subtyping. И принцип лисков тоже не про классы. Наследование классов это всего лишь способ убрать дублирование кода. Один из худших способов.
Почему худших? Несколько моментов. Самое простое – об этом написано на каждом углу. Каждый специалист в ооп, каждая книга говорят одно и тоже. Предпочитайте композицию наследованию. Есть даже вопросы, которые задают на собеседованиях посвященные этой проблеме плавает/летает/ходит
Мне очень хочется разобрать всю эту статью на цитаты и добавить сюда, она проливает свет на многие аспекты и проблемы.
Среди прочего, эта проблема затрагивает классификацию как таковую, не важно речь идет про классы или про типы. Цитата:
> It may also imply that hierarchical taxonomies are difficult to make universal, implying that situational classification systems may be more practical.
Дело в том, что мир не иерархичен. Отношения между вещами всегда зависят от того как мы на них смотрим. Сегодня нам надо разделить машины по предназначению, завтра по вместимости. Как это сделать? И вот для этого используют трейты/миксины, которые намного практичнее и удобнее.
А теперь кое что интересное. В математике есть понятие необходимости и достаточности. Необходимое условие это то, без чего не может выполняться какое-то утверждение. Все это позволяет найти так называемый "базис", минимум необходимый для валидации утверждений. Где тут ооп =>
Про ООП говорят что это "наследование, полиморфизм, инкапсуляция". Теперь вопрос. Может ли называться программа ООП, если в ней не используется наследование?
in object-oriented programming (OOP) is the principle that classes should achieve polymorphic behavior and code reuse by their composition rather than inheritance from a base or parent class.
Принцип ООП нарушающий ООП!
То есть получается что наследование классов хоть и ООП фишка, но это некая дополнительная приблуда, которой могло бы и не быть. Более того, на практике композиция + трейты/миксины делают наследование рудиментом.
В принципе не так много людей считало наследование основной фишкой, но все же такое мнение существует.
Кстати немало паттернов как раз описывают разные способ ухода от наследования. Например различные варианты делегирования/проксирования.
Кстати, множественное наследование как раз пыталось решить ту самую проблему классификаций. Но в итоге получилось таким сложным, что большинство языков его не поддерживают намеренно. И снова трейты/миксины победили. На подумать en.wikipedia.org/wiki/Data,_con…
Ну и наконец абстрактные классы, анонимные классы, вложенные классы и еще куча всяких видов классов специфичных для разных языков. Все эти виды классов решают какие-то утилитарные проблемы (модули, реюз кода, дубли), часто даже искусственные (которых не было без классов).
И вот с абстрактными классами вышло неожиданно. В опросе аж 25% человек ответило что это про отношение частное-общее.
В апреле исполнилось 5 лет с переезда в штаты, а конкретно в Майами. Сделаю небольшой тред ретроспективу. Что нравится, что нет, какие дальнейшие планы =>
Мы переехали в 2019 году после того как моя жена выиграла грин-карту. Играли мы второй раз на тот момент, но честно говоря, скорее по приколу чем с какими-то надеждами. Мы планировали переезжать, но в испанию. Гринкарта все упростила + английский язык, поэтому выбрали США
До этого я в сумме прожил года 3 в других странах. Много где жил по месяцу и больше, например в испании, тайланде, черногории, италии, турции и даже в штатах в 2015 году я пожил полгода (месяц в санта-монике и 5 месяцев в майами). То есть я хорошо понимал как оно, без иллюзий
Тред с вопросами, которые имеет смысл задать на собесах, чтобы проверить уровень разработчика и навык решения прикладных задач (типовых для веба) Поехали =>
Предположим что вы реализуете редакцию журнала, где редактора могут в админке править статьи. Как предотвратить ситуацию, когда два редактора могут начать одновременно редактировать одну статью и перетирать изменения друг друга?
Каких принципов разработки нужно придерживаться, для обеспечения механизма zero downtime deployment, это подход при котором приложение деплоится без простоя сервиса. Как это достигается?
Немного мыслей про SPA-приложения и серверный рендеринг. Еще каких-то 10 лет назад, весь рендеринг был серверный, а веб работал как и задумывалось. Клик по гиперссылке загружал новую страницу, которая представляла из себя уже готовый к отображению HTML. Клик = новая страница =>
В такой схеме (тонкий клиент) все было просто и понятно. Браузер автоматически знал как делать навигацию вперед/назад и в целом был заточен под такую схему. Плюс она идеально подходит для поисковиков. Индексация процесс, который не вызывал никаких вопросов. Но потом поехало =>
Появилась задача делать сайты более интерактивными, например создавать редакторы, или формы, изменяющиеся без перезагрузки. Сначала это делалось виджетами, которые встраивали кусок js в конкретное место на странице. Потом, постепенно это переросло в SPA, а бек превратился в API
Ну что мои маленькие любители кода, готовы? Тред про то почему используют вим и как это делают. Я расскажу про то как майкрософт сделал революцию в мире редакторов и почему это меняет все. Для тех кому реально интересно попробовать и понять как это - доминировать над коллегами :D
Начнем с дисклеймера. Этот тред для тех, кому по-настоящему интересно узнать почему кто-то использует вим и есть ли в этом смысл для них. Но я не пытаюсь и не хочу убеждать ни в чем людей, которые считают что за рамками IDE жизни нет. Погнали!
За свою карьеру (с 2007 года) я попробовал много всяких редакторов и двигался в сторону от тяжелых IDE в сторону редакторов. Была попытка пересесть на emacs и я даже освоил его сборку spacevim. Пробовал vscode сам по себе и с плагином vim, но в итоге все равно вернулся на vim
Около 13 лет я работаю (программирую и пишу все тексты) в виме на 13 дюймовом мониторе моего ноутбука. Те кто не видел меня за работой говорят "это же не удобно", те кто видел - "можно медленнее, а то я не успеваю". Давно хотел про это рассказать, тред об эффективности =>
Сразу дисклеймер. Мне действительно бывает неудобно на 13 дюймах, когда я занимаюсь отладкой чего-либо в браузере, но в остальном это вопрос организации пространства. Я много работаю в пути и у меня нет одного места, поэтому изначально все это была вынужденная мера, а потом =>
В какой-то момент удалось придумать систему, которая за годы особо не меняется несмотря на развитие технологий, так как она довольно универсальна. Она базируется на некоторых особенностях, которые далеко не все смогут себе адаптировать, но по крайней мере появится представление
Есть у меня список принципов, которых я придерживаюсь когда пишу код. Кратким списком они есть тут ru.hexlet.io/pages/principl… но без раскрытия, а у людей появляются вопросики. Пришла пора ответить за слова. Лайк, тред, инфлюенс =>
"Язык — это инструмент" банально, но факт. Не прикипайте к языкам, язык для души и работы это разные вещи. Я не люблю го, но буду использовать там где он силен, я люблю кложу, но не буду использовать почти нигде (:D) PHP сила, TypeScript могила
"Программирование — это не язык" tldr: вычислительное мышление. Задача => избавляемся от лишнего (Абстракция) => разбиваем на подзадачи (Декомпозиция) => Находим закономерности (pattern recognition) => строим алгоритм. ru.wikipedia.org/wiki/%D0%92%D1…