Bermuda
вы не высказали аргумента "за", но опять - опровергаете услышанные.
Классы проекция реальной жизни на программирование.
Если коротко - это не так. Да, можно проводить какие-то аналогии, можно даже найти какие-то соответствия в реальном мире таким паттернам, как Singleton, Strategy, Visitor, но при пристальном рассмотрении к ним так же легко придраться, как и придумать. Ключевые понятия ООП - инкапсуляция и полиморфизм, однако в реальности мы всегда знаем, кто перед нами - кот или медведь, даже если нам это и безразлично. Но главное - реальности как таковой не существует, есть лишь наше восприятие неё, и у каждого оно - своё.
Возьмём ваш пример с котами. Раньше меня интересовали только одноцветные коты, а теперь - захотелось коллекционировать и пятнистых. Люди вообще склонны меняться, а уж про их желания и потребности и говорить нечего.
Разумеется, у этих котов появится дополнительный метод - узнать точное распределения пятен и их цвет, но это необходимо лишь при просмотре дополнительной информации о них, в основном же меня интересует только усреднённый цвет, высчитываемый как поверхностный интеграл по всей поверхности кота (если для вас более ценной была бы другая информация - не волнуйтесь, просто у нас с вами разное отношение к реальности). Операция - сами понимаете - затратная, и устанавливать ваше public свойство при загрузке из бд каждого кота (а не все коты достаются, чтобы на них посмотреть, иные - чтобы их накормить и т.д.) - расточительно. Порекомендуете приписывать коту этот усредненный цвет, когда его помещают в бд? Увы, нельзя, раскраска у котов постепенно меняется, особенно у пятнистых, особенно когда они лежат в бд.
И вот - если у котов есть метод getColor() - в переопределенном методе (для класса пятнистых котов) осуществляется lazy loading карты пятнистости, вычисляется результат, кешируется в объекте и отдается. И всё мое предприятие по выращиванию и переработке котов, над развитием которого я трудился без малого 10 лет, работает теперь с пятнистыми котами без малейших изменений.
Класс котов был спроектирован неправильно? Нет, у него был метод getColor(), и объекты создавались Factory. И не только у котов, но и медведей, etc, благо это не требовало никаких усилий. Было бы предусмотрительнее изначально использовать не цвет, а окраску, и представлять её объектом? Увы, мы никогда не знаем, что нам потребуется завтра. Можно, отправляясь в поездку, набирать 10 чемоданов вещей, на случай, если что-то порвётся или погода не оправдает наших ожиданий (но ведь вы сами не будете этого делать, как не будете представлять все элементарные типы объектами). А можно захватить с собой немного лишних денег, чтобы в случае чего - чего-нибудь прикупить...
;-)