. Как перенять объектно-ориентированное мышление?
Как перенять объектно-ориентированное мышление?

Как перенять объектно-ориентированное мышление?

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

Заранее благодарю за ответы;_

  • Вопрос задан более трёх лет назад
  • 14596 просмотров

Средний 1 комментарий

  • Facebook
  • Вконтакте
  • Twitter

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

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

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

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

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

И главное, у каждого объекта есть своя область ответственности. UNIX way. Каждый объект делает что-то одно и делает это хорошо. Бывает так что ну. нужно сделать так что бы один объект делал две вещи. НЕ вопрос, мы можем его попросить сделать что-то сложное, а он будет как хороший менеджер тупо делегировать работу другим объектом. То есть он и сложную штуку сделает, и сам не будет знать как она делается.

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

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

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

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

Есть хорошие упражнения на развитие понимания объектно-ориентированного проектирования. Например вот: https://habrahabr.ru/post/206802/

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

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

📎📎📎📎📎📎📎📎📎📎