Хе хе, крутая тема, вставлю своё ИМХО для этого.
ООП это такая крутая штука стоящая на трех столпах ( Полиморфизм, Инкапсуляция и Наследования) всем оно известно и думаю на практике тоже. А вот дальше после теории наступает тихий ужас, первое прочитать прочитали, а как применять, и начинают лепить кучу огромную кучу лапшекода, изучив пару паттернов, при использовании они становятся Молотками Маслоу ( золотыми молотками см
вики )
После я бы посоветовал изучить значение аббревиатур SOLID DRY KISS GRASP всё есть в вики.
Понимание их приведет как раз вас к clean code , то есть чистому и качественному коду.
Как пример, у класса должна быть только одна ответственность, например Если это модель данных, в которой описана работа автомобиля, то он не должен знать как он хранится в бд, абсолютно никак, для получения и записи в бд у нас отдельный механизм(сервис)
и после этого вы сможете придти уже к самому верху мастерства DDD (domain driven design)
постигнув его, вы уже не будете задавать вопросы что такое ООП и что такое взаимодействие внутри классов, и как отделять бизнес логику от логики инфраструктуры