Термин « состояние » может быть использовано в различных смыслах, которые не могут быть даже все восприимчивы точного определения. Поэтому важно , чтобы вы включили определение в своей работе, чтобы сделать совсем понятно , как вы использовали этот термин. Далее я не предлагаю уникального определения состояния объекта, а скорее пытаюсь наметить несколько способов размышления о нем, которые могут быть уместны в разных контекстах.
Однако сначала вам нужно подумать о том, что вы подразумеваете под « объектом »: думаете ли вы о концептуальном объекте, то есть о некоторой сущности, которую вы пытаетесь смоделировать, или об экземпляре класса в конкретной программе; возможно, вы также хотите подумать о состоянии переменной, которая в разное время может относиться к разным объектам или к системе, возможно, при доступе через определенный пользовательский интерфейс.
Отчасти трудность определения состояния объекта в ООП заключается в том, что когда мы моделируем объекты на определенном языке, этот язык часто не позволяет нам отличать атрибуты объекта, которые концептуально являются частью одного и того же объекта, от других, которые этого не делают. Например, связанный список Car
будет состоять из нескольких Link
-объектов, которые содержат указатели на следующий (и, возможно, предыдущий), Link
хотя концептуально список представляет собой один объект; ссылки также могут быть встроены вCar
-объекты или содержат указатели на них, но в этом случае связанные объекты концептуально отделены, а не являются частью списка; однако в списке последних изменений изменения могут присутствовать только в списке и рассматриваться как его часть. В этих различных случаях мы должны решить, считаем ли мы состояние одного объекта включающим состояние связанных объектов. Кроме того, a Car
может иметь ссылку на Registering_Authority
- мы, вероятно, не считаем, что состояние автомобиля меняется, когда его регистрирующий орган изменяет URL своего веб-сайта. Если язык реализации не позволяет нам различать разные типы ссылок, будет невозможно дать общее определение состояния объекта в терминах только языка.
« Внешнее » или « функциональное » состояние может быть определено как «как оно себя ведет», например, как он реагирует на вызовы методов или пользовательский интерфейс. Для объекта как экземпляра класса это определение зависит от типа, к которому объект относится как к объекту: рассматривается как Circle
цветColoured_Circle
не виден и, следовательно, не имеет отношения к его состоянию. Сложность заключается в том, что «как он реагирует» может потребоваться определить в терминах возвращаемых значений, а эти «значения» могут быть состояниями других объектов. Один из способов формализовать это - сказать, что два состояния объекта одинаковы, если все возможные будущие исполнения некоторой системы, в которую он встроен, приводят к одинаковому отображению входов в эту систему и выходов из него. Эта окружающая система может требоваться быть автономной системой, способной к выполнению независимо от ее среды; с другой стороны, можно позволить ему быть таким же маленьким, как и сам объект. В любом случае, математический подход заключается в том, чтобы определить состояние как класс эквивалентности
« Внутреннее » состояние может быть определено как состояние представления. Первая попытка явно круговая, но, возможно, полезная: «Внутреннее состояние объекта - это состояние его членов». Здесь мы должны позаботиться о том, чтобы отличить существенные аспекты представления от незначительных: на самом низком уровне представление объекта может вполне включать в себя адреса других объектов, но вряд ли будет полезно рассмотреть изменение такого адреса как изменение в состоянии. С другой стороны, изменение состояния кэша для результата запроса, хотя оно и не влияет на функциональное состояние (как описано выше), будет важным при рассмотрении тестов производительности.