Я читал введение Oracle в концепции ООП и наткнулся на это описание:
Реальные объекты имеют две общие характеристики: все они имеют состояние и поведение. Собаки имеют состояние (имя, окрас, порода, голодные) и поведение (лай, извлечение, вилять хвостом). Программные объекты концептуально похожи на объекты реального мира: они тоже состоят из состояния и связанного поведения.
Моя проблема с этим отрывком в том, что при описании состояния его атрибуты миксов тоже там. Например, имя и цвет собаки - это ее атрибуты, в то время как она голодна или голодна - это ее состояние.
Так что, на мой взгляд, точнее разбить характеристики объектов на три части: атрибуты, состояния и поведение .
Конечно, при переводе этого на язык программирования я вижу, что тройное разделение становится двойным, потому что и атрибуты, и состояния будут храниться в полях / переменных, а поведение - в методах / функциях.
Но с концептуальной точки зрения имеет смысл разделить эти 3 вещи.
Вот еще один пример: рассмотрим лампу. Сказать, что как размер лампы, так и то, включена она или нет, являются состояниями, на мой взгляд, натянуто. Размер лампы является атрибутом, а не состоянием, а включение или выключение - состоянием.
Или я что-то пропустил?
источник
Ответы:
Вы правы в том, что объекты состоят из атрибутов, состояний и поведения, если вы определяете атрибуты, чтобы обозначать неизменяющиеся характеристики экземпляра. На самом деле, важно проводить это различие, потому что существуют объекты, которые содержат только атрибуты (в вашем смысле) и никакого состояния; они называются неизменяемыми и очень полезны при программировании.
Это трехчастное определение действительно представлено в языках программирования, например, с использованием
final
ключевого слова в Java илиreadonly
ключевого слова в C # для обозначения данных экземпляра, которые могут не изменяться в течение всего времени существования экземпляра.Однако я должен добавить, что неизменяемые данные экземпляра обычно не называются атрибутами. Мы склонны говорить о них как о «окончательных», «только для чтения» или «постоянных данных» в зависимости от того, какой язык мы используем. Подходящим термином для них будут «инварианты», но тогда это слово не часто используется в этом смысле; это чаще используется для других вещей.
источник
Я думаю, что более правильно сказать, что объекты имеют только две характеристики. Принимая пример Oracle:
Тот факт, что значения (состояние) для имени, цвета, породы и голодных хранятся в объекте в атрибутах, является деталью реализации. Вам не нужны атрибуты вообще.
Если вы собираетесь включить атрибуты в качестве третьей характеристики, то вам также необходимо включить методы в качестве четвертой, поскольку поведение объектов (например, состояние) также может изменяться. Состояние и поведение - две абстрактные характеристики объектов. Атрибуты и методы являются конкретными реализациями этих концепций.
источник
State - это набор атрибутов и соответствующих значений, поэтому, с моей точки зрения, вы не правы (и вы создаете ненужную дополнительную сложность для простого определения).
источник
Мы можем классифицировать вещи бесчисленными способами, и у каждой классификации не будет «правильного ответа». Классификация вещей выгодна только в том случае, если классификация ведет к более глубокому пониманию или улучшению коммуникации. Если ваша команда предпочитает использовать термины атрибуты, состояния и функции и имеет хорошие рабочие определения для них, это поможет улучшить внутреннее общение, но вы должны проявлять гибкость при общении вне этой группы.
Понятия «голодный» и «испытывающий жажду» могут быть получены из базовых атрибутов (например, уровень глюкозы в крови, уровень гидратации), поэтому мы можем думать о состоянии как о мета-атрибуте, который получается из базовых атрибутов, которые мы можем циклически преобразовать в True или False на основе состояние соответствующих базовых атрибутов. Для света , например, мы могли бы думать о свете , как имеющие атрибуты
applied_voltage
иresistance
и функцииvoltage_switch()
иshine()
.voltage_swich()
Является функцией некоторого входного сигнала (например , ручной переключатель, свет, таймер и т.д.) иshine()
является функциейapplied_voltage
иresistance
. Мы могли бы объявить метаатрибут под названием «light_state
Истина» или «Ложь», чтобы помочь мысленно построить объект, но в конце концов все эти идеи являются просто мысленными конструкциями, которые мы используем для организации нашей работы.источник
Состояние объекта кодируется в его атрибутах, прямо или косвенно. Например, если вы хотите, чтобы ваша собака испытывала жажду, вы можете дать ей
Кроме того, вы можете дать ему что-то вроде
и определите, жаждет ли ваш экземпляр собаки, сравнивая текущее время со временем, когда он в последний раз что-то пил.
В любом случае, состояние ваших объектов находится в пределах его атрибутов.
Тогда есть классы, которые не имеют атрибутов, в основном служебные классы. Но вы обычно не хотите создавать их экземпляр в этом случае.
Для того, чтобы рассуждать о высказываниях, ученые обычно придерживаются принципа минимальности. Я думаю, что именно поэтому Oracle не упомянул о состоянии явно. Это может быть получено из значения атрибутов.
источник
Связи в реальном мире ошибочны. Вот как бы я научил этому (подход c ++):
Так что между состоянием и атрибутом нет ничего особенного. Это просто случайная коллекция битов. Это просто произвольное различие, чтобы отделить их. Просто нужно знать, для чего это псевдоним.
источник