Kirill Profile picture
6 Jan, 20 tweets, 4 min read
Три треда по ООП это не предел. Мы еще не все проговорили, поэтому продолжаем дальше. #oopmyths После этого треда (а может и в нем), я подведу итоги о том, как же все же проявляется ООП в реальности. А сейчас поговорим про инкапсуляцию.
Начнем с опроса. Поменяли ли вы мнение о значимости разных штук в ООП после прошедших тредов?
Кстати в процессе, благодаря переписке с разными людьми я тоже кое что подтянул. В первую очередь увидел что когда речь идет про "сообщения", то есть разные интерпретации того чем считать сообщение. Динамическую диспетчеризацию (в умах) или явное управление реакцией (по кею).
Плюс я посмотрел еще немного разных книг по ООП и довольно забавно что там везде первые главы посвящены тому, что ооп штука непонятная и у нее много интерпретаций. Дальше идет пояснение разных моментов и отношения к ним разных людей.
Итак инкапсуляция. Под этим термином понимают две вещи: объединение данных и функций в одном месте и защиту данных (data hiding). Второе встречается намного чаще, но конкретно в классовых языках защита сильно завязана на объединение. Что здесь правда и что здесь важно?
Честно говоря я бы разделял эти понятия, потому что есть языки где данные и функции вместе, но там нет сокрытия (защиты). Например JavaScript. Но бывает и наоборот, сокрытие есть, но объединения нет.
В руби, например, вообще нельзя (с помощью рефлексии можно) получить прямой доступ к внутренностям объектов. Только через методы. Сокрытие там не опция, а единственный путь. В js же ровно наоборот. Как сильно влияет это на код на этих языках? На архитектуру?
Попробуйте провести мысленный эксперимент. Представьте что в js добавился data hiding (уже скоро будет в стандарте). Насколько это повлияет на код? А что если убрать сокрытие из других языков, где оно есть? А что если убрать его просто из кода где оно есть? Например из java кода?
Если хорошо подумать и покрутить, то код фактически не изменится. Это никак не влияет на архитектуру ни на способ мышления о программе, ни на что. Тогда в чем соль инкапсуляции как сокрытия?
Главное слово этого треда "инварианты", это некоторые условия, которые должны всегда соблюдаться относительно наших данных. По простому, это способ гарантировать их согласованность. Если менять данные напрямую, в обход предназначенных для этого методов, то можно нарушить связи
Например при добавлении нового товара в корзину должна пересчитываться скидка. Если товар добавляется напрямую, то код отвечающий за скидку не выполнится, так как он содержался в методах добавления. Нарушенный инвариант это логическая ошибка в программе и типы тут не помогут
Сокрытие данных призвано решить эту проблему. Но, дальше начинается туман. В реальности, все не так просто. В сети довольно много статей, показывающих бесполезность этой защиты. Во-первых из-за ссылочных данных, которые можно изменять напрямую, во-вторых из-за рефлексии
В каждом языке есть Reflection API, который позволяет пойти во внутрь чего угодно и поменять там что угодно. Более того (барабанная дробь), многие привычные вещи невозможно было бы реализовать без возможности пойти в кишки. Ни ORM, Ни контейнеры зависимостей.
private/protection по большей части это защита от дурака, создатели этой штуки считали что программисты недостаточно умные и их нужно контролировать. В итоге различные final и private создают больше проблем чем помогают. @nikitonsky недавно написал шикарную статью. не могу найти(
Там написано (и я согласен), что программисты понимают интерфейсы на интуитивном уровне и не будут стрелять себе в ногу ходя в обход интерфейсов. Все что нужно это хелп-система: "это интерфейс, а это для внутреннего использования". Это сильно упростит поддержку и багофикс
А сейчас получается, что создатели либ и языков за программистов решили что нефиг. Все стараются специально ограничивать возможности по модификации. Соответственно если есть сложные ситуации с багами, то иногда не остается выбора кроме как форкать
Ну и пример, вот у нас перед глазами JavaScript в котором нет сокрытия (но можно сделать через замыкание) и эта проблема не стоит так, что дрожит земля. Я вообще не вижу никаких разговоров об этом кроме "я так привык программировать".
Но чтобы не вводить никого в заблуждение. Описание выше это мое (не только) отношение к сокрытию. Многие считают что это важно, чтобы сдерживать программистов от треш-кода. А вот подкинули статью Никиты: t.me/nikitonsky_pub…
Теперь ответ на главный вопрос. Насколько инкапсуляция как сокрытие это про ООП? Честно говоря, я бы сказал ни на сколько. Это про все что угодно кроме самого ООП. А вот инкапсуляция как объединение данных и функций это совсем другой разговор. Об этом в завтрашнем треде)
И посмотрите ответы на один из первых опросов:

Сейчас на эти результаты можно посмотреть немного в другом свете.

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Kirill

Kirill Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @mokevnin

19 Jul
Заждались тредов? Их есть у меня. Cегодня поговорим про такую мегаважную штуку как "идемпотентность", про то как она позволяет проектировать более надежные системы. Ретвитим, не стесняемся! Небольшой опрос. Насколько вы в курсе про идемпотентность?
Идемпотентность – это свойство какой-либо операции, например, вызова функции или выполнения HTTP-запроса. Операция считается идемпотентной, если повторные выполнения приводят к тому же результату что и первое выполнение. Рассмотрим кучку примеров из самых разных направлений
Возьмем команду mkdir в линуксе. Она создает директорию: mkdir jopa. Что будет если выполнить эту команду два раза? Во второй раз мы получим ошибку. То есть операция не идемпотентная. Тоже самое справедливо и для многих других команд работающих с файловой системой. Что дальше? Image
Read 17 tweets
7 Jul
На собеседовании я всегда начинаю разговор с вопроса "где вы сейчас работаете и чем там занимаетесь?". Вопрос простой, но при большой выборке скапливается довольно много интересных, смешных и грустных ответов. Ниже я расскажу о всяких забавных ситуациях и об идеальном ответе =>
Самое страшное когда говорят "начну с самого начала". Началом может оказаться школьные годы и долгий тернистый путь к себе настоящему. Однажды чувак мне сказал "щас я коротко про себя расскажу". Через 30 минут пришлось его останавливать
В любом случае, многие рассказывают про весь свой путь чуть ли не с самого первого дня работы программистом. Как собеседующий я бы хотел пропустить эту часть и говорить про текущую работу, так как это съедает кучу времени. Если понадобиться уйти в прошлое, то я задам вопрос.
Read 13 tweets
24 May
Через час-два тред про функции. Многим кажется, что функции это просто, но нет. Хорошие функции выглядят просто, но реализовать их тяжело. Какими руководствоваться правилами? Об этом и поговорим. #functions
Поехали! Обычно, от функций ожидают сокращения дублирования кода. Да, функции устраняют дублирование, но лишь в дополнение к тому, зачем они нужны. Настоящий смысл функции – повышение уровня абстракции. Звучит немного абстрактно, поэтому раскроем подробнее =>
Мир сложная штука, но эта сложность спрятана за простыми и понятными вещами. Например, работать с клавиатурой может даже ребенок, но лишь потому что она хорошо спроектирована и прячет от нас детали реализации. Нам не нужно знать физических законов для ее использования
Read 25 tweets
11 May
Метатред по серии "Автоматное программирование". Рассказываю тут про флаговое программирование, явно выделенное состояние, автоматы на бекенде, автоматы на фронтенде и кидаюсь кучей полезнях #FSM
1. Автоматы как способ моделировать процессы вокруг нас
2. Автоматы во фронтенде
Read 4 tweets
20 Apr
Третий тред по автоматному программированию. Поговорим про бекенд на разных языках. Ситуации, связь с базой, готовые либы и применимость. Ретвиты приветствуются! Вопрос: Используется ли в вашем проекте либа для автоматов?
Краткий пересказ прошлых частей. Автоматы есть всегда, главное их увидеть и заменить флаги на явно выделенное состояние. А в бекенде еще и автоматизировать работу с ними. Как?
Независимо от выбранного стека, состояние практического любого проекта отражается на базу данных. Заводятся либо флаги, либо поле state/status куда записывается название текущего состояния. В отличии от фронтенда, с автоматами в беке надо быть гораздо более аккуратными
Read 20 tweets
16 Apr
Вторая часть про Автоматное Программирование. Сегодня поговорим со стороны фронтенда, а следующим тредом про бекенд. Не забываем лайкнуть и пошарить, дабы добро дошло до всех уголков твиттера. Поехали! #fsm
Напомню что конечный автомат это удобная модель, с помощью которой естественным образом описываются процессы с дискретным состоянием. Простой пример – модальное окно. Оно может быть закрыто или открыто и его можно закрыть или открыть. 2 состояния, 2 перехода.
Состояния влияют на то что можно делать с объектом о котором идет речь, а переходы это собственно то что мы программируем. Кстати иногда возможны переходы в самого себя. Про это поговорим отдельно в бекенд истории.
Read 19 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!

:(