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

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

Заранее благодарю за ответы;_
  • Вопрос задан
  • 13937 просмотров
Пригласить эксперта
Ответы на вопрос 16
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Т.е. сложно понимаю, что "засунуть" в один объект, что в другой, что должно быть статическим методом, что приватным и тд.


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

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

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

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

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

Вообщем писав всё время на процедурке, сложно перейти на ооп.


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

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

Подскажите, какой проект начать писать (гостевая, блог), или может начать изучать фреймворк.


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

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

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

Или может подскажите книгу/сайт где пошагово в ооп написан какой-то проект, чтобы быстрее пришло понимание.


Так вы научитесь делать один конкретный проект а на втором вы уже проиграете. Так дела не делаются. Надо разобраться с причинами появления идеи ООП. Ну то есть что было до. Можно еще с функциональным программированием попробовать разобраться. В PHP оно слабо применимо, но основные идеи очень тесно переплетаются с ООП и познав немного функциональщины ваше ООП будет лучше. Да и если про ООП вы можете найти много булшита, про функциональщину врут мало.
Ответ написан
GTRxShock
@GTRxShock
Full-stack developer (Symfony, Angular)
Полистайте на досуге HeadFirst Паттерны проектирования:
www.combook.ru/product/10741424

+ как писали выше, Мэтт Зандстра PНР: объекты, шаблоны и методики программирования:
www.combook.ru/product/11140344

p.s. www.phptherightway.com вот еще неплохой ориентир
Ответ написан
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
Возьми доки по ООП и какой-нибудь framework и потрать на них 48 часов. Не 2, а 48. И все станет ясно. Твоя проблема очень распространена после 2-го часа знакомства.
Будет трудно, будет хотеться выпить, плюнуть и войти в белорусский рандом, но надо терпеть. Пройдет 48 часов и все станет на свои места.
Ответ написан
tzlom
@tzlom
Очень просто.
Для начала - признайтесь себе что процедурное программирование у вас тоже страдает (иначе бы у вас не было этого вопроса), это не страшно, но с этим тоже надо что-то решать.
Берёте любой свой процедурный проект (лучше маленький чтобы не застрять в рутине).
Шаг первый - всё есть функция, поэтому весь код вне функций кладёте в функции, итого у вас получается что вне функций идёт только вызов main() (или как вы её назовёте)
Второй шаг - функции работают только с тем, что в них передали. Удаляете глобальные переменные.
Появляется проблема глубокой вложености, т.е. у вас внутри вызова А вызывается Б а в ней В которая хочет переменную из области видимости А, и таких случаев много. Тащить в Б все эти переменные - грустно и печально, поэтому делаем хитрость, каждая функция первым аргументом получает массив неких значений. Правило одно - функции не меняют имена и количество переменных в массиве, только значения.
Третий шаг - функции должны быть короткими, выносите повторяющийся код в отдельные функции, если в функции используется много переменных - это повод разбить её на несколько меньших.
Четвёртый шаг - вы уже пишете на ООП. Если 3 шага правильно сделаны, то осталось только оформить это дело согласно новым правилам - первый аргумент-массив это члены класса, соответственно функции использующие одинаковый массив - методы этого класса, прийдётся разобраться с доступом к полям и отдельными зависимостями, но это уже будет просто и понятно когда ты до этого доберёшься.
Ответ написан
OnYourLips
@OnYourLips
Если вы планируете вариться в собственном соку, то будьте готовы к тому, что на задачу, на которую другой человек потратит месяц, у вас может уйти лет пять.

Не ленитесь читать хороший код. Попробуйте начать с symfony.
Ответ написан
customtema
@customtema
arint.ru
Честно? Всего две книжки. Хотя бы по диагонали.

  • "Рефакторинг" Мартин Фаулер
  • "Архитектура корпоративных приложений" Мартин Фаулер


Расширение сознания гарантированно.
Ответ написан
Rou1997
@Rou1997
Подскажите, какой проект начать писать (гостевая, блог), или может начать изучать фреймворк.
И так и так можно, а в идеале - даже нужно, во фреймворке вы больше научитесь использовать ООП, а в своем проекте - проектировать ООП, если будете думать над тем, как каждую из задач оптимизировать с помощью ООП, а также набираться опыта из фреймворков.

Или может подскажите книгу/сайт где пошагово в ооп написан какой-то проект, чтобы быстрее пришло понимание.
Никто бесплатно не будет такой разбор делать, а большинство и не может, поэтому сами.
Ответ написан
@evgeniy_lm
Психологи "объектное мышление" это называют абстрактным мышлением. Абстрактное мышление отличает человека разумного от других живых существ. ООП придуман для упрощения написания кода, программист описывает задачу в образах (объектах) т.е как есть. Короче, если программист человек то ему переходить ни куда не надо, если не человек то программы он писать неспособен
Ответ написан
@zhainar
Гуглю за вас
зандстра объекты шаблоны и методики программирования
Ответ написан
AmberLEX
@AmberLEX
php/web-developer
Дмитрий Елисеев
www.elisdn.ru/oop-week
Очень расжевывает и доступно объясняет.
Есть много бесплатных видео, чтоб понять уровень.
Это не очередной говно-курс как срубить бабок на перессказе документации.
Посмотрите посты в блоге. Я правда курсы не проходил, но видео-материалы смотрел.
Ответ написан
@Kennyx
Поиграй в JavaRush
Достаточно доступно объясняется на примере игры. Заодно можешь познать Java, если будет желание
Ответ написан
andrievski88
@andrievski88
SEO + маркетинг + веб программаривание.
Здравствуйте, я сам вот два месяца назад начал изучать PHP с самого нуля, уже кое-что прочел и узнал и про ООП. Посмотрите вот этот курс, может чуточку станет понятнее...
https://www.youtube.com/playlist?list=PLSdH7dYnlGY...
И главное не останавливайтесь ни перед какими трудностями, а воспринимайте их как вызов.
Ответ написан
@chaetal
разработчик ПО и преподаватель
Попробуйте попрограммировать на Smalltalk. Не пишу "изучить" — изучать Smalltalk лучше на практике, желательно на более-менее реальном проекте.
На сегодняшний, пожалуй, самая "продвинутая" реализация — Pharo

Первые вопросы можно задать в Russian Smalltalk User Group
Ответ написан
trevoga_su
@trevoga_su
книга - гради буча
по факту изучения - посмотри на реальный мир. все является объектом. один объект можно засунуть в другой, связать их как-то, существуют интерфейсы для взаимодействия объектов
все элементарно
Ответ написан
@Skit25
на всё воля Бога
Читай книги по теме.
Ответ написан
@T86
База
GRASP Крэг Ларман - Применение UML 2.0 и шаблонов проектирования. 3-е издание
Бретт Маклафлин - Объектно-ориентированный анализ и проектирование
SOLID в PHP https://www.youtube.com/playlist?list=PLoonZ8wII66...
Мартин Фаулер - Рефакторинг. Улучшение существующего кода
Р. Мартин - Чистый код. Создание, анализ и рефакторинг - 2013
Стив Макконнелл - Совершенный код, 2-е издание

Продвинутый
GoF Эрих Гамма, Ричард Хелм - Приемы объектно-ориентированного проектирования. Паттерны проектирования
Martin Fowler - Patterns of Enterprise Application Architecture
Андрей Бибичев - Domain-Driven Design
Карлос Буэнос-Винос - Domain-Driven Design in PHP – 2016
Руководство Microsoft по проектированию архитектуры приложения
Вон Вернон - Реализация методов предметно-ориентированного проектирования
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы